client: publish a 'stub client' announcement to the introducer, to provide version/nickname information for each client

This commit is contained in:
Brian Warner
2008-03-11 19:20:10 -07:00
parent 0c40513e75
commit c21d30c320
2 changed files with 32 additions and 6 deletions

View File

@ -3,8 +3,10 @@ import os, stat, time, re
from allmydata.interfaces import RIStorageServer from allmydata.interfaces import RIStorageServer
from allmydata import node from allmydata import node
from zope.interface import implements
from twisted.internet import reactor from twisted.internet import reactor
from twisted.application.internet import TimerService from twisted.application.internet import TimerService
from foolscap import Referenceable
from foolscap.logging import log from foolscap.logging import log
import allmydata import allmydata
@ -21,7 +23,7 @@ from allmydata.dirnode import NewDirectoryNode
from allmydata.mutable import MutableFileNode, MutableWatcher from allmydata.mutable import MutableFileNode, MutableWatcher
from allmydata.stats import StatsProvider from allmydata.stats import StatsProvider
from allmydata.interfaces import IURI, INewDirectoryURI, \ from allmydata.interfaces import IURI, INewDirectoryURI, \
IReadonlyNewDirectoryURI, IFileURI, IMutableFileURI IReadonlyNewDirectoryURI, IFileURI, IMutableFileURI, RIStubClient
KiB=1024 KiB=1024
MiB=1024*KiB MiB=1024*KiB
@ -29,6 +31,9 @@ GiB=1024*MiB
TiB=1024*GiB TiB=1024*GiB
PiB=1024*TiB PiB=1024*TiB
class StubClient(Referenceable):
implements(RIStubClient)
class Client(node.Node, testutil.PollMixin): class Client(node.Node, testutil.PollMixin):
PORTNUMFILE = "client.port" PORTNUMFILE = "client.port"
STOREDIR = 'storage' STOREDIR = 'storage'
@ -63,11 +68,7 @@ class Client(node.Node, testutil.PollMixin):
run_helper = self.get_config("run_helper") run_helper = self.get_config("run_helper")
if run_helper: if run_helper:
self.init_helper() self.init_helper()
helper_furl = self.get_config("helper.furl") self.init_client()
self.add_service(Uploader(helper_furl))
self.add_service(Downloader())
self.add_service(Checker())
self.add_service(MutableWatcher())
# ControlServer and Helper are attached after Tub startup # ControlServer and Helper are attached after Tub startup
hotline_file = os.path.join(self.basedir, hotline_file = os.path.join(self.basedir,
@ -148,6 +149,24 @@ class Client(node.Node, testutil.PollMixin):
d.addCallback(_publish) d.addCallback(_publish)
d.addErrback(log.err, facility="tahoe.init", level=log.BAD) d.addErrback(log.err, facility="tahoe.init", level=log.BAD)
def init_client(self):
helper_furl = self.get_config("helper.furl")
self.add_service(Uploader(helper_furl))
self.add_service(Downloader())
self.add_service(Checker())
self.add_service(MutableWatcher())
def _publish(res):
# we publish an empty object so that the introducer can count how
# many clients are connected and see what versions they're
# running.
sc = StubClient()
furl = self.tub.registerReference(sc)
ri_name = RIStubClient.__remote_name__
self.introducer_client.publish(furl, "stub_client", ri_name)
d = self.when_tub_ready()
d.addCallback(_publish)
d.addErrback(log.err, facility="tahoe.init", level=log.BAD)
def init_control(self): def init_control(self):
d = self.when_tub_ready() d = self.when_tub_ready()
def _publish(res): def _publish(res):

View File

@ -160,6 +160,13 @@ class IIntroducerClient(Interface):
"""Returns a boolean, True if we are currently connected to the """Returns a boolean, True if we are currently connected to the
introducer, False if not.""" introducer, False if not."""
class RIStubClient(RemoteInterface):
"""Each client publishes a service announcement for a dummy object called
the StubClient. This object doesn't actually offer any services, but the
announcement helps the Introducer keep track of which clients are
subscribed (so the grid admin can keep track of things like the size of
the grid and the client versions in use. This is the (empty)
RemoteInterface for the StubClient."""
class RIBucketWriter(RemoteInterface): class RIBucketWriter(RemoteInterface):
def write(offset=Offset, data=ShareData): def write(offset=Offset, data=ShareData):