mirror of
https://github.com/narrrl/proton-drive-linux.git
synced 2026-11-03 16:41:26 +01:00
fix(cli): leave the runtime running on a stop so stragglers cannot panic
A stop shut the tokio runtime down after joining the workers it owns. Threads it never joins, such as a size lookup or a profile backup that a request started during the stop, then panicked on their next timer with "A Tokio 1.x context was found, but it is being shutdown". The process exits right after a stop, so the runtime is now left for the exit to end. A mount that is retried still shuts its runtime down with the 2 s limit. The acceptance journal check now counts panics, and no longer counts the ENOENT reply errors a stop causes by aborting its FUSE connections. docs/BUGS.md B276.
This commit is contained in:
1 parent
9460c93b50
commit
176112a9cb
4 files changed
+150
-9
No files matched your search
@@ -3561,8 +3561,36 @@ JOURNAL_WARNINGS = (
|
||||
"queued write conflicts; keeping a conflict copy",
|
||||
"a fuse worker has held the same job for a long time",
|
||||
"re-interned an authority missing from the local tree",
|
||||
# A Rust panic goes to stderr without a tracing level, so the ERROR match
|
||||
# does not see it (`docs/BUGS.md` B276).
|
||||
"panicked at",
|
||||
)
|
||||
|
||||
# A stop aborts each mount's FUSE connection so the unmount cannot hang. A
|
||||
# request still running then replies into a connection the kernel has
|
||||
# closed, and the kernel refuses that reply with ENOENT. While a stop is in
|
||||
# progress that error is expected (`docs/BUGS.md` B276); at any other time it
|
||||
# still counts.
|
||||
STOP_STARTED = "aborted FUSE connection to unblock unmount"
|
||||
STOP_ENDED = ("daemon stopping", "control socket listening")
|
||||
LATE_REPLY = "Failed to send FUSE reply: No such file or directory"
|
||||
|
||||
|
||||
def journal_problems(lines: list[str]) -> list[str]:
|
||||
"""The lines of `lines` that count as problems."""
|
||||
problems = []
|
||||
stopping = False
|
||||
for line in lines:
|
||||
if STOP_STARTED in line:
|
||||
stopping = True
|
||||
elif any(marker in line for marker in STOP_ENDED):
|
||||
stopping = False
|
||||
if stopping and LATE_REPLY in line:
|
||||
continue
|
||||
if ERROR_LEVEL.search(line) or any(warning in line for warning in JOURNAL_WARNINGS):
|
||||
problems.append(line)
|
||||
return problems
|
||||
|
||||
|
||||
def read_journal(unit: str, since: float) -> list[str] | None:
|
||||
"""The unit's journal lines since `since`, or None without journalctl.
|
||||
@@ -3621,11 +3649,7 @@ class JournalWatch:
|
||||
# Filtering on syslog priority (`-p err`) finds nothing: the daemon writes
|
||||
# tracing levels as text on stdout, which journald files at the unit's
|
||||
# default priority. Match the level token instead.
|
||||
return [
|
||||
line
|
||||
for line in lines
|
||||
if ERROR_LEVEL.search(line) or any(warning in line for warning in JOURNAL_WARNINGS)
|
||||
]
|
||||
return journal_problems(lines)
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
Reference in new issue
Block a user