Author: toad
Date: 2008-03-20 19:15:19 +0000 (Thu, 20 Mar 2008)
New Revision: 18656

Modified:
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/NodeDispatcher.java
   trunk/freenet/src/freenet/node/simulator/RealNodeULPRTest.java
Log:
ULPR test: Hook into the dispatcher and determine which nodes were visited.

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2008-03-20 18:19:26 UTC (rev 
18655)
+++ trunk/freenet/src/freenet/node/Node.java    2008-03-20 19:15:19 UTC (rev 
18656)
@@ -74,6 +74,7 @@
 import freenet.keys.SSKBlock;
 import freenet.keys.SSKVerifyException;
 import freenet.l10n.L10n;
+import freenet.node.NodeDispatcher.NodeDispatcherCallback;
 import freenet.node.updater.NodeUpdateManager;
 import freenet.node.useralerts.AbstractUserAlert;
 import freenet.node.useralerts.BuildOldAgeUserAlert;
@@ -3304,4 +3305,8 @@
                } else return;
                clientCore.alerts.register(alertMTUTooSmall);
        }
+
+       public void setDispatcherHook(NodeDispatcherCallback cb) {
+               this.dispatcher.setHook(cb);
+       }
 }

Modified: trunk/freenet/src/freenet/node/NodeDispatcher.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeDispatcher.java  2008-03-20 18:19:26 UTC 
(rev 18655)
+++ trunk/freenet/src/freenet/node/NodeDispatcher.java  2008-03-20 19:15:19 UTC 
(rev 18656)
@@ -41,6 +41,7 @@
        private static boolean logMINOR;
        final Node node;
        private NodeStats nodeStats;
+       private NodeDispatcherCallback callback;

        private static final long STALE_CONTEXT=20000;
        private static final long STALE_CONTEXT_CHECK=20000;
@@ -68,6 +69,10 @@

        };

+       public interface NodeDispatcherCallback {
+               public void snoop(Message m, Node n);
+       }
+       
        public boolean handleMessage(Message m) {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                PeerNode source = (PeerNode)m.getSource();
@@ -76,6 +81,13 @@
                        return true;
                }
                if(logMINOR) Logger.minor(this, "Dispatching "+m+" from 
"+source);
+               if(callback != null) {
+                       try {
+                               callback.snoop(m, node);
+                       } catch (Throwable t) {
+                               Logger.error(this, "Callback threw "+t, t);
+                       }
+               }
                MessageType spec = m.getSpec();
                if(spec == DMT.FNPPing) {
                        // Send an FNPPong
@@ -785,4 +797,8 @@
                        throw new IllegalArgumentException("Unknown probe 
request type");
                }
        }
+
+       public void setHook(NodeDispatcherCallback cb) {
+               this.callback = cb;
+       }
 }
\ No newline at end of file

Modified: trunk/freenet/src/freenet/node/simulator/RealNodeULPRTest.java
===================================================================
--- trunk/freenet/src/freenet/node/simulator/RealNodeULPRTest.java      
2008-03-20 18:19:26 UTC (rev 18655)
+++ trunk/freenet/src/freenet/node/simulator/RealNodeULPRTest.java      
2008-03-20 19:15:19 UTC (rev 18656)
@@ -7,6 +7,8 @@
 import java.io.IOException;

 import freenet.crypt.DummyRandomSource;
+import freenet.io.comm.DMT;
+import freenet.io.comm.Message;
 import freenet.io.comm.PeerParseException;
 import freenet.io.comm.ReferenceSignatureVerificationException;
 import freenet.keys.CHKEncodeException;
@@ -16,11 +18,13 @@
 import freenet.keys.ClientKeyBlock;
 import freenet.keys.FreenetURI;
 import freenet.keys.InsertableClientSSK;
+import freenet.keys.Key;
 import freenet.keys.SSKEncodeException;
 import freenet.keys.SSKVerifyException;
 import freenet.node.FSParseException;
 import freenet.node.LowLevelGetException;
 import freenet.node.Node;
+import freenet.node.NodeDispatcher.NodeDispatcherCallback;
 import freenet.node.NodeInitException;
 import freenet.node.NodeStarter;
 import freenet.store.KeyCollisionException;
@@ -129,7 +133,9 @@

         for(int totalCount=0;totalCount<NUMBER_OF_TESTS;totalCount++) {

-        boolean isSSK = (totalCount & 0x1) == 1;
+        final boolean isSSK;
+        isSSK = (totalCount & 0x1) == 1;
+        //isSSK = true;

         // Now create a key.

@@ -154,20 +160,46 @@
                insertKey = fetchKey = block.getClientKey();
                testKey = insertKey.getURI();
         }
+        final Key nodeKey = fetchKey.getNodeKey();

         System.err.println();
-        System.err.println("Created random test key "+testKey+" = 
"+fetchKey.getNodeKey());
+        System.err.println("Created random test key "+testKey+" = "+nodeKey);
         System.err.println();
-        Logger.error(RealNodeULPRTest.class, "Starting ULPR test 
#"+successfulTests+": "+testKey+" = "+fetchKey+" = "+fetchKey.getNodeKey());
+        Logger.error(RealNodeULPRTest.class, "Starting ULPR test 
#"+successfulTests+": "+testKey+" = "+fetchKey+" = "+nodeKey);

         waitForAllConnected(nodes);

         // Fetch the key from each node.

+        // Only those nodes which have been asked by another node (not 
directly here) for the key will want it.
+        // Further, only those nodes on the actual DNF path will learn from 
their mistakes: a RejectedLoop doesn't tell you much.
+        
+        // Lets track which nodes have been visited.
+        
+        final boolean[] visited = new boolean[nodes.length];
+        
+        NodeDispatcherCallback cb = new NodeDispatcherCallback() {
+
+                       public void snoop(Message m, Node n) {
+                               if(((!isSSK) && m.getSpec() == 
DMT.FNPCHKDataRequest) ||
+                                               (isSSK && m.getSpec() == 
DMT.FNPSSKDataRequest)) {
+                                       Key key = (Key) 
m.getObject(DMT.FREENET_ROUTING_KEY);
+                                       if(key.equals(nodeKey)) {
+                                               
visited[n.getDarknetPortNumber() - 5000] = true;
+                                       }
+                               }
+                       }
+               
+        };
+        
         for(int i=0;i<nodes.length;i++) {
+               nodes[i].setDispatcherHook(cb);
+        }
+        
+        for(int i=0;i<nodes.length;i++) {
                System.out.println("Searching from node "+i);
                try {
-                       nodes[i].clientCore.realGetKey(fetchKey, false, true, 
false);
+                       nodes[i%nodes.length].clientCore.realGetKey(fetchKey, 
false, true, false);
                        System.err.println("TEST FAILED: KEY ALREADY 
PRESENT!!!"); // impossible!
                        System.exit(EXIT_KEY_EXISTS);
                } catch (LowLevelGetException e) {
@@ -175,10 +207,10 @@
                        case LowLevelGetException.DATA_NOT_FOUND:
                        case LowLevelGetException.ROUTE_NOT_FOUND:
                                // Expected
-                               System.err.println("Node "+i+" : key not found 
(expected behaviour)");
+                               System.err.println("Node "+i%nodes.length+" : 
key not found (expected behaviour)");
                                continue;
                        default:
-                               System.err.println("Node "+i+" : UNEXPECTED 
ERROR: "+e.toString());
+                               System.err.println("Node "+i%nodes.length+" : 
UNEXPECTED ERROR: "+e.toString());
                                
System.exit(EXIT_UNKNOWN_ERROR_CHECKING_KEY_NOT_EXIST);
                        }
                }
@@ -186,6 +218,18 @@

         // Now we should have a good web of subscriptions set up.

+        int visitedCount = 0;
+        StringBuffer sb = new StringBuffer(3*nodes.length+1);
+        boolean first = true;
+        for(int i=0;i<visited.length;i++) {
+               if(!visited[i]) continue;
+               visitedCount++;
+               if(!first) sb.append(' ');
+               first = false;
+               sb.append(i);
+        }
+        System.err.println("Nodes which were asked for the key by another 
node: "+visitedCount+" : "+sb.toString());
+        
         // Store the key to ONE node.

                long tStart = System.currentTimeMillis();


Reply via email to