From: Brian Warner Date: Wed, 23 Sep 2015 04:30:03 +0000 (-0700) Subject: Merge branch '2510-new-foolscap' X-Git-Url: https://git.rkrishnan.org/?a=commitdiff_plain;h=1ffc6534bd516bfabab827dd5ed9636649d7b053;hp=759e87b24bec548677e8b36015341472fea0e858;p=tahoe-lafs%2Ftahoe-lafs.git Merge branch '2510-new-foolscap' --- diff --git a/src/allmydata/introducer/common.py b/src/allmydata/introducer/common.py index 9337d4bb..699408ec 100644 --- a/src/allmydata/introducer/common.py +++ b/src/allmydata/introducer/common.py @@ -100,20 +100,18 @@ class SubscriberDescriptor: .nickname: their self-provided nickname, or "?" (unicode) .version: their self-provided version (string) .app_versions: versions of each library they use (dict str->str) - .advertised_addresses: what hosts they listen on (list of strings) .remote_address: the external address from which they connected (string) .tubid: for subscribers connecting with Foolscap, their tubid (string) """ def __init__(self, service_name, when, nickname, version, app_versions, - advertised_addresses, remote_address, tubid): + remote_address, tubid): self.service_name = service_name self.when = when self.nickname = nickname self.version = version self.app_versions = app_versions - self.advertised_addresses = advertised_addresses self.remote_address = remote_address self.tubid = tubid @@ -133,9 +131,9 @@ class AnnouncementDescriptor: .nickname: their self-provided nickname, or "" (unicode) .serverid: the server identifier. This is a pubkey (for V2 clients), or a tubid (for V1 clients). - .advertised_addresses: which hosts they listen on (list of strings) - if the announcement included a key for - 'anonymous-storage-FURL', else an empty list. + .connection_hints: where they listen (list of strings) if the + announcement included a key for + 'anonymous-storage-FURL', else an empty list. """ def __init__(self, when, index, canary, ann_d): @@ -150,6 +148,6 @@ class AnnouncementDescriptor: self.serverid = key_s or tubid_s furl = ann_d.get("anonymous-storage-FURL") if furl: - self.advertised_addresses = rrefutil.hosts_for_furl(furl) + self.connection_hints = rrefutil.connection_hints_for_furl(furl) else: - self.advertised_addresses = [] + self.connection_hints = [] diff --git a/src/allmydata/introducer/old.py b/src/allmydata/introducer/old.py index 702969f0..3c2fcb71 100644 --- a/src/allmydata/introducer/old.py +++ b/src/allmydata/introducer/old.py @@ -405,13 +405,11 @@ class IntroducerService_v1(service.MultiService, Referenceable): for service_name, subscribers in self._subscribers.items(): for rref, when in subscribers.items(): tubid = rref.getRemoteTubID() or "?" - advertised_addresses = rrefutil.hosts_for_rref(rref) remote_address = rrefutil.stringify_remote_address(rref) nickname, version, app_versions = u"?", u"?", {} sd = SubscriberDescriptor(service_name, when, nickname, version, app_versions, - advertised_addresses, remote_address, - tubid) + remote_address, tubid) s.append(sd) return s diff --git a/src/allmydata/introducer/server.py b/src/allmydata/introducer/server.py index 7031c3af..92c2497e 100644 --- a/src/allmydata/introducer/server.py +++ b/src/allmydata/introducer/server.py @@ -175,7 +175,6 @@ class IntroducerService(service.MultiService, Referenceable): # tubid will be None. Also, subscribers do not tell us which # pubkey they use; only publishers do that. tubid = rref.getRemoteTubID() or "?" - advertised_addresses = rrefutil.hosts_for_rref(rref) remote_address = rrefutil.stringify_remote_address(rref) # these three assume subscriber_info["version"]==0, but # should tolerate other versions @@ -188,8 +187,7 @@ class IntroducerService(service.MultiService, Referenceable): # 'when' is the time they subscribed sd = SubscriberDescriptor(service_name, when, nickname, version, app_versions, - advertised_addresses, remote_address, - tubid) + remote_address, tubid) s.append(sd) return s diff --git a/src/allmydata/test/test_introducer.py b/src/allmydata/test/test_introducer.py index 475b04db..be7d05dd 100644 --- a/src/allmydata/test/test_introducer.py +++ b/src/allmydata/test/test_introducer.py @@ -877,8 +877,8 @@ class SystemTest(SystemTestMixin, unittest.TestCase): class FakeRemoteReference: def notifyOnDisconnect(self, *args, **kwargs): pass def getRemoteTubID(self): return "62ubehyunnyhzs7r6vdonnm2hpi52w6y" - def getLocationHints(self): return [("ipv4", "here.example.com", "1234"), - ("ipv4", "there.example.com", "2345")] + def getLocationHints(self): return ["tcp:here.example.com:1234", + "tcp:there.example.com2345"] def getPeer(self): return address.IPv4Address("TCP", "remote.example.com", 3456) diff --git a/src/allmydata/test/test_system.py b/src/allmydata/test/test_system.py index 4ffbb29c..1887c7e2 100644 --- a/src/allmydata/test/test_system.py +++ b/src/allmydata/test/test_system.py @@ -812,8 +812,6 @@ class SystemTest(SystemTestMixin, RunBinTahoeMixin, unittest.TestCase): {"storage": 5}) self.failUnlessEqual(data["announcement_summary"], {"storage": 5}) - self.failUnlessEqual(data["announcement_distinct_hosts"], - {"storage": 1}) except unittest.FailTest: print print "GET %s?t=json output was:" % self.introweb_url diff --git a/src/allmydata/util/rrefutil.py b/src/allmydata/util/rrefutil.py index a14d15f1..6481cabc 100644 --- a/src/allmydata/util/rrefutil.py +++ b/src/allmydata/util/rrefutil.py @@ -27,30 +27,18 @@ def trap_deadref(f): return trap_and_discard(f, DeadReferenceError) -def hosts_for_rref(rref, ignore_localhost=True): - # actually, this only returns hostnames - advertised = [] - for hint in rref.getLocationHints(): - # Foolscap-0.2.5 and earlier used strings in .locationHints, but we - # require a newer version that uses tuples of ("ipv4", host, port) - assert not isinstance(hint, str), hint - if hint[0] == "ipv4": - host = hint[1] - if ignore_localhost and host == "127.0.0.1": - continue - advertised.append(host) - return advertised - -def hosts_for_furl(furl, ignore_localhost=True): - advertised = [] - for hint in SturdyRef(furl).locationHints: - assert not isinstance(hint, str), hint - if hint[0] == "ipv4": - host = hint[1] - if ignore_localhost and host == "127.0.0.1": - continue - advertised.append(host) - return advertised +def connection_hints_for_furl(furl): + hints = [] + for h in SturdyRef(furl).locationHints: + # Foolscap-0.2.5 and earlier used strings in .locationHints, 0.2.6 + # through 0.6.4 used tuples of ("ipv4",host,port), 0.6.5 through + # 0.8.0 used tuples of ("tcp",host,port), and >=0.9.0 uses strings + # again. Tolerate them all. + if isinstance(h, tuple): + hints.append(":".join([str(s) for s in h])) + else: + hints.append(h) + return hints def stringify_remote_address(rref): remote = rref.getPeer() diff --git a/src/allmydata/web/introducer.xhtml b/src/allmydata/web/introducer.xhtml index e89e88c3..f64f7e09 100644 --- a/src/allmydata/web/introducer.xhtml +++ b/src/allmydata/web/introducer.xhtml @@ -30,7 +30,6 @@
Nickname
ServerID
- Advertised IPs Announced Version Service Name @@ -39,8 +38,7 @@
- - + @@ -56,7 +54,6 @@
Nickname
Tub ID
- Advertised IPs Connected From Since Version @@ -66,7 +63,6 @@
- diff --git a/src/allmydata/web/introweb.py b/src/allmydata/web/introweb.py index cc8b2ce1..6287af63 100644 --- a/src/allmydata/web/introweb.py +++ b/src/allmydata/web/introweb.py @@ -42,28 +42,12 @@ class IntroducerRoot(rend.Page): res["subscription_summary"] = counts announcement_summary = {} - service_hosts = {} for ad in self.introducer_service.get_announcements(): service_name = ad.service_name if service_name not in announcement_summary: announcement_summary[service_name] = 0 announcement_summary[service_name] += 1 - if service_name not in service_hosts: - service_hosts[service_name] = set() - # it's nice to know how many distinct hosts are available for - # each service. We define a "host" by a set of addresses - # (hostnames or ipv4 addresses), which we extract from the - # connection hints. In practice, this is usually close - # enough: when multiple services are run on a single host, - # they're usually either configured with the same addresses, - # or setLocationAutomatically picks up the same interfaces. - host = frozenset(ad.advertised_addresses) - service_hosts[service_name].add(host) res["announcement_summary"] = announcement_summary - distinct_hosts = dict([(name, len(hosts)) - for (name, hosts) - in service_hosts.iteritems()]) - res["announcement_distinct_hosts"] = distinct_hosts return simplejson.dumps(res, indent=1) + "\n" @@ -105,7 +89,8 @@ class IntroducerRoot(rend.Page): def render_service_row(self, ctx, ad): ctx.fillSlots("serverid", ad.serverid) ctx.fillSlots("nickname", ad.nickname) - ctx.fillSlots("advertised", " ".join(ad.advertised_addresses)) + ctx.fillSlots("connection-hints", + "connection hints: " + " ".join(ad.connection_hints)) ctx.fillSlots("connected", "?") when_s = time.strftime("%H:%M:%S %d-%b-%Y", time.localtime(ad.when)) ctx.fillSlots("announced", when_s) @@ -119,7 +104,6 @@ class IntroducerRoot(rend.Page): def render_subscriber_row(self, ctx, s): ctx.fillSlots("nickname", s.nickname) ctx.fillSlots("tubid", s.tubid) - ctx.fillSlots("advertised", " ".join(s.advertised_addresses)) ctx.fillSlots("connected", s.remote_address) since_s = time.strftime("%H:%M:%S %d-%b-%Y", time.localtime(s.when)) ctx.fillSlots("since", since_s)