From b7a53e39036dc9c1687fa9d0228fd5b3ea290baa Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 28 Jul 2026 21:48:41 +0700 Subject: [PATCH 01/11] fix(dashmate)!: stop read-only commands rewriting config and clobbering concurrent updates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `Config`'s constructor delegated to `setOptions()`, which marks the config changed, so every config was dirty the moment it was read off disk. `BaseCommand.finally()` persists the whole config file whenever anything is dirty, so every successful command — including pure readers like `config get` and `core cli` — rewrote `config.json` from its own load-time snapshot. That turns any overlapping pair of commands into a lost update: a reader loads at T0, `config set` writes and exits 0 at T1, and the reader writes its stale snapshot at T2. The setting silently reverts even though `config set` reported success. It is invisible in single-process use because re-serializing an unchanged config is byte-identical. - Hydrating a config no longer marks it changed. Callers that build a config which must reach disk already mark it explicitly. - Rendering service templates no longer clears persistence state; the repository clears it, and only after the write actually succeeds. - Writes are atomic (`write-file-atomic`, preserving file mode — `config.json` holds masternode keys, RPC passwords and SSL API keys). - A write is refused when the file changed on disk since it was read, under a short `proper-lockfile` lock held only across compare-and-replace, never for the duration of a command. The refused state is parked next to `config.json` so material generated during the command is never lost. The lock is cooperative and scoped to local filesystems; both limits are documented for operators. BREAKING CHANGE: a command that would have silently overwritten a concurrent configuration change now fails with a non-zero exit and `ConfigFileConflictError`. Automation that relied on the previous last-writer-wins behaviour will now see failures where it previously saw silent data loss. Tests would have caught this in CI: hydrated config is clean ✖ before → ✔ after stale write refused, not clobbering ✖ before → ✔ after concurrent first-run write refused ✖ before → ✔ after deleted config file not resurrected ✖ before → ✔ after saved flags cascade only after a write ✖ before → ✔ after waits for a lock held by another process ✖ before → ✔ after The lock test spawns a real second process and fails without the lock (write completes in 13ms instead of waiting 700ms), so it pins the lock rather than the staleness comparison. Closes #4242 Co-Authored-By: Claude Opus 5 --- .pnp.cjs | 23 +- ...ckfile-npm-4.1.2-a140a3c928-000a4875f5.zip | Bin 0 -> 10872 bytes ...atomic-npm-5.0.1-52283db6ee-648efddba5.zip | Bin 0 -> 5454 bytes packages/dashmate/docs/config/index.md | 49 +++ packages/dashmate/package.json | 4 +- packages/dashmate/scripts/helper.js | 8 +- packages/dashmate/src/config/Config.js | 8 +- .../configFile/ConfigFileJsonRepository.js | 163 ++++++++- .../config/errors/ConfigFileConflictError.js | 49 +++ .../dashmate/src/oclif/command/BaseCommand.js | 19 +- .../templates/writeConfigTemplatesFactory.js | 2 - .../dashmate/test/unit/config/Config.spec.js | 37 ++ .../ConfigFileJsonRepository.spec.js | 342 ++++++++++++++++++ yarn.lock | 23 ++ 14 files changed, 707 insertions(+), 20 deletions(-) create mode 100644 .yarn/cache/proper-lockfile-npm-4.1.2-a140a3c928-000a4875f5.zip create mode 100644 .yarn/cache/write-file-atomic-npm-5.0.1-52283db6ee-648efddba5.zip create mode 100644 packages/dashmate/src/config/errors/ConfigFileConflictError.js create mode 100644 packages/dashmate/test/unit/config/configFile/ConfigFileJsonRepository.spec.js diff --git a/.pnp.cjs b/.pnp.cjs index 062aa0f7409..f2c82efb91a 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -9698,6 +9698,7 @@ const RAW_RUNTIME_STATE = ["oclif", "npm:4.0.3"],\ ["pretty-bytes", "npm:5.6.0"],\ ["pretty-ms", "npm:7.0.1"],\ + ["proper-lockfile", "npm:4.1.2"],\ ["public-ip", "npm:6.0.1"],\ ["qs", "npm:6.15.0"],\ ["rxjs", "npm:6.6.7"],\ @@ -9707,7 +9708,8 @@ const RAW_RUNTIME_STATE = ["systeminformation", "npm:5.31.1"],\ ["table", "npm:6.8.1"],\ ["tar", "npm:7.5.10"],\ - ["wrap-ansi", "npm:7.0.0"]\ + ["wrap-ansi", "npm:7.0.0"],\ + ["write-file-atomic", "npm:5.0.1"]\ ],\ "linkType": "SOFT"\ }]\ @@ -18295,6 +18297,16 @@ const RAW_RUNTIME_STATE = ["signal-exit", "npm:3.0.7"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:4.1.2", {\ + "packageLocation": "./.yarn/cache/proper-lockfile-npm-4.1.2-a140a3c928-000a4875f5.zip/node_modules/proper-lockfile/",\ + "packageDependencies": [\ + ["graceful-fs", "npm:4.2.10"],\ + ["proper-lockfile", "npm:4.1.2"],\ + ["retry", "npm:0.12.0"],\ + ["signal-exit", "npm:3.0.7"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["protobufjs", [\ @@ -23536,6 +23548,15 @@ const RAW_RUNTIME_STATE = ["write-file-atomic", "npm:4.0.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:5.0.1", {\ + "packageLocation": "./.yarn/cache/write-file-atomic-npm-5.0.1-52283db6ee-648efddba5.zip/node_modules/write-file-atomic/",\ + "packageDependencies": [\ + ["imurmurhash", "npm:0.1.4"],\ + ["signal-exit", "npm:4.1.0"],\ + ["write-file-atomic", "npm:5.0.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["ws", [\ diff --git a/.yarn/cache/proper-lockfile-npm-4.1.2-a140a3c928-000a4875f5.zip b/.yarn/cache/proper-lockfile-npm-4.1.2-a140a3c928-000a4875f5.zip new file mode 100644 index 0000000000000000000000000000000000000000..a7389ae2254e451f1b1c32d2d47216d0060b9216 GIT binary patch literal 10872 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 literal 0 HcmV?d00001 diff --git a/.yarn/cache/write-file-atomic-npm-5.0.1-52283db6ee-648efddba5.zip b/.yarn/cache/write-file-atomic-npm-5.0.1-52283db6ee-648efddba5.zip new file mode 100644 index 0000000000000000000000000000000000000000..4b1680c8f312504b3ec0c7db9bebac9744290436 GIT binary patch literal 5454 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 literal 0 HcmV?d00001 diff --git a/packages/dashmate/docs/config/index.md b/packages/dashmate/docs/config/index.md index a81ac218c61..a9c7502569c 100644 --- a/packages/dashmate/docs/config/index.md +++ b/packages/dashmate/docs/config/index.md @@ -179,3 +179,52 @@ dashmate config get