diff options
Diffstat (limited to 'packages/meshbay-node/src/meshbay_node/transfers.py')
| -rw-r--r-- | packages/meshbay-node/src/meshbay_node/transfers.py | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/packages/meshbay-node/src/meshbay_node/transfers.py b/packages/meshbay-node/src/meshbay_node/transfers.py index 3345cb9..477ec92 100644 --- a/packages/meshbay-node/src/meshbay_node/transfers.py +++ b/packages/meshbay-node/src/meshbay_node/transfers.py @@ -102,11 +102,24 @@ class Lease: # later, for ever. Seen doing exactly that in a node's log, every 30 s, # minutes after the transfers involved had finished. missed_grants: int = 0 + # What moved under this lease and over how long, for the line the node logs + # when it ends. Counted here because nothing else spans a transfer: a + # download is a run of independent chunk requests. + moved: int = 0 + first_used: float | None = None + last_moved: float = 0.0 @property def member(self) -> tuple[str, str]: return (self.group_id, self.user_id) + @property + def elapsed(self) -> float: + """Seconds from the first request under this lease to the last byte.""" + if self.first_used is None: + return 0.0 + return max(0.0, self.last_moved - self.first_used) + @dataclass class TransferSlots: @@ -223,8 +236,18 @@ class TransferSlots: lease.used = True lease.missed_grants = 0 lease.last_seen = time.monotonic() if now is None else now + if lease.first_used is None: + lease.first_used = lease.last_seen return True + def account(self, tr: str, nbytes: int, now: float | None = None) -> None: + """`nbytes` were served or received under this lease.""" + lease = self.leases.get(tr) + if lease is None: + return + lease.moved += nbytes + lease.last_moved = time.monotonic() if now is None else now + def close(self, tr: str, reason: str = REASON_DONE, now: float | None = None) -> tuple[Lease | None, list[Lease]]: """Give a slot back. Returns (the closed lease, newly granted ones). |