Sun Sep 19 02:56:59 EDT 2010 tahoe@alistairphipps.com * 386_status_page_nicknames New patches: [386_status_page_nicknames tahoe@alistairphipps.com**20100919065659 Ignore-this: 31c58a74489839b51e534372a98a839f ] { hunk ./src/allmydata/client.py 294 self.history = History(self.stats_provider) self.terminator = Terminator() self.terminator.setServiceParent(self) - self.add_service(Uploader(helper_furl, self.stats_provider)) + self.add_service(Uploader(helper_furl, self.stats_provider, self.history)) self.init_stub_client() self.init_nodemaker() hunk ./src/allmydata/client.py 499 def upload(self, uploadable): uploader = self.getServiceNamed("uploader") - return uploader.upload(uploadable, history=self.get_history()) + return uploader.upload(uploadable) hunk ./src/allmydata/immutable/upload.py 1401 name = "uploader" URI_LIT_SIZE_THRESHOLD = 55 - def __init__(self, helper_furl=None, stats_provider=None): + def __init__(self, helper_furl=None, stats_provider=None, history=None): self._helper_furl = helper_furl self.stats_provider = stats_provider self._helper = None hunk ./src/allmydata/immutable/upload.py 1406 self._all_uploads = weakref.WeakKeyDictionary() # for debugging + self.history = history log.PrefixingLogMixin.__init__(self, facility="tahoe.immutable.upload") service.MultiService.__init__(self) hunk ./src/allmydata/immutable/upload.py 1440 return (self._helper_furl, bool(self._helper)) - def upload(self, uploadable, history=None): + def upload(self, uploadable): """ Returns a Deferred that will fire with the UploadResults instance. """ hunk ./src/allmydata/immutable/upload.py 1446 assert self.parent assert self.running - uploadable = IUploadable(uploadable) d = uploadable.get_size() def _got_size(size): hunk ./src/allmydata/immutable/upload.py 1457 if self.stats_provider: self.stats_provider.count('uploader.files_uploaded', 1) self.stats_provider.count('uploader.bytes_uploaded', size) - if size <= self.URI_LIT_SIZE_THRESHOLD: uploader = LiteralUploader() return uploader.start(uploadable) hunk ./src/allmydata/immutable/upload.py 1474 d2.addCallback(lambda x: uploader.start(eu)) self._all_uploads[uploader] = None - if history: - history.add_upload(uploader.get_upload_status()) + if self.history: + self.history.add_upload(uploader.get_upload_status()) def turn_verifycap_into_read_cap(uploadresults): # Generate the uri from the verifycap plus the key. d3 = uploadable.get_encryption_key() hunk ./src/allmydata/nodemaker.py 109 convergence = self.secret_holder.get_convergence_secret() packed = pack_children(children, None, deep_immutable=True) uploadable = Data(packed, convergence) - d = self.uploader.upload(uploadable, history=self.history) + d = self.uploader.upload(uploadable) d.addCallback(lambda results: self.create_from_cap(None, results.uri)) d.addCallback(self._create_dirnode) return d hunk ./src/allmydata/web/root.py 165 self.child_file = FileHandler(client) self.child_named = FileHandler(client) - self.child_status = status.Status(client.get_history()) + self.child_status = status.Status(client) self.child_statistics = status.Statistics(client.stats_provider) def child_helper_status(self, ctx): hunk ./src/allmydata/web/status.py 21 return abbreviate_rate(data) class UploadResultsRendererMixin(RateAndTimeMixin): - # this requires a method named 'upload_results' + # this requires a method named 'upload_results'and 'get_storage_broker' def render_pushed_shares(self, ctx, data): d = self.upload_results() hunk ./src/allmydata/web/status.py 41 return "None" l = T.ul() for shnum, peerids in sorted(sharemap.items()): + nicknames = ', '.join([self.get_storage_broker().get_nickname_for_serverid(i) for i in peerids]) peerids = ', '.join([idlib.shortnodeid_b2a(i) for i in peerids]) hunk ./src/allmydata/web/status.py 43 - l[T.li["%d -> placed on [%s]" % (shnum, peerids)]] + l[T.li["%d -> placed on %s [%s]" % (shnum, nicknames, peerids)]] return l d.addCallback(_render) return d hunk ./src/allmydata/web/status.py 59 peerid_s = idlib.shortnodeid_b2a(peerid) shares_s = ",".join(["#%d" % shnum for shnum in servermap[peerid]]) - l[T.li["[%s] got share%s: %s" % (peerid_s, + l[T.li["%s [%s] got share%s: %s" % (self.get_storage_broker().get_nickname_for_serverid(peerid), peerid_s, plural(servermap[peerid]), shares_s)]] return l hunk ./src/allmydata/web/status.py 155 class UploadStatusPage(UploadResultsRendererMixin, rend.Page): docFactory = getxmlfile("upload-status.xhtml") - def __init__(self, data): + def __init__(self, data, storage_broker): rend.Page.__init__(self, data) self.upload_status = data hunk ./src/allmydata/web/status.py 158 + self.storage_broker = storage_broker hunk ./src/allmydata/web/status.py 160 + def get_storage_broker(self): + return self.storage_broker; + def upload_results(self): return defer.maybeDeferred(self.upload_status.get_results) hunk ./src/allmydata/web/status.py 216 return data.get_status() class DownloadResultsRendererMixin(RateAndTimeMixin): - # this requires a method named 'download_results' + # this requires a method named 'download_results' and 'get_storage_broker' def render_servermap(self, ctx, data): d = self.download_results() hunk ./src/allmydata/web/status.py 229 peerid_s = idlib.shortnodeid_b2a(peerid) shares_s = ",".join(["#%d" % shnum for shnum in servermap[peerid]]) - l[T.li["[%s] has share%s: %s" % (peerid_s, + l[T.li["%s [%s] has share%s: %s" % (self.get_storage_broker().get_nickname_for_serverid(peerid), peerid_s, plural(servermap[peerid]), shares_s)]] return l hunk ./src/allmydata/web/status.py 242 def _got(servers_used): if not servers_used: return "" - peerids_s = ", ".join(["[%s]" % idlib.shortnodeid_b2a(peerid) + peerids_s = ", ".join(["%s [%s]" % (self.get_storage_broker().get_nickname_for_serverid(peerid), idlib.shortnodeid_b2a(peerid)) for peerid in servers_used]) return T.li["Servers Used: ", peerids_s] d.addCallback(_got) hunk ./src/allmydata/web/status.py 257 l = T.ul() for peerid in sorted(server_problems.keys()): peerid_s = idlib.shortnodeid_b2a(peerid) - l[T.li["[%s]: %s" % (peerid_s, server_problems[peerid])]] + l[T.li["%s [%s]: %s" % (self.get_storage_broker().get_nickname_for_serverid(peerid), peerid_s, server_problems[peerid])]] return T.li["Server Problems:", l] d.addCallback(_got) return d hunk ./src/allmydata/web/status.py 334 peerid_s = idlib.shortnodeid_b2a(peerid) times_s = ", ".join([self.render_time(None, t) for t in per_server[peerid]]) - l[T.li["[%s]: %s" % (peerid_s, times_s)]] + l[T.li["%s [%s]: %s" % (self.get_storage_broker().get_nickname_for_serverid(peerid), peerid_s, times_s)]] return T.li["Per-Server Segment Fetch Response Times: ", l] d.addCallback(_render) return d hunk ./src/allmydata/web/status.py 342 class DownloadStatusPage(DownloadResultsRendererMixin, rend.Page): docFactory = getxmlfile("download-status.xhtml") - def __init__(self, data): + def __init__(self, data, storage_broker): rend.Page.__init__(self, data) self.download_status = data hunk ./src/allmydata/web/status.py 345 + self.storage_broker = storage_broker hunk ./src/allmydata/web/status.py 347 + def get_storage_broker(self): + return self.storage_broker + def download_results(self): return defer.maybeDeferred(self.download_status.get_results) hunk ./src/allmydata/web/status.py 398 l = T.ul() t = T.table(class_="status-download-events") - t[T.tr[T.td["serverid"], T.td["sent"], T.td["received"], + t[T.tr[T.td["nickname"], T.td["serverid"], T.td["sent"], T.td["received"], T.td["shnums"], T.td["RTT"]]] dyhb_events = [] for serverid,requests in self.download_status.dyhb_requests.iteritems(): hunk ./src/allmydata/web/status.py 414 if not shnums: shnums = [] t[T.tr(style="background: %s" % self.color(serverid))[ - [T.td[serverid_s], T.td[srt(sent)], T.td[srt(received)], + [T.td[self.get_storage_broker().get_nickname_for_serverid(serverid)], T.td[serverid_s], T.td[srt(sent)], T.td[srt(received)], T.td[",".join([str(shnum) for shnum in shnums])], T.td[self.render_time(None, rtt)], ]]] hunk ./src/allmydata/web/status.py 468 l["Segment Events:", t] t = T.table(border="1") - t[T.tr[T.td["serverid"], T.td["shnum"], T.td["range"], + t[T.tr[T.td["nickname"], T.td["serverid"], T.td["shnum"], T.td["range"], T.td["txtime"], T.td["rxtime"], T.td["received"], T.td["RTT"]]] reqtime = (None, None) request_events = [] hunk ./src/allmydata/web/status.py 483 rtt = received - sent peerid_s = idlib.shortnodeid_b2a(peerid) t[T.tr(style="background: %s" % self.color(peerid))[ - T.td[peerid_s], T.td[shnum], + T.td[self.get_storage_broker().get_nickname_for_serverid(peerid)], T.td[peerid_s], T.td[shnum], T.td["[%d:+%d]" % (start, length)], T.td[srt(sent)], T.td[srt(received)], T.td[receivedlen], T.td[self.render_time(None, rtt)], hunk ./src/allmydata/web/status.py 539 class RetrieveStatusPage(rend.Page, RateAndTimeMixin): docFactory = getxmlfile("retrieve-status.xhtml") - def __init__(self, data): + def __init__(self, data, storage_broker): rend.Page.__init__(self, data) self.retrieve_status = data hunk ./src/allmydata/web/status.py 542 + self.storage_broker = storage_broker + + def get_storage_broker(self): + return self.storage_broker def render_started(self, ctx, data): TIME_FORMAT = "%H:%M:%S %d-%b-%Y" hunk ./src/allmydata/web/status.py 588 l = T.ul() for peerid in sorted(problems.keys()): peerid_s = idlib.shortnodeid_b2a(peerid) - l[T.li["[%s]: %s" % (peerid_s, problems[peerid])]] + l[T.li["%s [%s]: %s" % (self.get_storage_broker().get_nickname_for_serverid(peerid), peerid_s, problems[peerid])]] return ctx.tag["Server Problems:", l] def _get_rate(self, data, name): hunk ./src/allmydata/web/status.py 632 class PublishStatusPage(rend.Page, RateAndTimeMixin): docFactory = getxmlfile("publish-status.xhtml") - def __init__(self, data): + def __init__(self, data, storage_broker): rend.Page.__init__(self, data) self.publish_status = data hunk ./src/allmydata/web/status.py 635 + self.storage_broker = storage_broker + + def get_storage_broker(self): + return self.storage_broker def render_started(self, ctx, data): TIME_FORMAT = "%H:%M:%S %d-%b-%Y" hunk ./src/allmydata/web/status.py 682 sharemap = servermap.make_sharemap() for shnum in sorted(sharemap.keys()): l[T.li["%d -> Placed on " % shnum, - ", ".join(["[%s]" % idlib.shortnodeid_b2a(peerid) + ", ".join(["%s [%s]" % (self.get_storage_broker().get_nickname_for_serverid(peerid), idlib.shortnodeid_b2a(peerid)) for peerid in sharemap[shnum]])]] return ctx.tag["Sharemap:", l] hunk ./src/allmydata/web/status.py 693 l = T.ul() for peerid in sorted(problems.keys()): peerid_s = idlib.shortnodeid_b2a(peerid) - l[T.li["[%s]: %s" % (peerid_s, problems[peerid])]] + l[T.li["%s [%s]: %s" % (self.get_storage_broker().get_nickname_for_serverid(peerid), peerid_s, problems[peerid])]] return ctx.tag["Server Problems:", l] def _get_rate(self, data, name): hunk ./src/allmydata/web/status.py 740 peerid_s = idlib.shortnodeid_b2a(peerid) times_s = ", ".join([self.render_time(None, t) for t in per_server[peerid]]) - l[T.li["[%s]: %s" % (peerid_s, times_s)]] + l[T.li["%s [%s]: %s" % (self.get_storage_broker().get_nickname_for_serverid(peerid), peerid_s, times_s)]] return T.li["Per-Server Response Times: ", l] class MapupdateStatusPage(rend.Page, RateAndTimeMixin): hunk ./src/allmydata/web/status.py 746 docFactory = getxmlfile("map-update-status.xhtml") - def __init__(self, data): + def __init__(self, data, storage_broker): rend.Page.__init__(self, data) self.update_status = data hunk ./src/allmydata/web/status.py 749 + self.storage_broker = storage_broker + + def get_storage_broker(self): + return self.storage_broker def render_started(self, ctx, data): TIME_FORMAT = "%H:%M:%S %d-%b-%Y" hunk ./src/allmydata/web/status.py 794 l = T.ul() for peerid in sorted(problems.keys()): peerid_s = idlib.shortnodeid_b2a(peerid) - l[T.li["[%s]: %s" % (peerid_s, problems[peerid])]] + l[T.li["%s [%s]: %s" % (self.get_storage_broker().get_nickname_for_serverid(peerid), peerid_s, problems[peerid])]] return ctx.tag["Server Problems:", l] def render_privkey_from(self, ctx, data): hunk ./src/allmydata/web/status.py 800 peerid = data.get_privkey_from() if peerid: - return ctx.tag["Got privkey from: [%s]" - % idlib.shortnodeid_b2a(peerid)] + return ctx.tag["Got privkey from: %s [%s]" + % (self.get_storage_broker().get_nickname_for_serverid(peerid), idlib.shortnodeid_b2a(peerid))] else: return "" hunk ./src/allmydata/web/status.py 834 else: times.append( "privkey(" + self.render_time(None, t) + ")" ) times_s = ", ".join(times) - l[T.li["[%s]: %s" % (peerid_s, times_s)]] + l[T.li["%s [%s]: %s" % (self.get_storage_broker().get_nickname_for_serverid(peerid), peerid_s, times_s)]] return T.li["Per-Server Response Times: ", l] def render_timing_chart(self, ctx, data): hunk ./src/allmydata/web/status.py 862 for peerid in peerids: times = per_server[peerid] peerid_s = idlib.shortnodeid_b2a(peerid) - peerids_s.append(peerid_s) + peerids_s.append(self.get_storage_broker().get_nickname_for_serverid(peerid) + "[" + peerid_s + "]") # for servermap updates, there are either one or two queries per # peer. The second (if present) is to get the privkey. op,q_started,q_elapsed = times[0] hunk ./src/allmydata/web/status.py 905 docFactory = getxmlfile("status.xhtml") addSlash = True - def __init__(self, history): - rend.Page.__init__(self, history) - self.history = history + def __init__(self, client): + rend.Page.__init__(self, client.get_history()) + self.client = client + self.history = client.get_history() def renderHTTP(self, ctx): req = inevow.IRequest(ctx) hunk ./src/allmydata/web/status.py 946 return simplejson.dumps(data, indent=1) + "\n" def _get_all_statuses(self): - h = self.history + h = self.client.get_history() return itertools.chain(h.list_all_upload_statuses(), h.list_all_download_statuses(), h.list_all_mapupdate_statuses(), hunk ./src/allmydata/web/status.py 1029 return ctx.tag def childFactory(self, ctx, name): - h = self.history + h = self.client.get_history() stype,count_s = name.split("-") count = int(count_s) if stype == "up": hunk ./src/allmydata/web/status.py 1038 # immutable-upload helpers use the same status object as a # regular immutable-upload if s.get_counter() == count: - return UploadStatusPage(s) + return UploadStatusPage(s, self.client.get_storage_broker()) if stype == "down": for s in h.list_all_download_statuses(): if s.get_counter() == count: hunk ./src/allmydata/web/status.py 1042 - return DownloadStatusPage(s) + return DownloadStatusPage(s, self.client.get_storage_broker()) if stype == "mapupdate": for s in h.list_all_mapupdate_statuses(): if s.get_counter() == count: hunk ./src/allmydata/web/status.py 1046 - return MapupdateStatusPage(s) + return MapupdateStatusPage(s, self.client.get_storage_broker()) if stype == "publish": for s in h.list_all_publish_statuses(): if s.get_counter() == count: hunk ./src/allmydata/web/status.py 1050 - return PublishStatusPage(s) + return PublishStatusPage(s, self.client.get_storage_broker()) if stype == "retrieve": for s in h.list_all_retrieve_statuses(): if s.get_counter() == count: hunk ./src/allmydata/web/status.py 1054 - return RetrieveStatusPage(s) + return RetrieveStatusPage(s, self.client.get_storage_broker()) class HelperStatus(rend.Page): hunk ./src/allmydata/web/unlinked.py 62 def __init__(self, upload_results): rend.Page.__init__(self) self.results = upload_results + self.storage_broker = UnlinkedStorageBroker() def upload_results(self): return defer.succeed(self.results) hunk ./src/allmydata/web/unlinked.py 66 + + def get_storage_broker(self): + return self.storage_broker def data_done(self, ctx, data): d = self.upload_results() hunk ./src/allmydata/web/unlinked.py 163 d.addCallback(lambda dirnode: dirnode.get_uri()) return d +class UnlinkedStorageBroker: + def get_nickname_for_serverid(self, server_id): + return 'NICKNAME' + server_id + } Context: [docs/quickstart.html: note dependency on python development files, e.g. on Ubuntu david-sarah@jacaranda.org**20100914040456 Ignore-this: 8f2ab59d3048de1ea0fbea5850843045 ] [TAG allmydata-tahoe-1.8.0c4 zooko@zooko.com**20100912062225 Ignore-this: 4c99e0eed253e2a38ed9ea4f4db5ad77 ] Patch bundle hash: cf8c3608d165ac8266dccf5bac9648a888e82600