fix: un State tardif EST la barriere, donc il est enregistre quand il arrive
En relisant ce que je venais d'ecrire dans le contrat - « si le document se synchronise plus tard et apporte des donnees, la lecture repond d'elle-meme » - j'ai constate que c'etait faux. `onState` sortait aussitot des lors que le repli borne avait deja termine l'ouverture, donc un `State` tardif etait jete : `"timed-out"` restait indefiniment sur un depot desormais synchronise, et le lecteur qui consulte cet etat ne pouvait jamais l'apprendre. Le repli veut dire « cette ouverture a cesse d'attendre », jamais « la barriere ne sera pas franchie » : l'abonnement n'est pas ferme, donc le `State` arrive encore. `onState` enregistre desormais `"synced"` avant le controle. `"timed-out"` -> `"synced"` est la seule transition ajoutee, et elle va de moins d'autorite vers plus ; les deux lecteurs de cette valeur la veulent ainsi. (dd) l'epingle : elle tombe si l'enregistrement repasse sous le controle.
This commit is contained in:
@@ -307,9 +307,17 @@ export async function openRepoUnguarded(nuri: Nuri): Promise<void> {
|
||||
});
|
||||
// Resolve on the first `State` (the sync BARRIER), marking the nuri "synced".
|
||||
const onState = (): void => {
|
||||
// The first `State` IS the barrier, WHENEVER it arrives. Recorded before the
|
||||
// already-settled check on purpose: the bounded fallback below only means "this
|
||||
// open stopped waiting", never "the barrier will not be crossed" - the
|
||||
// subscription is still held, so a `State` can still land afterwards. It used to
|
||||
// be dropped, which left `timed-out` standing for ever on a repo that had since
|
||||
// synced, and a reader consulting that state (`surface/use-shape-query.ts`) could
|
||||
// never learn better. `timed-out` -> `synced` is the only transition this adds,
|
||||
// and it is the one that goes from less authority to more.
|
||||
syncState.set(nuri, "synced");
|
||||
if (settled) return;
|
||||
settled = true;
|
||||
syncState.set(nuri, "synced");
|
||||
logStage("BARRIER " + shortNuri(nuri) + " synced (" + (Date.now() - barrierStartedAt) + "ms)");
|
||||
resolve();
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user