core icon indicating copy to clipboard operation
core copied to clipboard

feat: add logging to streams

Open link2xt opened this issue 6 months ago • 0 comments

LoggingStream is a wrapper for IMAP/SMTP/HTTP session streams. Originally I started building it with the idea to debug #6477 and similar issues where IMAP loop gets stuck with the hope that right before the loop gets stuck or even continuously there are socket errors like a read timeout that are not treated correctly.

Now I also think about expanding it for measuring network performance, e.g. throughput and latency.

We can estimate latency by measuring the time between the last full write() and the first successful read(). This should measure e.g. the time between writing "A0001 IDLE" and receiving "+", but not the time when we are in a long read() actually idling. This latency might however actually be low on throttled connections and not reflect that message downloading is slow. If throttling works as a rate limiter and not some hack like random packet dropping, then latency will not increase.

For throughput it's possible to measure something by averaging over the intervals from first read after full write until the end of last read followed by a write. We don't run multiple IMAP commands in parallel, so this should be a good estimation.

When connecting to servers we currently sort IPs as at most two IPs returned from DNS followed by DNS cache, followed by the rest of DNS results. If we have throughput estimations, we may sort by the expected (sampled from empirical distribution) throughput and avoid connecting to IP addresses that are known to be slow or timeout frequently due to congestion or bad routing over low-rate or high packet loss connections.

link2xt avatar Jun 18 '25 20:06 link2xt