0.9.0
A review of 0.8.0 — the release written to fix the previous review — found three more defects. A fix release nobody reviewed is the same shape as the thing it was fixing, so it was reviewed.
Fixed
-
With the remote as authority, a refused local write was swallowed. 0.8.0 fixed exactly this for
Authority::Localand left the mirror case: the authority takes the write, the local copy refuses it — a full disk is enough — and the caller got an error whiledivergences()stayed empty andcatch_up()was a no-op. Every later write then computed its expectation from the stale local revision and was refused by the authority for ever, with no record of why. It is recorded as a divergence now, saying which way round it happened. -
catch_upcould never clear a divergence against a replica at revision 0.NoneandSome(0)were collapsed, so a replica genuinely holding a revision-0 instance was givenExpect::Absent, which cannot match. Unreachable throughentity-core, which creates at revision 1 — and reachable for any third-partyStoreused as the replica, which is exactly who this protocol is for. -
Three refusal messages had lost their line continuations and carried 26 to 38 consecutive spaces into what a person reads.
Changed
-
The wire version is
entity.store/2.Answeris a tagged enum withdeny_unknown_fields, so adding a variant is a breaking wire change: a peer built against/1cannot decode{"answer":"refused"}. 0.8.0 addedRefusedandUnreachableand left the version at/1, which made the refusal undecodable by exactly the peer it exists to inform — it would have arrived as a decode failure, which is theBackendoutcome that change set out to avoid.A
/1peer is now refused by name, which is what a version is for.