Repository navigation
snapshots: never of a save a sync is writing, never incomplete - #54
Conversation
|
@ChakraFusion is attempting to deploy a commit to the sivadaboi's projects Team on Vercel. A member of the Team first needs to authorize it. |
9073ebb to
1c40ee3
Compare
|
Rebased onto today's |
|
Thanks. The first half (an event overflow during a sync taken for the sync's) is good. One concern with discarding incomplete snapshots: a game that holds a file open the whole time it runs (a log or lock file) would then have every snapshot discarded while it runs, and since the safety copy before a sync fails too, the sync stops replacing files, all quietly. Could incomplete snapshots be discarded only for automatic ones, keeping the safety copy before a sync even if a file couldn't be read (as it was before)? And if a game's automatic snapshots keep failing, say so plainly rather than only in the log. |
… screen Asked in review: discarding every snapshot that could not read a file also discarded the copy kept before a sync replaces the save, and the sync then did not replace anything, quietly, for as long as a game held a file open (a log, a lock file). - Only the watcher's automatic snapshot (snapshot.CreateAutomatic) is discarded when it misses files; the watcher takes the change again at its next pass. Every other snapshot, the copy before a sync, restore or conflict above all, and one taken by hand, is kept with what could be read and a warning in the log, as before Liquid-co#54. - When a game's automatic snapshots come out incomplete three passes in a row, it is said on screen once, until one succeeds again: the files the game holds open, and that its changes are not backed up or synced until they can be read, usually once the game is closed. The text is in the catalogs (en, zh-CN), with a "common.open" key for the toast's button. Tests: an incomplete automatic snapshot is discarded, while one before replacing and one by hand are kept (a seam on the archive's file open makes a file unreadable on any system); the notice comes once per run of incomplete passes, again after a good snapshot, and never for other failures; the notice's wording, with the files beyond the first three counted. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1c40ee3 to
618d0cd
Compare
|
Good catch, thank you. Done (618d0cd):
Tests: discarded vs kept, per kind of snapshot (a seam on the archive's file open makes a file unreadable on any OS); the notice once per run, again after a good snapshot, never for other failures; its wording. |
|
Thanks, the changes look good and it's approved. Merging #55 just now conflicts with this in |
A pull of a save of many files overflowed the watcher's event queue again and again, and each overflow was taken for the game saving: an automatic snapshot of a half-pulled save every few seconds - 76 on one device for one pull - which pushed the complete ones out of retention. - The watcher asks whether a sync is writing the game (BeingWritten). If so, an overflow is taken for the sync's, and the burst is looked at only once the sync has finished. - A snapshot that could not read every file is discarded, not kept: it would stand in the history as a save that never existed. The watcher leaves the change unrecorded and takes it again at its next pass; a sync that needed the copy before replacing files does not replace them. - OpenSave's own temporary files (*.opensave.tmp) are never archived. Builds on the own-writes change (Liquid-co#23). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… screen Asked in review: discarding every snapshot that could not read a file also discarded the copy kept before a sync replaces the save, and the sync then did not replace anything, quietly, for as long as a game held a file open (a log, a lock file). - Only the watcher's automatic snapshot (snapshot.CreateAutomatic) is discarded when it misses files; the watcher takes the change again at its next pass. Every other snapshot, the copy before a sync, restore or conflict above all, and one taken by hand, is kept with what could be read and a warning in the log, as before Liquid-co#54. - When a game's automatic snapshots come out incomplete three passes in a row, it is said on screen once, until one succeeds again: the files the game holds open, and that its changes are not backed up or synced until they can be read, usually once the game is closed. The text is in the catalogs (en, zh-CN), with a "common.open" key for the toast's button. Tests: an incomplete automatic snapshot is discarded, while one before replacing and one by hand are kept (a seam on the archive's file open makes a file unreadable on any system); the notice comes once per run of incomplete passes, again after a good snapshot, and never for other failures; the notice's wording, with the files beyond the first three counted. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
618d0cd to
4dfe3f2
Compare
A game that keeps its settings beside its saves had one PC's graphics settings handed to every other: Crimson Desert's save/user_engine_option_save.xml, among others. The game database (Ludusavi manifest) already says which files are a game's settings: it tags them "config", as opposed to "save" - 16,700 entries. The index now keeps those (indexedGame.Config, index format v3, rebuilt once), and for each tracked game the ones inside its save folder become exclusion patterns relative to it (presets.DeviceSettings), matched component by component so a template's <storeUserId> wildcard meets the folder actually tracked. An entry tagged both is a save. A pattern that would cover the whole folder is never applied: a wrong exclusion loses saves, a missed one only syncs a setting. They are applied as the game's exclusion rules are, through one function everything that applies rules now takes them from (syncengine.Engine.IgnoreText), exactly like Liquid-co#52's launcher files: never synced in either direction, never deleted on another device, still in every snapshot, and kept on this device by a restore. The game's own rules come after them, so a "!" line brings one back; a per-game switch (games.sync_device_settings, migration 0040, "Sync these settings between devices too" in the configuration tab, with the files listed) syncs them all. The tab's new text is in the catalogs (en, zh-CN). The list changes without anyone writing a rule, at the first start with this build, so at start a game's last-snapshot hash is re-taken under the new list where the save is the one it was recorded for (daemon.adoptExclusionView); otherwise the watcher would snapshot and sync a game nobody played. The base agreed with each device needs nothing: the sync engine already translates a base recorded under other exclusions (Liquid-co#52). Toggling the switch goes through the same path as editing the rules. On top of Liquid-co#54, so the two merge one after the other (Liquid-co#52 is merged). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entries for Liquid-co#90, Liquid-co#78, Liquid-co#80, Liquid-co#54, Liquid-co#52, Liquid-co#94 and Liquid-co#79 under Fixed; Liquid-co#84, Liquid-co#55, Liquid-co#53 and Liquid-co#74 under Changed; Liquid-co#73 under Added.
As offered in #21. Builds on #23 (own writes), which it needs for the watcher's own/other classification.
BeingWritten), is now taken for the sync's. A burst is looked at only once no sync is writing the game at that moment (WritingNow), so a change the game makes right after a pull is still snapshotted at once.*.opensave.tmpfiles are never archived.(The fork version also limits #26's "mirror the peer's snapshot when already in sync" to games without history. That part will follow #26.)
🤖 Generated with Claude Code