Ticket #1160: patch-3-tolerate-unretired-DYHB.diff

File patch-3-tolerate-unretired-DYHB.diff, 3.7 KB (added by warner, at 2010-08-09T22:30:26Z)

real fix for #1160: tolerate DYHB requests that haven't retired, plus tests

  • src/allmydata/test/test_web.py

    diff --git a/src/allmydata/test/test_web.py b/src/allmydata/test/test_web.py
    index e2bd985..dfaaabd 100644
    a b  
    11
    2 import os.path, re, urllib
     2import os.path, re, urllib, time
    33import simplejson
    44from StringIO import StringIO
    55from twisted.application import service
    class FakeUploader(service.Service): 
    7474    def get_helper_info(self):
    7575        return (None, False)
    7676
     77def build_one_ds():
     78    ds = DownloadStatus("storage_index", 1234)
     79    now = time.time()
     80
     81    ds.add_segment_request(0, now)
     82    # segnum, when, start,len, decodetime
     83    ds.add_segment_delivery(0, now+1, 0, 100, 0.5)
     84    ds.add_segment_request(1, now+2)
     85    ds.add_segment_error(1, now+3)
     86
     87    e = ds.add_dyhb_sent("serverid_a", now)
     88    e.finished([1,2], now+1)
     89    e = ds.add_dyhb_sent("serverid_b", now+2) # left unfinished
     90
     91    e = ds.add_read_event(0, 120, now)
     92    e.update(60, 0.5, 0.1) # bytes, decrypttime, pausetime
     93    e.finished(now+1)
     94    e = ds.add_read_event(120, 30, now+2) # left unfinished
     95
     96    e = ds.add_request_sent("serverid_a", 1, 100, 20, now)
     97    e.finished(20, now+1)
     98    e = ds.add_request_sent("serverid_a", 1, 120, 30, now+1) # left unfinished
     99
     100    # make sure that add_read_event() can come first too
     101    ds1 = DownloadStatus("storage_index", 1234)
     102    e = ds1.add_read_event(0, 120, now)
     103    e.update(60, 0.5, 0.1) # bytes, decrypttime, pausetime
     104    e.finished(now+1)
     105
     106    return ds
     107
    77108class FakeHistory:
    78109    _all_upload_status = [upload.UploadStatus()]
    79     _all_download_status = [DownloadStatus("storage_index", 1234)]
     110    _all_download_status = [build_one_ds()]
    80111    _all_mapupdate_statuses = [servermap.UpdateStatus()]
    81112    _all_publish_statuses = [publish.PublishStatus()]
    82113    _all_retrieve_statuses = [retrieve.RetrieveStatus()]
    class Web(WebMixin, WebErrorMixin, testutil.StallMixin, testutil.ReallyEqualMixi 
    516547        def _check_dl(res):
    517548            self.failUnless("File Download Status" in res, res)
    518549        d.addCallback(_check_dl)
     550        d.addCallback(lambda res: self.GET("/status/down-%d?t=json" % dl_num))
     551        def _check_dl_json(res):
     552            data = simplejson.loads(res)
     553            self.failUnless(isinstance(data, dict))
     554        d.addCallback(_check_dl_json)
    519555        d.addCallback(lambda res: self.GET("/status/up-%d" % ul_num))
    520556        def _check_ul(res):
    521557            self.failUnless("File Upload Status" in res, res)
  • src/allmydata/web/status.py

    diff --git a/src/allmydata/web/status.py b/src/allmydata/web/status.py
    index 636a2db..8af453c 100644
    a b class DownloadStatusPage(DownloadResultsRendererMixin, rend.Page): 
    413413        for d_ev in dyhb_events:
    414414            (serverid, sent, shnums, received) = d_ev
    415415            serverid_s = idlib.shortnodeid_b2a(serverid)
    416             rtt = received - sent
     416            rtt = None
     417            if received is not None:
     418                rtt = received - sent
     419            if not shnums:
     420                shnums = []
    417421            t[T.tr(style="background: %s" % self.color(serverid))[
    418422                [T.td[serverid_s], T.td[srt(sent)], T.td[srt(received)],
    419423                 T.td[",".join([str(shnum) for shnum in shnums])],
    class DownloadStatusPage(DownloadResultsRendererMixin, rend.Page): 
    427431               T.td["speed"]]]
    428432        for r_ev in self.download_status.read_events:
    429433            (start, length, requesttime, finishtime, bytes, decrypt, paused) = r_ev
    430             #print r_ev
    431434            if finishtime is not None:
    432435                rtt = finishtime - requesttime - paused
    433436                speed = self.render_rate(None, 1.0 * bytes / rtt)