Author: toad
Date: 2007-10-24 18:58:38 +0000 (Wed, 24 Oct 2007)
New Revision: 15549
Modified:
trunk/freenet/src/freenet/node/OpennetManager.java
trunk/freenet/src/freenet/node/RequestHandler.java
trunk/freenet/src/freenet/node/RequestSender.java
Log:
Factor out sending of opennet noderef messages into OpennetManager.
Some minor related refactoring.
Modified: trunk/freenet/src/freenet/node/OpennetManager.java
===================================================================
--- trunk/freenet/src/freenet/node/OpennetManager.java 2007-10-24 18:30:32 UTC
(rev 15548)
+++ trunk/freenet/src/freenet/node/OpennetManager.java 2007-10-24 18:58:38 UTC
(rev 15549)
@@ -15,11 +15,16 @@
import java.util.Comparator;
import java.util.Vector;
+import freenet.io.comm.ByteCounter;
+import freenet.io.comm.DMT;
+import freenet.io.comm.Message;
+import freenet.io.comm.NotConnectedException;
import freenet.io.comm.Peer;
import freenet.io.comm.PeerParseException;
import freenet.io.comm.ReferenceSignatureVerificationException;
import freenet.support.LRUQueue;
import freenet.support.Logger;
+import freenet.support.ShortBuffer;
import freenet.support.SimpleFieldSet;
import freenet.support.transport.ip.HostnameSyntaxException;
@@ -448,4 +453,19 @@
return MAX_PEERS - node.peers.countConnectedDarknetPeers();
}
+ /**
+ * Send our opennet noderef to a node.
+ * @param isReply If true, send an FNPOpennetConnectReply, else send an
FNPOpennetConnectDestination.
+ * @param uid The unique ID of the request chain involved.
+ * @param peer The node to send the noderef to.
+ * @param cs The full compressed noderef to send.
+ * @throws NotConnectedException If the peer becomes disconnected while
we are trying to send the noderef.
+ */
+ public void sendOpennetRef(boolean isReply, long uid, PeerNode peer,
byte[] noderef, ByteCounter ctr) throws NotConnectedException {
+ ShortBuffer buf = new ShortBuffer(noderef);
+ Message msg = isReply ? DMT.createFNPOpennetConnectReply(uid,
buf) :
+ DMT.createFNPOpennetConnectDestination(uid, buf);
+ peer.sendAsync(msg, null, 0, ctr);
+ }
+
}
Modified: trunk/freenet/src/freenet/node/RequestHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestHandler.java 2007-10-24 18:30:32 UTC
(rev 15548)
+++ trunk/freenet/src/freenet/node/RequestHandler.java 2007-10-24 18:58:38 UTC
(rev 15549)
@@ -151,7 +151,7 @@
// We've fetched it from our datastore, so there won't
be a downstream noderef.
// But we want to send at least an
FNPOpennetCompletedAck, otherwise the request source
// may have to timeout waiting for one.
- finishOpennetNoRelayInner();
+ finishOpennetNoRelay();
}
}
return;
@@ -278,30 +278,56 @@
finishOpennetInner();
}
+ private void finishOpennetNoRelay() {
+ OpennetManager om = node.getOpennet();
+
+ if(om == null) {
+ Message msg = DMT.createFNPOpennetCompletedAck(uid);
+ try {
+ source.sendAsync(msg, null, 0, this);
+ } catch (NotConnectedException e) {
+ // Oh well...
+ }
+ return;
+ }
+
+ finishOpennetNoRelayInner(om);
+ }
+
private void finishOpennetInner() {
+ OpennetManager om = node.getOpennet();
+
+ if(om == null) {
+ Message msg = DMT.createFNPOpennetCompletedAck(uid);
+ try {
+ source.sendAsync(msg, null, 0, this);
+ } catch (NotConnectedException e) {
+ // Oh well...
+ }
+ return;
+ }
+
byte[] noderef = rs.waitForOpennetNoderef();
if(noderef == null) {
- finishOpennetNoRelayInner();
+ finishOpennetNoRelayInner(om);
return;
}
if(node.random.nextInt(OpennetManager.RESET_PATH_FOLDING_PROB)
== 0) {
- finishOpennetNoRelayInner();
+ finishOpennetNoRelayInner(om);
return;
}
- finishOpennetRelay(noderef);
+ finishOpennetRelay(noderef, om);
}
- private void finishOpennetNoRelayInner() {
+ private void finishOpennetNoRelayInner(OpennetManager om) {
if(logMINOR)
Logger.minor(this, "Finishing opennet: sending own reference");
- OpennetManager om = node.getOpennet();
- if(om != null && (source.isOpennet() ||
node.passOpennetRefsThroughDarknet())) {
if(om.wantPeer(null, false)) {
- Message msg =
DMT.createFNPOpennetConnectDestination(uid, new
ShortBuffer(om.crypto.myCompressedFullRef()));
+
try {
- source.sendAsync(msg, null, 0, this);
+ om.sendOpennetRef(false, uid, source,
om.crypto.myCompressedFullRef(), this);
} catch (NotConnectedException e) {
Logger.normal(this, "Can't send opennet
ref because node disconnected on "+this);
// Oh well...
@@ -311,6 +337,7 @@
// Wait for response
MessageFilter mf =
MessageFilter.create().setSource(source).setField(DMT.UID,
uid).setTimeout(RequestSender.OPENNET_TIMEOUT).setType(DMT.FNPOpennetConnectReply);
+ Message msg;
try {
msg = node.usm.waitFor(mf, this);
@@ -350,25 +377,16 @@
}
return;
}
- }
- Message msg = DMT.createFNPOpennetCompletedAck(uid);
- try {
- source.sendAsync(msg, null, 0, this);
- } catch (NotConnectedException e) {
- // Oh well...
- }
}
- private void finishOpennetRelay(byte[] noderef) {
+ private void finishOpennetRelay(byte[] noderef, OpennetManager om) {
if(logMINOR)
Logger.minor(this, "Finishing opennet: relaying reference from
"+rs.successFrom());
// Send it back to the handler, then wait for the ConnectReply
PeerNode dataSource = rs.successFrom();
- Message msg = DMT.createFNPOpennetConnectDestination(uid, new
ShortBuffer(noderef));
-
try {
- source.sendAsync(msg, null, 0, this);
+ om.sendOpennetRef(false, uid, source,
om.crypto.myCompressedFullRef(), this);
} catch (NotConnectedException e) {
// Lost contact with request source, nothing we can do
return;
@@ -377,7 +395,8 @@
// Now wait for reply from the request source
MessageFilter mf =
MessageFilter.create().setSource(source).setField(DMT.UID,
uid).setTimeout(RequestSender.OPENNET_TIMEOUT).setType(DMT.FNPOpennetConnectReply);
-
+
+ Message msg;
try {
msg = node.usm.waitFor(mf, this);
} catch (DisconnectedException e) {
@@ -393,13 +412,16 @@
try {
SimpleFieldSet fs =
PeerNode.compressedNoderefToFieldSet(noderef, 0, noderef.length);
- if(!fs.getBoolean("opennet", false)) {
- msg = DMT.createFNPOpennetCompletedAck(uid);
- } else {
- msg = DMT.createFNPOpennetConnectReply(uid, new
ShortBuffer(noderef));
+ if(fs.getBoolean("opennet", false)) {
+ try {
+ om.sendOpennetRef(true, uid,
dataSource, noderef, this);
+ } catch (NotConnectedException e) {
+ // How sad
+ return;
+ }
}
} catch (FSParseException e1) {
- msg = DMT.createFNPOpennetCompletedAck(uid);
+ // Invalid, clear it
}
try {
Modified: trunk/freenet/src/freenet/node/RequestSender.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestSender.java 2007-10-24 18:30:32 UTC
(rev 15548)
+++ trunk/freenet/src/freenet/node/RequestSender.java 2007-10-24 18:58:38 UTC
(rev 15549)
@@ -730,10 +730,8 @@
// Send our reference
- Message msg = DMT.createFNPOpennetConnectReply(uid, new ShortBuffer(
om.crypto.myCompressedFullRef()));
-
try {
- next.sendAsync(msg, null, 0, this);
+ om.sendOpennetRef(true, uid, source,
om.crypto.myCompressedFullRef(), this);
} catch (NotConnectedException e) {
// Hmmm... let the LRU deal with it
if(logMINOR)