mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-01-17 10:20:13 +00:00
DownloadStatus: put real numbers in progress/status rows, not placeholders.
Improve tests.
This commit is contained in:
parent
dc1afc81bb
commit
a3cf3331d2
@ -157,9 +157,49 @@ class DownloadStatus:
|
|||||||
def get_size(self):
|
def get_size(self):
|
||||||
return self.size
|
return self.size
|
||||||
def get_status(self):
|
def get_status(self):
|
||||||
return "not impl yet" # TODO
|
# mention all outstanding segment requests
|
||||||
|
outstanding = set()
|
||||||
|
errorful = set()
|
||||||
|
for s_ev in self.segment_events:
|
||||||
|
(etype, segnum, when, segstart, seglen, decodetime) = s_ev
|
||||||
|
if etype == "request":
|
||||||
|
outstanding.add(segnum)
|
||||||
|
elif etype == "delivery":
|
||||||
|
outstanding.remove(segnum)
|
||||||
|
else: # "error"
|
||||||
|
outstanding.remove(segnum)
|
||||||
|
errorful.add(segnum)
|
||||||
|
def join(segnums):
|
||||||
|
if len(segnums) == 1:
|
||||||
|
return "segment %s" % list(segnums)[0]
|
||||||
|
else:
|
||||||
|
return "segments %s" % (",".join([str(i)
|
||||||
|
for i in sorted(segnums)]))
|
||||||
|
error_s = ""
|
||||||
|
if errorful:
|
||||||
|
error_s = "; errors on %s" % join(errorful)
|
||||||
|
if outstanding:
|
||||||
|
s = "fetching %s" % join(outstanding)
|
||||||
|
else:
|
||||||
|
s = "idle"
|
||||||
|
return s + error_s
|
||||||
|
|
||||||
def get_progress(self):
|
def get_progress(self):
|
||||||
return 0.1 # TODO
|
# measure all read events that aren't completely done, return the
|
||||||
|
# total percentage complete for them
|
||||||
|
if not self.read_events:
|
||||||
|
return 0.0
|
||||||
|
total_outstanding, total_received = 0, 0
|
||||||
|
for r_ev in self.read_events:
|
||||||
|
(start, length, ign1, finishtime, bytes, ign2, ign3) = r_ev
|
||||||
|
if finishtime is None:
|
||||||
|
total_outstanding += length
|
||||||
|
total_received += bytes
|
||||||
|
# else ignore completed requests
|
||||||
|
if not total_outstanding:
|
||||||
|
return 1.0
|
||||||
|
return 1.0 * total_received / total_outstanding
|
||||||
|
|
||||||
def using_helper(self):
|
def using_helper(self):
|
||||||
return False
|
return False
|
||||||
def get_active(self):
|
def get_active(self):
|
||||||
|
@ -16,6 +16,7 @@ from allmydata.test.common import ShouldFailMixin
|
|||||||
from allmydata.interfaces import NotEnoughSharesError, NoSharesError
|
from allmydata.interfaces import NotEnoughSharesError, NoSharesError
|
||||||
from allmydata.immutable.downloader.common import BadSegmentNumberError, \
|
from allmydata.immutable.downloader.common import BadSegmentNumberError, \
|
||||||
BadCiphertextHashError, DownloadStopped
|
BadCiphertextHashError, DownloadStopped
|
||||||
|
from allmydata.immutable.downloader.status import DownloadStatus
|
||||||
from allmydata.codec import CRSDecoder
|
from allmydata.codec import CRSDecoder
|
||||||
from foolscap.eventual import fireEventually, flushEventualQueue
|
from foolscap.eventual import fireEventually, flushEventualQueue
|
||||||
|
|
||||||
@ -1214,3 +1215,45 @@ class DownloadV2(_Base, unittest.TestCase):
|
|||||||
return d
|
return d
|
||||||
d.addCallback(_uploaded)
|
d.addCallback(_uploaded)
|
||||||
return d
|
return d
|
||||||
|
|
||||||
|
class Status(unittest.TestCase):
|
||||||
|
def test_status(self):
|
||||||
|
now = 12345.1
|
||||||
|
ds = DownloadStatus("si-1", 123)
|
||||||
|
self.failUnlessEqual(ds.get_status(), "idle")
|
||||||
|
ds.add_segment_request(0, now)
|
||||||
|
self.failUnlessEqual(ds.get_status(), "fetching segment 0")
|
||||||
|
ds.add_segment_delivery(0, now+1, 0, 1000, 2.0)
|
||||||
|
self.failUnlessEqual(ds.get_status(), "idle")
|
||||||
|
ds.add_segment_request(2, now+2)
|
||||||
|
ds.add_segment_request(1, now+2)
|
||||||
|
self.failUnlessEqual(ds.get_status(), "fetching segments 1,2")
|
||||||
|
ds.add_segment_error(1, now+3)
|
||||||
|
self.failUnlessEqual(ds.get_status(),
|
||||||
|
"fetching segment 2; errors on segment 1")
|
||||||
|
|
||||||
|
def test_progress(self):
|
||||||
|
now = 12345.1
|
||||||
|
ds = DownloadStatus("si-1", 123)
|
||||||
|
self.failUnlessEqual(ds.get_progress(), 0.0)
|
||||||
|
e = ds.add_read_event(0, 1000, now)
|
||||||
|
self.failUnlessEqual(ds.get_progress(), 0.0)
|
||||||
|
e.update(500, 2.0, 2.0)
|
||||||
|
self.failUnlessEqual(ds.get_progress(), 0.5)
|
||||||
|
e.finished(now+2)
|
||||||
|
self.failUnlessEqual(ds.get_progress(), 1.0)
|
||||||
|
|
||||||
|
e1 = ds.add_read_event(1000, 2000, now+3)
|
||||||
|
e2 = ds.add_read_event(4000, 2000, now+3)
|
||||||
|
self.failUnlessEqual(ds.get_progress(), 0.0)
|
||||||
|
e1.update(1000, 2.0, 2.0)
|
||||||
|
self.failUnlessEqual(ds.get_progress(), 0.25)
|
||||||
|
e2.update(1000, 2.0, 2.0)
|
||||||
|
self.failUnlessEqual(ds.get_progress(), 0.5)
|
||||||
|
e1.update(1000, 2.0, 2.0)
|
||||||
|
e1.finished(now+4)
|
||||||
|
# now there is only one outstanding read, and it is 50% done
|
||||||
|
self.failUnlessEqual(ds.get_progress(), 0.5)
|
||||||
|
e2.update(1000, 2.0, 2.0)
|
||||||
|
e2.finished(now+5)
|
||||||
|
self.failUnlessEqual(ds.get_progress(), 1.0)
|
||||||
|
@ -83,6 +83,9 @@ def build_one_ds():
|
|||||||
ds.add_segment_delivery(0, now+1, 0, 100, 0.5)
|
ds.add_segment_delivery(0, now+1, 0, 100, 0.5)
|
||||||
ds.add_segment_request(1, now+2)
|
ds.add_segment_request(1, now+2)
|
||||||
ds.add_segment_error(1, now+3)
|
ds.add_segment_error(1, now+3)
|
||||||
|
# two outstanding requests
|
||||||
|
ds.add_segment_request(2, now+4)
|
||||||
|
ds.add_segment_request(3, now+5)
|
||||||
|
|
||||||
e = ds.add_dyhb_sent("serverid_a", now)
|
e = ds.add_dyhb_sent("serverid_a", now)
|
||||||
e.finished([1,2], now+1)
|
e.finished([1,2], now+1)
|
||||||
|
Loading…
Reference in New Issue
Block a user