fix(environment): share write overlap and check clocks on earlier calls
Observation search skips a read begun before the write ended. That comparison now uses the same overlap as the check path. A clock learned on a later call was not checked against earlier calls that kept the field. Serving would stamp those calls too, so the plan stays unserved. A clock learned earlier is still refused when a later call does not advance it. Regression tests cover an overlapping empty update and a published_at clock that one recorded call leaves unchanged. Co-authored-by: morluto <morluto@users.noreply.github.com>
This commit is contained in:
4 files changed
+129
-4
No files matched your search
@@ -19,12 +19,16 @@ export type PendingTargets = Map<
|
||||
{ until: number; readonly at: Map<string, number> }
|
||||
>;
|
||||
|
||||
/** Whether a write that ended at `until` was still running when a read began at `start`, so the read may show either state. */
|
||||
export const overlapsWrite = (until: number, start: number): boolean =>
|
||||
until > start;
|
||||
|
||||
/** Whether a modelled write to the target was still running when a read began at `start`, so the read may show either state. */
|
||||
export const runningAt = (
|
||||
pending: PendingTargets,
|
||||
key: string,
|
||||
start: number,
|
||||
): boolean => (pending.get(key)?.until ?? -Infinity) > start;
|
||||
): boolean => overlapsWrite(pending.get(key)?.until ?? -Infinity, start);
|
||||
|
||||
/** The tools whose writes a read exercises: those that changed its targets since they were last checked, less those that borrowed the read to learn their effect. */
|
||||
export const exercisedBy = (
|
||||
|
||||
Reference in new issue
Block a user