Call graph: a briefly busy store reads as busy, not absent

AF
3d ago
+1150-120

Accepted agent delivery; branch-keyed search descriptor included.


Summary by cubic

Fixes call graph reads during transient SQLite lock contention so a busy store is reported as busy or pending instead of absent, avoiding misleading cold rebuilds and letting maintenance retry.

  • Readonly readiness probes propagate SQLite busy/locked errors as retryable instead of treating them as evidence the store is absent; each caller bounds its probe wait, and an old waiter on a consumed channel cannot retire the retry.
  • A published generation whose reopen probe is busy stays pending; the consumed completion is replaced with an epoch-fenced retry channel so later drains retry the reopen and retain force tokens and pending paths.
  • aft_inspect keeps dead-code results pending (callgraph_building) and count-free across scoped rollups and finalization, even when the store unlocks between probes, and background reconcile keeps unfinished ownership for another attempt.

RetriggerView in GreptileConfidence Score: 5/5

The PR appears safe to merge; no new actionable issues remain.

Summary

The PR keeps a briefly locked call graph distinct from a missing one.

  • Busy call-graph stores stay distinct from missing stores.
  • Published call-graph stores retry opening after SQLite unlocks.
  • Dead-code inspection keeps busy call-graph results pending.

Both earlier, unnumbered findings are addressed in the current code. No new actionable issues were found.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[Read published call graph] --> B{Database ready?}
  B -->|Yes| C[Install reader]
  B -->|Busy| D[Return busy or pending]
  B -->|Absent| E[Use normal missing-store path]
  F[Build completed] --> B
  D --> G[Keep completion token and pending paths]
  G --> H[Retry with a new receiver identity]
  H --> B

Reviews (5) · Last reviewed commit: "Move this change's release-note lines to..." · Reviewed by Greptile