A pull takes the commit lease only when .commit.lock exists. Without it (no writer has created one yet, or the store was copied without it) the reader loaded with no lease, and a writer committing between its manifest read and its page reads left it with a vanished page or a stale manifest. An unleased pull now keeps its load only if the manifest bytes it read are still current afterwards; a changed manifest, or a named page that is missing or fails its content hash, reloads it, at most five times, and a pull that has not settled by then throws. A retry takes the lease once a writer has created it. Opening still creates nothing. The lease comment no longer claims a missing lock means no writer ever committed, and the store composition contract states the rule. The test deletes the lock from a seeded store and commits from a second cache through an internal seam between the manifest read and the page reads, once replacing the page the reader named and once only adding a key. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
13 lines
527 B
XML
13 lines
527 B
XML
<Project Sdk="Microsoft.NET.Sdk">
|
|
<PropertyGroup>
|
|
<Description>File-based MessagePack backing store for CultCache</Description>
|
|
<NoWarn>$(NoWarn);CS1591</NoWarn>
|
|
</PropertyGroup>
|
|
|
|
<ItemGroup>
|
|
<ProjectReference Include="..\GameCult.Caching\GameCult.Caching.csproj" />
|
|
<PackageReference Include="MessagePack" Version="3.1.7" />
|
|
<PackageReference Include="MessagePackAnalyzer" Version="3.1.7" PrivateAssets="all" />
|
|
<InternalsVisibleTo Include="GameCult.Caching.Tests" />
|
|
</ItemGroup>
|
|
</Project>
|