Replacing a blob does not purge the pull-zone cache, so verify can pass while clients still get the bad bytes #89
Notifications
Due Date
No due date set.
Blocks
#75 Acceptance gate: a real NWN client syncs from an assembled manifest on the Bunny zone
ShadowsOverWestgate/sow-tools
Reference: ShadowsOverWestgate/sow-tools#89
Reference in New Issue
Block a user
emit --verify(#85, PR #87) replaces a bad blob in thesow-syncstorage zone. Players read thenwsync.westgate.pwpull zone in front of it (pull zone6046370, sow-platform ADR-0029). Nothing purges the edge after a replacement.A blob's name is its content hash, so under normal operation an object is written once and never changes — which is exactly why caching it forever is correct, and why nobody needed a purge until now. The #86 repair breaks that assumption for the first time: the same key must now serve different bytes than it did before.
The trap this sets
crucible nwsync verifyreads through the pull zone, on purpose — what matters is what a client gets. That is the right choice and it makes this failure mode confusing rather than obvious:So the ambiguity is not cosmetic. It makes verify's verdict unreliable during precisely the window where the verdict matters most.
What to decide
Cheapest thing that resolves the ambiguity, roughly in order of laziness:
emit --verify. Only the keys it actually replaced, which is normally none. It needs a pull-zone API credential thatemitdoes not have today, which is the real cost.Whichever way it goes, verify's exit code needs to be trustworthy or documented as not-yet-trustworthy after a repair. A check that answers differently per PoP and does not say so is worse than no check.
Also worth confirming while looking: whether the pull zone is caching 404s. A blob fetched before it was published, then negative-cached, is the same class of stale answer.
Refs #85, #86, #88, #75, sow-platform ADR-0029.