diff options
| author | user <user@clank> | 2026-08-13 00:05:16 +0200 |
|---|---|---|
| committer | user <user@clank> | 2026-08-13 00:05:16 +0200 |
| commit | 2d94131b0f10da208106ee842f054836d6dfb3b9 (patch) | |
| tree | b39176385a6e2b04b5ed27e00afb40e4d5bec0b2 | |
| parent | sl0p: stop suspended panes spamming resize errors (diff) | |
| download | sl0ppi-2d94131b0f10da208106ee842f054836d6dfb3b9.tar.gz sl0ppi-2d94131b0f10da208106ee842f054836d6dfb3b9.tar.xz sl0ppi-2d94131b0f10da208106ee842f054836d6dfb3b9.zip | |
docs: locate the remaining action flakiness in assert_socket
Records the exact function and the two defects in it (judging liveness on the
first message received, and deleting a live socket on a transient
ConnectionRefused), plus what the resize fix did and did not solve. The
handshake change is deliberately left unmade rather than rushed.
| -rw-r--r-- | VERSION | 2 | ||||
| -rw-r--r-- | docs/roadmap.md | 30 |
2 files changed, 29 insertions, 3 deletions
@@ -1 +1 @@ -0.1.1 +0.1.2 diff --git a/docs/roadmap.md b/docs/roadmap.md index 77086ed..22fd270 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -145,8 +145,34 @@ The CLI works around it (idempotent reads are retried with backoff, which took consumer of `zellij action` on a slow machine will hit this, and most will conclude their session is dead. -Not yet investigated: whether it reproduces upstream, and whether it is a -socket-connect timeout or a race in session enumeration. +**Partly fixed in `sl0p: stop suspended panes spamming resize errors`.** Half of +it was self-inflicted: every resize logged one error per `start_suspended` pane +on the server's hot path, and sl0ppi puts a suspended agent in every project. On +the same box that took `list-tabs` against a two-suspended-pane session from +5/12 failing to 6/30, with the error storm gone entirely (126+ -> 0). + +**The remaining ~25% is a real IPC bug, and it is now located.** Every +`zellij action` calls `sessions.rs::assert_socket()`, which connects to the +session socket, sends `ConnStatus`, and waits for exactly `Connected`: + +```rust +match receiver.recv_server_msg() { + Some((ServerToClientMsg::Connected, _)) => true, + None | Some((_, _)) => false, // <- anything else means "dead" +} +``` + +So a server that is momentarily busy, or that happens to send a different +message first, is reported as **no session at all** -- which is why the failure +surfaces as "There is no active session!" against a session that is demonstrably +alive. Worse, the `ConnectionRefused` arm above it `remove_file`s the socket, so +a transient refusal can delete a live session's socket. + +Proposed fix (not yet made, because it changes the client/server handshake and +deserves its own session): read messages for a short bounded window looking for +`Connected` rather than judging on the first one, and do not delete a socket on +a single refusal. The attach-time "lost connection to the server" drop is a +different path (the client's receive loop) and needs separate measurement. ## Standing risks |
