C2a fix: a flattened record is marked by the document it stores; every writer decides its header by content
A flattened variant's HoldsIds is read off the document re-resolved against the post-batch base, not carried from the variant or from the document the flatten was planned against. The conditional commit onto a file decides by the same rule as the unconditional commit (ids in the records the file will hold, ids only this cache minted excepted, a marked file staying marked). The directory manifest's header choice moves beside FormatFor. Pins the three-batch flatten probe on the commit and flush paths, the conditional commit, the last id leaving, an id-bearing override that is not the last, and a failed CultMesh write giving its ids back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
9ed61dd290
commit
6a7d17bdda
5 changed files with 153 additions and 10 deletions
|
|
@ -15,10 +15,8 @@ namespace GameCult.Caching.MessagePack;
|
|||
// A small hot manifest indexes the store; each record lives in one cold content-addressed page.
|
||||
public sealed class DirectoryMessagePackBackingStore : CacheBackingStore
|
||||
{
|
||||
private const string IndexedFormatVersion = "cultcache.store.v4.directory-content-addressed-pages";
|
||||
// The manifest of a directory that holds element ids: a reader older than ids refuses it, because it would skip the id
|
||||
// slots of a page and rewrite the elements without them.
|
||||
private const string IndexedFormatVersionWithIds = "cultcache.store.v5.directory-content-addressed-pages";
|
||||
private const string IndexedFormatVersion = CultPersistedStoreSnapshot.DirectoryFormatV4;
|
||||
private const string IndexedFormatVersionWithIds = CultPersistedStoreSnapshot.DirectoryFormatV5;
|
||||
// An unleased load that has not settled after this many attempts throws.
|
||||
private const int UnleasedLoadAttempts = 5;
|
||||
private readonly FileInfo _manifestFile;
|
||||
|
|
@ -305,7 +303,7 @@ public sealed class DirectoryMessagePackBackingStore : CacheBackingStore
|
|||
{
|
||||
var manifest = new CultPersistedStoreSnapshot
|
||||
{
|
||||
FormatVersion = carriesElementIds ? IndexedFormatVersionWithIds : IndexedFormatVersion,
|
||||
FormatVersion = CultPersistedStoreSnapshot.DirectoryFormatFor(carriesElementIds),
|
||||
SchemaCatalog = catalog,
|
||||
Records = index
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue