7.4 KiB
058 — db-worker-node revision and CLI server list compatibility
Summary
This plan proposes three related improvements to align db-worker-node runtime metadata with logseq-cli versioning:
- Add
--versionsupport todb-worker-node. - Persist
revisionindb-worker.lock. - Extend
logseq-cli server listwith aREVISIONcolumn and a compatibility warning when server revision differs from local CLI revision.
The goal is to make version drift observable and debuggable in multi-process and multi-version environments.
Product decisions (locked)
-
Mismatch rule: if revision/commit strings are not exactly equal, it is a mismatch.
- No normalization.
- No short-hash expansion.
- No suffix stripping.
-
Warning scope: mismatch warning is shown only in human output.
- JSON output must not include human warning text.
Background
Current behavior:
logseq-cli --versionalready prints build metadata includingRevision.db-worker-nodeaccepts operational flags (--repo,--data-dir, etc.) but does not expose--version.db-worker.lockdoes not include revision metadata.logseq-cli server listshows process/state fields (GRAPH,STATUS,HOST,PORT,PID,OWNER) but not revision.
As a result, users cannot quickly determine whether a running DB worker matches the CLI binary currently used to manage it.
Goals
- Expose
db-worker-noderevision consistently with CLI version semantics. - Persist server revision in lock metadata for later discovery.
- Surface revision in
server listoutput. - Warn users when a listed server revision does not match local CLI revision (human output only).
Non-goals
- No protocol change for worker RPC endpoints.
- No forced auto-restart or auto-migration for mismatched servers.
- No hard failure on mismatch (warning only).
Design
1) Add --version to db-worker-node
Behavior
db-worker-node --versionprints version metadata and exits with code0.- It must not require
--repo. - Output must include at least
Revision: <value>. - Formatting should follow
logseq-cli --versionstyle for consistency.
Implementation shape
- Extend argument parsing in
db_worker_node.cljsto recognize--version. - Add an early return branch in
mainbefore repo validation. - Introduce a worker-side version namespace using
goog-definevalues injected at build time.
2) Add revision to lock file
Behavior
- Lock creation writes
:revision. - Lock update preserves existing revision and remains backward compatible with old lock files.
- Reading old lock files without revision continues to work.
Implementation shape
- Add revision retrieval at lock write point.
- Extend
create-lock!payload indb_worker_node_lock.cljs. - Adjust
update-lock!merge/preserve behavior.
3) Show revision in server list and warn on mismatch
Behavior
- Add
REVISIONcolumn to human table output. --format jsonincludes per-serverrevisionfield.- Mismatch warning text appears only in human output.
- Missing revision should render as
-and should not crash formatting.
Mismatch rule (exact string)
Given:
- local CLI revision =
cli-rev - server lock revision =
server-rev
Then:
- mismatch if
cli-rev != server-rev(exact string compare) - no normalization at either side
Implementation shape
- Extend server discovery result in
logseq.cli.server/list-serversto include:revision. - Compute mismatch server set in command/data path (
server listexecute path), then pass structured mismatch info to formatter. - Render warning block only in human formatter path.
Build metadata strategy
Use the same metadata source philosophy as logseq-cli:
-
Revision source priority:
LOGSEQ_REVISIONenv- git describe output
- fallback
"dev"
-
Build-time source priority:
LOGSEQ_BUILD_TIMEenv- current UTC timestamp
For db-worker-node, inject closure defines through its shadow build target, analogous to existing CLI metadata injection.
Implementation plan (task list)
- Add worker version namespace and shadow metadata wiring.
- Add
--versionparse + main dispatch branch indb_worker_node.cljs. - Add
:revisionfield indb-worker.lockcreate/update path. - Extend
server listdata model with revision. - Extend table formatter with
REVISIONcolumn. - Add mismatch detection (exact string compare) and pass structured mismatch data.
- Render mismatch warning in human output only.
- Add/update tests for all paths.
- Update CLI documentation.
Testing plan
Unit tests
-
db_worker_node_test.cljs- Add case:
--versionrecognized and exits early without repo. - Validate output includes
Revision.
- Add case:
-
db_worker_node_lock_test.cljs- Create lock includes
:revision. - Update lock preserves existing revision.
- Legacy lock without revision remains supported.
- Create lock includes
-
format_test.cljs- Human
server listtable includesREVISIONcolumn. - Missing revision renders
-. - Mismatch warning block appears in human output for exact-string mismatch.
- No warning block when revisions are equal.
- Human
-
server_test.cljs(or equivalent)- Discovery output includes revision extracted from lock.
- Mismatch set computed with exact string comparison.
-
JSON output tests
server list --format jsoncontains per-serverrevision.- JSON output does not contain human warning text.
Regression checks
- Existing
logseq-cli --versiontests remain green. - Existing server list owner/status formatting remains unchanged aside from the added
REVISIONcolumn and optional warning block in human mode.
Rollout and compatibility
- Backward compatible with existing lock files.
- New clients can read old locks (revision absent).
- Old clients can ignore new lock key (
revision) if parser is permissive map decode.
Risks and mitigations
-
Risk: db-worker build target missing metadata hook.
- Mitigation: add explicit hook wiring and test fallback value (
dev) in test target.
- Mitigation: add explicit hook wiring and test fallback value (
-
Risk: warning noise in mixed environments.
- Mitigation: warning remains informational and human-only.
-
Risk: flaky tests due to dynamic metadata.
- Mitigation: use deterministic test defines in shadow test config.
Acceptance criteria
db-worker-node --versionprints revision and exits0without requiring repo args.db-worker.lockwritten by worker includesrevision.logseq-cli server list(human) showsREVISIONcolumn.logseq-cli server list(human) prints mismatch warning when local CLI revision string is not exactly equal to server revision string.logseq-cli server list --format jsonincludes server revision data and does not include human warning text.- Added/updated tests cover happy path and backward-compatibility path.
File scope (expected)
src/dev-cljs/shadow/hooks.cljshadow-cljs.ednsrc/main/frontend/worker/db_worker_node.cljssrc/main/frontend/worker/db_worker_node_lock.cljssrc/main/frontend/worker/version.cljs(new)src/main/logseq/cli/server.cljssrc/main/logseq/cli/command/server.cljssrc/main/logseq/cli/format.cljssrc/test/frontend/worker/db_worker_node_test.cljssrc/test/frontend/worker/db_worker_node_lock_test.cljssrc/test/logseq/cli/format_test.cljssrc/test/logseq/cli/server_test.cljsdocs/cli/logseq-cli.md