I2P Address: [http://git.idk.i2p]

Skip to content
Snippets Groups Projects
Commit 44446d76 authored by zzz's avatar zzz
Browse files

convert db to concurrent

parent a616a5f1
No related branches found
No related tags found
No related merge requests found
......@@ -9,6 +9,7 @@ package net.i2p.router.networkdb.kademlia;
*/
import java.util.Date;
import java.util.concurrent.ConcurrentHashMap;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
......@@ -25,49 +26,38 @@ import net.i2p.util.Log;
class TransientDataStore implements DataStore {
private Log _log;
private Map _data; // hash --> DataStructure
private Map<Hash, DataStructure> _data;
protected RouterContext _context;
public TransientDataStore(RouterContext ctx) {
_context = ctx;
_log = ctx.logManager().getLog(TransientDataStore.class);
_data = new HashMap(1024);
_data = new ConcurrentHashMap(1024);
if (_log.shouldLog(Log.INFO))
_log.info("Data Store initialized");
}
public void restart() {
synchronized (_data) {
_data.clear();
}
_data.clear();
}
public Set getKeys() {
synchronized (_data) {
return new HashSet(_data.keySet());
}
return new HashSet(_data.keySet());
}
public DataStructure get(Hash key) {
synchronized (_data) {
return (DataStructure)_data.get(key);
}
return _data.get(key);
}
public boolean isKnown(Hash key) {
synchronized (_data) {
return _data.containsKey(key);
}
return _data.containsKey(key);
}
public int countLeaseSets() {
int count = 0;
synchronized (_data) {
for (Iterator iter = _data.values().iterator(); iter.hasNext();) {
DataStructure data = (DataStructure)iter.next();
if (data instanceof LeaseSet)
count++;
}
for (DataStructure d : _data.values()) {
if (d instanceof LeaseSet)
count++;
}
return count;
}
......@@ -81,10 +71,8 @@ class TransientDataStore implements DataStore {
if (data == null) return;
if (_log.shouldLog(Log.DEBUG))
_log.debug("Storing key " + key);
Object old = null;
synchronized (_data) {
old = _data.put(key, data);
}
DataStructure old = null;
old = _data.put(key, data);
if (data instanceof RouterInfo) {
_context.profileManager().heardAbout(key);
RouterInfo ri = (RouterInfo)data;
......@@ -95,17 +83,13 @@ class TransientDataStore implements DataStore {
_log.info("Almost clobbered an old router! " + key + ": [old published on " + new Date(ori.getPublished()) + " new on " + new Date(ri.getPublished()) + "]");
if (_log.shouldLog(Log.DEBUG))
_log.debug("Number of router options for " + key + ": " + ri.getOptions().size() + " (old one had: " + ori.getOptions().size() + ")", new Exception("Updated routerInfo"));
synchronized (_data) {
_data.put(key, old);
}
_data.put(key, old);
} else if (ri.getPublished() > _context.clock().now() + MAX_FUTURE_PUBLISH_DATE) {
if (_log.shouldLog(Log.INFO))
_log.info("Hmm, someone tried to give us something with the publication date really far in the future (" + new Date(ri.getPublished()) + "), dropping it");
if (_log.shouldLog(Log.DEBUG))
_log.debug("Number of router options for " + key + ": " + ri.getOptions().size() + " (old one had: " + ori.getOptions().size() + ")", new Exception("Updated routerInfo"));
synchronized (_data) {
_data.put(key, old);
}
_data.put(key, old);
} else {
if (_log.shouldLog(Log.INFO))
_log.info("Updated the old router for " + key + ": [old published on " + new Date(ori.getPublished()) + " new on " + new Date(ri.getPublished()) + "]");
......@@ -125,15 +109,11 @@ class TransientDataStore implements DataStore {
if (ls.getEarliestLeaseDate() < ols.getEarliestLeaseDate()) {
if (_log.shouldLog(Log.INFO))
_log.info("Almost clobbered an old leaseSet! " + key + ": [old published on " + new Date(ols.getEarliestLeaseDate()) + " new on " + new Date(ls.getEarliestLeaseDate()) + "]");
synchronized (_data) {
_data.put(key, old);
}
_data.put(key, old);
} else if (ls.getEarliestLeaseDate() > _context.clock().now() + MAX_FUTURE_EXPIRATION_DATE) {
if (_log.shouldLog(Log.INFO))
_log.info("Hmm, someone tried to give us something with the expiration date really far in the future (" + new Date(ls.getEarliestLeaseDate()) + "), dropping it");
synchronized (_data) {
_data.put(key, old);
}
_data.put(key, old);
}
}
}
......@@ -150,13 +130,9 @@ class TransientDataStore implements DataStore {
public String toString() {
StringBuffer buf = new StringBuffer();
buf.append("Transient DataStore: ").append(_data.size()).append("\nKeys: ");
Map data = new HashMap();
synchronized (_data) {
data.putAll(_data);
}
for (Iterator iter = data.keySet().iterator(); iter.hasNext();) {
Hash key = (Hash)iter.next();
DataStructure dp = (DataStructure)data.get(key);
for (Map.Entry<Hash, DataStructure> e : _data.entrySet()) {
Hash key = e.getKey();
DataStructure dp = e.getValue();
buf.append("\n\t*Key: ").append(key.toString()).append("\n\tContent: ").append(dp.toString());
}
buf.append("\n");
......@@ -168,10 +144,8 @@ class TransientDataStore implements DataStore {
}
public DataStructure remove(Hash key) {
synchronized (_data) {
if (_log.shouldLog(Log.DEBUG))
_log.debug("Removing key " + key.toBase64());
return (DataStructure)_data.remove(key);
}
if (_log.shouldLog(Log.DEBUG))
_log.debug("Removing key " + key.toBase64());
return _data.remove(key);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment