#1721 closed defect (fixed)

introducer: WrapV1SubscriberInV2Interface instance has no attribute 'tracker'

Reported by: killyourtv Owned by: warner
Priority: critical Milestone: 1.10.0
Component: code-network Version: 1.9.1
Keywords: introducer regression Cc:
Launchpad Bug:

Description

While testing current trunk on I2P using Debian unstable with

allmydata-tahoe: 1.9.0.post131,
foolscap: 0.6.3,
pycryptopp: 0.6.0.1206569328141510525648634803928199668821045408958,
zfec: 1.4.22,
Twisted: 11.1.0,
Nevow: 0.10.0,
zope.interface: unknown,
python: 2.7.3rc2,
platform: Linux-debian_wheezy/sid-x86_64-64bit_ELF,
pyOpenSSL: 0.13,
simplejson: 2.5.0,
pycrypto: 2.5,
pyasn1: unknown,
mock: 0.8.0,
sqlite3: 2.6.0 [sqlite 3.7.11],
setuptools: 0.6c16dev3

I have found that when my client (running 1.9.0.post131) connects to my introducer (also running 1.9.0.post131), I can load the introducer status page fine. Within a few seconds (probably once other clients connect) the status page will fail to load.

The following is in twistd.log:

2012-04-14 xx:31:51+0300 [-] Log opened.
2012-04-14 xx:31:51+0300 [-] twistd 11.1.0 (/usr/bin/python 2.7.3) starting up.
2012-04-14 xx:31:51+0300 [-] reactor class: twisted.internet.pollreactor.PollReactor.
2012-04-14 xx:31:51+0300 [-] Listener starting on 50895
2012-04-14 xx:31:51+0300 [-] NevowSite starting on 3460
2012-04-14 xx:31:51+0300 [-] Starting factory <nevow.appserver.NevowSite instance at 0x2373758>
2012-04-14 xx:31:51+0300 [-] My pid: 30101
2012-04-14 xx:31:51+0300 [-] DatagramProtocol starting on 56557
2012-04-14 xx:31:51+0300 [-] Starting protocol <twisted.internet.protocol.DatagramProtocol instance at 0x23798c0>
2012-04-14 xx:31:51+0300 [-] (UDP Port 56557 Closed)
2012-04-14 xx:31:51+0300 [-] Stopping protocol <twisted.internet.protocol.DatagramProtocol instance at 0x23798c0>
2012-04-14 xx:32:09+0300 [HTTPChannel,1,127.0.0.1] Unhandled Error
	Traceback (most recent call last):
	  File "/usr/lib/python2.7/dist-packages/nevow/rend.py", line 569, in _renderHTTP
	    return self.flattenFactory(doc, ctx, writer, finisher)
	  File "/usr/lib/python2.7/dist-packages/nevow/rend.py", line 528, in <lambda>
	    flattenFactory = lambda self, *args: flat.flattenFactory(*args)
	  File "/usr/lib/python2.7/dist-packages/nevow/flat/__init__.py", line 14, in flattenFactory
	    return deferflatten(stan, ctx, writer).addCallback(finisher)
	  File "/usr/lib/python2.7/dist-packages/nevow/flat/twist.py", line 63, in deferflatten
	    _drive(iterable, finished)
	--- <exception caught here> ---
	  File "/usr/lib/python2.7/dist-packages/nevow/flat/twist.py", line 24, in _drive
	    next = iterable.next()
	  File "/usr/lib/python2.7/dist-packages/nevow/flat/ten.py", line 83, in iterflatten
	    for item in gen:
	  File "/usr/lib/python2.7/dist-packages/nevow/flat/flatstan.py", line 103, in TagSerializer
	    yield serialize(toBeRenderedBy, context)
	  File "/usr/lib/python2.7/dist-packages/nevow/flat/ten.py", line 70, in serialize
	    return partialflatten(context, obj)
	  File "/usr/lib/python2.7/dist-packages/nevow/flat/ten.py", line 61, in partialflatten
	    return flattener(obj, context)
	  File "/usr/lib/python2.7/dist-packages/nevow/flat/flatstan.py", line 264, in DirectiveSerializer
	    return serialize(renderer, context)
	  File "/usr/lib/python2.7/dist-packages/nevow/flat/ten.py", line 70, in serialize
	    return partialflatten(context, obj)
	  File "/usr/lib/python2.7/dist-packages/nevow/flat/ten.py", line 61, in partialflatten
	    return flattener(obj, context)
	  File "/usr/lib/python2.7/dist-packages/nevow/flat/flatstan.py", line 247, in MethodSerializer
	    return FunctionSerializer(original, context, nocontext)
	  File "/usr/lib/python2.7/dist-packages/nevow/flat/flatstan.py", line 236, in FunctionSerializer
	    result = original(context, data)
	  File "$SRC/tahoe-lafs/src/allmydata/web/introweb.py", line 154, in render_subscriber_row
	    remote_host = rref.tracker.broker.transport.getPeer()
	exceptions.AttributeError: WrapV1SubscriberInV2Interface instance has no attribute 'tracker'

FWIW, all of the other clients are running 1.8.3. Also, this is on the I2P-hosted volunteer grid.

Change History (8)

comment:1 Changed at 2012-04-15T01:30:20Z by davidsarah

  • Component changed from unknown to code
  • Keywords introducer regression added
  • Owner changed from davidsarah to warner
  • Priority changed from normal to critical

comment:2 Changed at 2012-04-15T07:04:47Z by warner

  • Component changed from code to code-network
  • Milestone changed from undecided to 1.9.2
  • Status changed from new to assigned

good catch! looks like I missed an abstraction-violation in the Introducer's web-status page. I'll add a test and fix it.

comment:3 Changed at 2012-04-23T06:18:17Z by warner

  • Keywords review-needed added

I have a fix for this, which cleans up the "introweb" handling considerably. Unfortunately #1581 prevented me from uploading the patch to this ticket. Fortunately it can be seen on github, in https://github.com/warner/tahoe-lafs/tree/1721-introweb . Zooko / David-Sarah, if y'all feel like reviewing this in the next few days first, go for it, else I'll just land it.

Last edited at 2012-04-23T06:18:37Z by warner (previous) (diff)

comment:4 Changed at 2012-04-23T18:19:52Z by davidsarah

  • Keywords review-needed removed

comment:5 Changed at 2012-04-23T21:27:42Z by killyourtv

I applied this patch and (functionality-wise) it looks good on my end.

comment:6 Changed at 2012-04-24T05:40:01Z by Brian Warner <warner@…>

  • Resolution set to fixed
  • Status changed from assigned to closed

In 84c9f3bfb4bdfde0:

Fix introweb display for mixed V1/V2 clients. Closes #1721.

This significantly cleans up the IntroducerServer? web-status renderers.
Instead of poking around in the introducer's internals, now the web-status
renderers get clean AnnouncementDescriptor? and SubscriberDescriptor?
objects. They are still somewhat foolscap-centric, but will provide a clean
abstraction boundary for future improvements.

The specific #1721 bug was that old (V1) subscribers were handled by
wrapping their RemoteReference? in a special WrapV1SubscriberInV2Interface
object, but the web-status display was trying to peek inside the object to
learn what host+port it was associated with, and the wrapper did not proxy
those extra attributes.

A test was added to test_introducer to make sure the introweb page renders
properly and at least contains the nicknames of both the V1 and V2 clients.

comment:7 Changed at 2012-04-24T22:15:08Z by davidsarah

I re-reviewed 84c9f3bfb4bdfde0. My comments have been addressed apart from the ones about exceptions in the loops over announcements.

comment:8 Changed at 2012-05-14T04:19:13Z by davidsarah

  • Milestone changed from 1.9.2 to 1.10.0
Note: See TracTickets for help on using tickets.