Repository navigation
Conversation
A read-only curses dashboard for debugging job polling: shows all users' jobs and status transitions, per-user worker subprocesses, which server process holds the poll lock (with mtime heartbeat), live scheduler commands (bsub/bjobs/bkill) as they spawn, an event feed, an optional bjobs cross-check that flags DB/scheduler mismatches, and a live-follow log viewer (stdout/stderr/script) per job. Runs via 'fileglancer debug' or 'pixi run debug-launch'; stdlib-only so the published wheel needs no new dependencies. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The overlay was bound to a table position, so when the jobs table re-sorted (new job arrived, status changed) a different job slid into the selected row and the overlay silently switched to it. Pin the overlay to the job id at open time: its own fields still refresh live, but it never changes jobs. Closing re-anchors the table selection to the viewed job, and o/e/s from the overlay open logs for the pinned job rather than the drifted selection. The work-dir prober now targets whatever is being viewed (log job, then detail job, then selection). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The poll lock and its mtime heartbeat are host-local, so when the watched database belongs to a server on another machine they described the wrong host — a stale leftover lock file plus active jobs raised a permanent false "NO POLL ACTIVITY" alarm. When no fileglancer server process is found on this host, show POLLER/heartbeat as n/a instead, and label the process and scheduler panes "(this host)". Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The header and the "watching db" event (which also lands in the --log file) showed the full db_url, leaking user:password for postgres URLs. Strip credentials to scheme://***@host/db for display so it is still clear where the tool connects; only the connection itself uses the raw URL. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
pixi.lock is now format version 7 (from local pixi 0.70.2), but CI was pinned to v0.65.0 which doesn't support that lock-file version, failing every build/integration job before it reached any real work.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this adds
A read-only curses dashboard for debugging the job system, runnable as
fileglancer debug(works viauvx fileglancer debugonce released) orpixi run debug-launch. Single file (fileglancer/debug.py), stdlib-only — no new dependencies in the wheel.Panes
atoggles active-only vs all. Enter opens a detail overlay (DB fields, work-dir file probe, stderr tail) pinned to the job it was opened on.● POLLER.bsub/bjobs/bkillcommands as they spawn under workers, caught by /proc sampling.--log FILEappends the feed to a file for post-mortem analysis.o/e/s): full-screen live tail of a job's stdout/stderr/script with follow mode, scrolling, and panning. Tails the last 256 KB so multi-GB HPC logs are safe.How it observes
Each data source is sampled by its own background thread so a slow source (NFS stat, bjobs) never blocks the UI: the DB (jobs table snapshots, diffed into events), /proc (processes + the flock holder of the poll lock file, whose mtime doubles as a poll heartbeat), job work directories (phase/service_url/job.pid/log sizes), and optionally the scheduler itself — the
bkey enables a bjobs cross-check that flags rows where LSF disagrees with the DB.The cross-check found a real production bug on its first day: the DB stuck at PENDING while bjobs said RUN for other users' jobs, diagnosed as the name-filtered polling visibility issue fixed in JaneliaSciComp/py-cluster-api#3.
Behavior notes
postgresql://***@host/db) in the header, event feed, and--logoutput.Testing
Driven end-to-end in a pty with a seeded database: dashboard rendering, poll-lock holder detection (flock held by a child process, matched via /proc/locks), live status-transition events, detail-overlay pinning while the table re-sorts, log viewer follow mode picking up live appends, file switching, credential redaction (screen + log file), and remote-DB mode simulated in an unprivileged PID namespace (
unshare --mount-proc) to verify the n/a header path.@StephanPreibisch @JaneliaSciComp/fileglancer