Author: zothar
Date: 2006-06-18 23:48:21 +0000 (Sun, 18 Jun 2006)
New Revision: 9309
Modified:
trunk/freenet/src/freenet/node/CHKInsertSender.java
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/RequestSender.java
trunk/freenet/src/freenet/node/SSKInsertSender.java
Log:
Refactor code surrounding insertSenders, requestSenders and
transferringRequestSenders a little to reduce locking on Node and reduce code
duplication.
Modified: trunk/freenet/src/freenet/node/CHKInsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/CHKInsertSender.java 2006-06-18 23:32:04 UTC
(rev 9308)
+++ trunk/freenet/src/freenet/node/CHKInsertSender.java 2006-06-18 23:48:21 UTC
(rev 9309)
@@ -189,6 +189,7 @@
public void run() {
short origHTL = htl;
+ node.addInsertSender(myKey, htl, this);
try {
realRun();
} catch (Throwable t) {
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2006-06-18 23:32:04 UTC (rev
9308)
+++ trunk/freenet/src/freenet/node/Node.java 2006-06-18 23:48:21 UTC (rev
9309)
@@ -2272,7 +2272,10 @@
Logger.minor(this, "Not in store locally");
// Transfer coalescing - match key only as HTL irrelevant
- RequestSender sender = (RequestSender)
transferringRequestSenders.get(key);
+ RequestSender sender = null;
+ synchronized(transferringRequestSenders) {
+ sender = (RequestSender)
transferringRequestSenders.get(key);
+ }
if(sender != null) {
Logger.minor(this, "Data already being transferred:
"+sender);
return sender;
@@ -2325,21 +2328,46 @@
}
/**
- * Add a RequestSender to our HashSet.
+ * Add a RequestSender to our HashMap.
*/
- public synchronized void addSender(Key key, short htl, RequestSender
sender) {
- KeyHTLPair kh = new KeyHTLPair(key, htl);
- requestSenders.put(kh, sender);
+ public void addRequestSender(Key key, short htl, RequestSender sender) {
+ synchronized(requestSenders) {
+ KeyHTLPair kh = new KeyHTLPair(key, htl);
+ if(requestSenders.containsKey(kh)) {
+ RequestSender rs = (RequestSender)
requestSenders.get(kh);
+ Logger.error(this, "addRequestSender():
KeyHTLPair '"+kh+"' already in requestSenders as "+rs+" and you want to add
"+sender);
+ return;
+ }
+ requestSenders.put(kh, sender);
+ }
}
/**
- * Add a transferring RequestSender.
+ * Add a AnyInsertSender to our HashMap.
*/
- public synchronized void addTransferringSender(NodeCHK key,
RequestSender sender) {
- transferringRequestSenders.put(key, sender);
+ public void addInsertSender(Key key, short htl, AnyInsertSender sender)
{
+ synchronized(insertSenders) {
+ KeyHTLPair kh = new KeyHTLPair(key, htl);
+ if(insertSenders.containsKey(kh)) {
+ AnyInsertSender is = (AnyInsertSender)
insertSenders.get(kh);
+ Logger.error(this, "addInsertSender():
KeyHTLPair '"+kh+"' already in insertSenders as "+is+" and you want to add
"+sender);
+ return;
+ }
+ insertSenders.put(kh, sender);
+ }
}
+ /**
+ * Add a transferring RequestSender to our HashMap.
+ */
+ public void addTransferringSender(NodeCHK key, RequestSender sender) {
+ synchronized(transferringRequestSenders) {
+ transferringRequestSenders.put(key, sender);
+ }
+ }
+
public synchronized SSKBlock fetch(NodeSSK key) {
+ // Can we just lock on sskDatastore here? **FIXME**
try {
return sskDatastore.fetch(key, false);
} catch (IOException e) {
@@ -2349,6 +2377,7 @@
}
public synchronized CHKBlock fetch(NodeCHK key) {
+ // Can we just lock on chkDatastore here? **FIXME**
try {
return chkDatastore.fetch(key, false);
} catch (IOException e) {
@@ -2361,6 +2390,7 @@
* Store a datum.
*/
public synchronized void store(CHKBlock block) {
+ // Can we just lock on chkDatastore here? **FIXME**
try {
chkDatastore.put(block);
} catch (IOException e) {
@@ -2380,21 +2410,25 @@
/**
* Remove a sender from the set of currently transferring senders.
*/
- public synchronized void removeTransferringSender(NodeCHK key,
RequestSender sender) {
- RequestSender rs = (RequestSender)
transferringRequestSenders.remove(key);
- if(rs != sender) {
- Logger.error(this, "Removed "+rs+" should be "+sender+"
for "+key+" in removeTransferringSender");
+ public void removeTransferringSender(NodeCHK key, RequestSender sender)
{
+ synchronized(transferringRequestSenders) {
+ RequestSender rs = (RequestSender)
transferringRequestSenders.remove(key);
+ if(rs != sender) {
+ Logger.error(this, "Removed "+rs+" should be
"+sender+" for "+key+" in removeTransferringSender");
+ }
}
}
/**
* Remove a RequestSender from the map.
*/
- public synchronized void removeSender(Key key, short htl, RequestSender
sender) {
- KeyHTLPair kh = new KeyHTLPair(key, htl);
- RequestSender rs = (RequestSender) requestSenders.remove(kh);
- if(rs != sender) {
- Logger.error(this, "Removed "+rs+" should be "+sender+"
for "+key+","+htl+" in removeSender");
+ public void removeRequestSender(Key key, short htl, RequestSender
sender) {
+ synchronized(requestSenders) {
+ KeyHTLPair kh = new KeyHTLPair(key, htl);
+ RequestSender rs = (RequestSender)
requestSenders.remove(kh);
+ if(rs != sender) {
+ Logger.error(this, "Removed "+rs+" should be
"+sender+" for "+key+","+htl+" in removeRequestSender");
+ }
}
}
@@ -2402,10 +2436,12 @@
* Remove an CHKInsertSender from the map.
*/
public void removeInsertSender(Key key, short htl, AnyInsertSender
sender) {
- KeyHTLPair kh = new KeyHTLPair(key, htl);
- AnyInsertSender is = (AnyInsertSender) insertSenders.remove(kh);
- if(is != sender) {
- Logger.error(this, "Removed "+is+" should be "+sender+"
for "+key+","+htl+" in removeInsertSender");
+ synchronized(insertSenders) {
+ KeyHTLPair kh = new KeyHTLPair(key, htl);
+ AnyInsertSender is = (AnyInsertSender)
insertSenders.remove(kh);
+ if(is != sender) {
+ Logger.error(this, "Removed "+is+" should be
"+sender+" for "+key+","+htl+" in removeInsertSender");
+ }
}
}
@@ -2449,16 +2485,19 @@
byte[] headers, PartiallyReceivedBlock prb, boolean
fromStore, double closestLoc, boolean cache) {
Logger.minor(this,
"makeInsertSender("+key+","+htl+","+uid+","+source+",...,"+fromStore);
KeyHTLPair kh = new KeyHTLPair(key, htl);
- CHKInsertSender is = (CHKInsertSender) insertSenders.get(kh);
+ CHKInsertSender is = null;
+ synchronized(insertSenders) {
+ is = (CHKInsertSender) insertSenders.get(kh);
+ }
if(is != null) {
Logger.minor(this, "Found "+is+" for "+kh);
return is;
}
- if(fromStore && !cache)
+ if(fromStore && !cache)
throw new IllegalArgumentException("From store = true
but cache = false !!!");
is = new CHKInsertSender(key, uid, headers, htl, source, this,
prb, fromStore, closestLoc);
Logger.minor(this, is.toString()+" for "+kh.toString());
- insertSenders.put(kh, is);
+ // CHKInsertSender adds itself to insertSenders
return is;
}
@@ -2482,7 +2521,10 @@
cacheKey(key.getPubKeyHash(), key.getPubKey());
Logger.minor(this,
"makeInsertSender("+key+","+htl+","+uid+","+source+",...,"+fromStore);
KeyHTLPair kh = new KeyHTLPair(key, htl);
- SSKInsertSender is = (SSKInsertSender) insertSenders.get(kh);
+ SSKInsertSender is = null;
+ synchronized(insertSenders) {
+ is = (SSKInsertSender) insertSenders.get(kh);
+ }
if(is != null) {
Logger.minor(this, "Found "+is+" for "+kh);
return is;
@@ -2491,7 +2533,7 @@
throw new IllegalArgumentException("From store = true
but cache = false !!!");
is = new SSKInsertSender(block, uid, htl, source, this,
fromStore, closestLoc);
Logger.minor(this, is.toString()+" for "+kh.toString());
- insertSenders.put(kh, is);
+ // SSKInsertSender adds itself to insertSenders
return is;
}
@@ -2525,24 +2567,26 @@
else
sb.append("No peers yet");
sb.append("\nInserts: ");
- int x = insertSenders.size();
- sb.append(x);
- if(x < 5 && x > 0) {
- sb.append('\n');
- // Dump
- Iterator i = insertSenders.values().iterator();
- while(i.hasNext()) {
- AnyInsertSender s = (AnyInsertSender) i.next();
- sb.append(s.getUID());
- sb.append(": ");
- sb.append(s.getStatusString());
+ synchronized(insertSenders) {
+ int x = getNumInserts();
+ sb.append(x);
+ if(x < 5 && x > 0) {
sb.append('\n');
+ // Dump
+ Iterator i = insertSenders.values().iterator();
+ while(i.hasNext()) {
+ AnyInsertSender s = (AnyInsertSender)
i.next();
+ sb.append(s.getUID());
+ sb.append(": ");
+ sb.append(s.getStatusString());
+ sb.append('\n');
+ }
}
}
sb.append("\nRequests: ");
- sb.append(requestSenders.size());
+ sb.append(getNumRequests());
sb.append("\nTransferring requests: ");
- sb.append(this.transferringRequestSenders.size());
+ sb.append(getNumTransferringRequests());
sb.append('\n');
return sb.toString();
}
@@ -2560,15 +2604,21 @@
}
public int getNumInserts() {
- return insertSenders.size();
+ synchronized(insertSenders) {
+ return insertSenders.size();
+ }
}
public int getNumRequests() {
- return requestSenders.size();
+ synchronized(requestSenders) {
+ return requestSenders.size();
+ }
}
public int getNumTransferringRequests() {
- return transferringRequestSenders.size();
+ synchronized(transferringRequestSenders) {
+ return transferringRequestSenders.size();
+ }
}
/**
@@ -2577,13 +2627,13 @@
public String getFreevizOutput() {
StringBuffer sb = new StringBuffer();
sb.append("\nrequests=");
- sb.append(requestSenders.size());
+ sb.append(getNumRequests());
sb.append("\ntransferring_requests=");
- sb.append(this.transferringRequestSenders.size());
+ sb.append(getNumTransferringRequests());
sb.append("\ninserts=");
- sb.append(this.insertSenders.size());
+ sb.append(getNumInserts());
sb.append("\n");
@@ -2811,7 +2861,7 @@
public void exit(){
this.park();
- System.out.println("Goodbye. from "+this);
+ System.out.println("Goodbye. from "+this);
System.exit(0);
}
Modified: trunk/freenet/src/freenet/node/RequestSender.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestSender.java 2006-06-18 23:32:04 UTC
(rev 9308)
+++ trunk/freenet/src/freenet/node/RequestSender.java 2006-06-18 23:48:21 UTC
(rev 9309)
@@ -99,7 +99,7 @@
public void run() {
short origHTL = htl;
- node.addSender(key, htl, this);
+ node.addRequestSender(key, htl, this);
HashSet nodesRoutedTo = new HashSet();
HashSet nodesNotIgnored = new HashSet();
try {
@@ -391,7 +391,7 @@
} finally {
Logger.minor(this, "Leaving RequestSender.run() for "+uid);
node.completed(uid);
- node.removeSender(key, origHTL, this);
+ node.removeRequestSender(key, origHTL, this);
}
}
Modified: trunk/freenet/src/freenet/node/SSKInsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/SSKInsertSender.java 2006-06-18 23:32:04 UTC
(rev 9308)
+++ trunk/freenet/src/freenet/node/SSKInsertSender.java 2006-06-18 23:48:21 UTC
(rev 9309)
@@ -103,7 +103,7 @@
public void run() {
short origHTL = htl;
-
+ node.addInsertSender(myKey, htl, this);
try {
realRun();
} catch (Throwable t) {