From a01f9ce9ccfd31641a81d1038a5d5c35f4cb8e01 Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@allmydata.com>
Date: Fri, 1 Feb 2008 19:48:38 -0700
Subject: [PATCH] introducer: allow nodes to refrain from publishing
 themselves, by passing furl=None. This would be useful for clients who do not
 run storage servers.

---
 src/allmydata/interfaces.py           |  2 +-
 src/allmydata/introducer.py           | 16 +++++++++++-----
 src/allmydata/test/test_introducer.py | 11 +++++++++--
 3 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/src/allmydata/interfaces.py b/src/allmydata/interfaces.py
index c65af491..84a3d5e6 100644
--- a/src/allmydata/interfaces.py
+++ b/src/allmydata/interfaces.py
@@ -44,7 +44,7 @@ class RIIntroducerClient(RemoteInterface):
         return None
 
 class RIIntroducer(RemoteInterface):
-    def hello(node=RIIntroducerClient, furl=FURL):
+    def hello(node=RIIntroducerClient, furl=ChoiceOf(FURL, None)):
         return None
 
 class RIClient(RemoteInterface):
diff --git a/src/allmydata/introducer.py b/src/allmydata/introducer.py
index 9feba696..c8e08d25 100644
--- a/src/allmydata/introducer.py
+++ b/src/allmydata/introducer.py
@@ -44,15 +44,17 @@ class IntroducerService(service.MultiService, Referenceable):
         def _remove():
             log.msg(" introducer: removing %s %s" % (node, furl))
             self.nodes.remove(node)
-            self.furls.remove(furl)
+            if furl is not None:
+                self.furls.remove(furl)
         node.notifyOnDisconnect(_remove)
-        self.furls.add(furl)
+        if furl is not None:
+            self.furls.add(furl)
+            for othernode in self.nodes:
+                othernode.callRemote("new_peers", set([furl]))
         node.callRemote("new_peers", self.furls)
         if self._encoding_parameters is not None:
             node.callRemote("set_encoding_parameters",
                             self._encoding_parameters)
-        for othernode in self.nodes:
-            othernode.callRemote("new_peers", set([furl]))
         self.nodes.add(node)
 
 class IntroducerClient(service.Service, Referenceable):
@@ -176,7 +178,11 @@ class IntroducerClient(service.Service, Referenceable):
         self.reconnectors[furl] = self.tub.connectTo(furl, _got_peer)
 
     def _got_introducer(self, introducer):
-        self.log("introducing ourselves: %s, %s" % (self, self.my_furl[6:13]))
+        if self.my_furl:
+            my_furl_s = self.my_furl[6:13]
+        else:
+            my_furl_s = "<none>"
+        self.log("introducing ourselves: %s, %s" % (self, my_furl_s))
         self._connected = True
         d = introducer.callRemote("hello",
                                   node=self,
diff --git a/src/allmydata/test/test_introducer.py b/src/allmydata/test/test_introducer.py
index 0e1831bf..925acd0d 100644
--- a/src/allmydata/test/test_introducer.py
+++ b/src/allmydata/test/test_introducer.py
@@ -89,10 +89,13 @@ class TestIntroducer(unittest.TestCase, testutil.PollMixin):
         i.setServiceParent(self.parent)
         iurl = tub.registerReference(i)
         NUMCLIENTS = 5
+        # we have 5 clients who publish themselves, and an extra one which
+        # does not. When the connections are fully established, all six nodes
+        # should have 5 connections each.
 
         clients = []
         tubs = {}
-        for i in range(NUMCLIENTS):
+        for i in range(NUMCLIENTS+1):
             tub = Tub()
             #tub.setOption("logLocalFailures", True)
             #tub.setOption("logRemoteFailures", True)
@@ -102,7 +105,11 @@ class TestIntroducer(unittest.TestCase, testutil.PollMixin):
             tub.setLocation("localhost:%d" % portnum)
 
             n = FakeNode()
-            node_furl = tub.registerReference(n)
+            log.msg("creating client %d: %s" % (i, tub.getShortTubID()))
+            if i < NUMCLIENTS:
+                node_furl = tub.registerReference(n)
+            else:
+                node_furl = None
             c = IntroducerClient(tub, iurl, node_furl)
 
             c.setServiceParent(self.parent)
-- 
2.45.2