aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/src/meshbay_node/transport/webrtc/transfer_handlers.py
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-node/src/meshbay_node/transport/webrtc/transfer_handlers.py')
-rw-r--r--packages/meshbay-node/src/meshbay_node/transport/webrtc/transfer_handlers.py32
1 files changed, 32 insertions, 0 deletions
diff --git a/packages/meshbay-node/src/meshbay_node/transport/webrtc/transfer_handlers.py b/packages/meshbay-node/src/meshbay_node/transport/webrtc/transfer_handlers.py
index 729c0a0..78c74d6 100644
--- a/packages/meshbay-node/src/meshbay_node/transport/webrtc/transfer_handlers.py
+++ b/packages/meshbay-node/src/meshbay_node/transport/webrtc/transfer_handlers.py
@@ -11,6 +11,7 @@ from meshbay_common.protocol import MNP
from meshbay_node import transfers as transfers_mod
from meshbay_node.transfers import TransferSlots
+from meshbay_node.transport.webrtc import sctp_stats
from meshbay_node.transport.webrtc.limits import LEASE_GRANTED, LEASE_NONE, LEASE_QUEUED
log = logging.getLogger("meshbay_node.transport.webrtc_server")
@@ -25,6 +26,8 @@ if TYPE_CHECKING: # annotations only: the facade imports this module
# noticing, so it trades latency for a timer that hardly ever runs.
TRANSFER_SWEEP_SECS = 15
+MIB = 1024 * 1024
+
class TransferMixin:
def _slots(self) -> "TransferSlots":
@@ -109,6 +112,29 @@ class TransferMixin:
(self._user_id or "?")[:8], str(tr)[:8])
self._audit("transfer_unleased", str(tr)[:16])
+ def _account(self, tr: str, nbytes: int) -> None:
+ slots = self._ctx.get("_transfer_slots")
+ if slots is not None:
+ slots.account(tr, nbytes)
+
+ def _transfer_end_line(self, lease, reason: str) -> str:
+ """What a transfer moved, how fast, and what its association looked like.
+
+ The node wrote nothing about throughput, so a slow download left no
+ trace in the journal and took a test bench to explain. The SCTP figures
+ are the association's totals since it opened, not this transfer's
+ share: a connection carries several transfers and they share one
+ window.
+ """
+ line = (f"transfer: end {lease.kind} {lease.tr[:8]} {reason} "
+ f"{lease.moved / MIB:.1f} MB")
+ if lease.moved and lease.elapsed > 0:
+ line += (f" in {lease.elapsed:.1f} s "
+ f"({lease.moved / MIB / lease.elapsed:.2f} MB/s)")
+ owner = (self if lease.session_key == self._registry_key else
+ next(iter(self._sessions_everywhere(lease.session_key)), None))
+ return line + sctp_stats.describe(getattr(owner, "_pc", None))
+
def _transfer_state_msg(self, lease, state: str, reason: str = "") -> dict:
slots = self._slots()
out = {
@@ -215,6 +241,7 @@ class TransferMixin:
lease, granted = slots.close(tr, reason)
if lease is not None:
self._send(self._transfer_state_msg(lease, "closed", reason))
+ log.info("%s", self._transfer_end_line(lease, reason))
self._announce(granted)
def _release_transfers(self) -> None:
@@ -223,6 +250,9 @@ class TransferMixin:
if slots is None:
return
gone, granted = slots.release_session(self._registry_key)
+ for lease in gone:
+ log.info("%s", self._transfer_end_line(
+ lease, transfers_mod.REASON_SESSION_GONE))
if gone:
log.info("transfer: session gone, released %d (%s)",
len(gone), slots.summary())
@@ -251,6 +281,8 @@ class TransferMixin:
ended, granted = slots.sweep()
for lease, reason in ended:
log.info("transfer: reclaimed %s (%s)", lease.tr[:8], reason)
+ if lease.state != "queued":
+ log.info("%s", self._transfer_end_line(lease, reason))
self._announce(granted, ended)
log.debug("transfer: %s", slots.summary())