mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-10-05 23:05:10 +00:00
fix(config): write config.json through one durable atomic writer (#611)
save_config() opened config.json with 'w' and streamed json.dump into it, so a power cut or an unencodable value left the file truncated. save_config_atomic() renamed a temp file into place but never fsynced it, rewrote the unchanged secrets file on every save, and re-parsed every backup to rotate them. save_raw_file_content() had its own third copy. All of them, plus rollback and config creation from the template, now go through atomic_write_text(): temp file in the same directory, fsync, final mode set before the rename, rename (retried on Windows while a reader holds the file), directory fsync. A root save copies the previous owner onto the new file so a rename by the display service no longer hands config.json to root; the shared-group fix-up is unchanged. The mode is chosen from the file name, so a "secrets" directory in the install path no longer makes config.json 0640. The secrets file is rewritten only when its content changes, and backup rotation works from filenames alone. Backups keep their names (config/backups/config.json.backup.<version>, paired secrets backup) and the five newest are kept, as before. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -44,6 +44,22 @@ core, the monorepo or the registry's third-party plugins calls them:
|
||||
`unregister_plugin_fonts`.
|
||||
- `PluginManager.get_enabled_plugins`.
|
||||
|
||||
### Config writes
|
||||
|
||||
- A power cut or crash mid-save can no longer leave `config/config.json`
|
||||
truncated. `ConfigManager.save_config()` wrote the file in place; it,
|
||||
`save_config_atomic()`, `save_raw_file_content()` and backup rollback now
|
||||
share one writer (`atomic_write_text` in `src/config_manager_atomic.py`)
|
||||
that fsyncs a temp file, renames it into place and fsyncs the directory.
|
||||
- `save_config_atomic()` no longer rewrites `config_secrets.json` on every
|
||||
save, only when its content changes, and rotating backups no longer re-reads
|
||||
every backup. The backups themselves are unchanged:
|
||||
`config/backups/config.json.backup.<version>` plus its paired secrets
|
||||
backup, five newest kept.
|
||||
- A save by the root-run display service keeps the file's previous owner
|
||||
instead of handing `config.json` to root, and an install path with
|
||||
"secrets" in a directory name no longer makes `config.json` mode 0640.
|
||||
|
||||
## 3.5.0
|
||||
|
||||
New modules a plugin may import via `src.*` (floor on 3.5.0):
|
||||
|
||||
Reference in New Issue
Block a user