Skip to content

Conversation

@Savid
Copy link
Member

@Savid Savid commented Feb 3, 2026

Previously gap detection only found incomplete blocks (rows where complete=0), missing truly missing blocks (rows that were never inserted). This change:

  • Add GetMissingBlocksInRange() to state manager using ClickHouse numbers()
  • Update GapStateProvider interface and GetGaps() to return GapResult with both Incomplete and Missing block lists plus scan duration
  • Make processBlock public (ProcessBlock) in all processors for gap filling
  • Add ProcessBlock to BlockProcessor interface
  • Add Prometheus metrics: GapsDetected, GapsReprocessed, GapScanDuration, GapsFound
  • Update checkGaps() to handle both types: ReprocessBlock for incomplete, ProcessBlock for missing blocks
  • Add comprehensive tests for both gap types

Savid added 4 commits February 3, 2026 16:20
… incomplete blocks

Previously gap detection only found incomplete blocks (rows where complete=0),
missing truly missing blocks (rows that were never inserted). This change:

- Add GetMissingBlocksInRange() to state manager using ClickHouse numbers()
- Update GapStateProvider interface and GetGaps() to return GapResult with
  both Incomplete and Missing block lists plus scan duration
- Make processBlock public (ProcessBlock) in all processors for gap filling
- Add ProcessBlock to BlockProcessor interface
- Add Prometheus metrics: GapsDetected, GapsReprocessed, GapScanDuration, GapsFound
- Update checkGaps() to handle both types: ReprocessBlock for incomplete,
  ProcessBlock for missing blocks
- Add comprehensive tests for both gap types
…and Lua script

- Replace O(N) SCAN with O(log N + M) ZRANGEBYSCORE using sorted set
- Add Lua script for atomic task completion tracking (2 round trips -> 1)
- Add ClearStaleBlocks bulk cleanup method using pipeline
- Add pendingBlocksKey sorted set for tracking pending blocks by timestamp
- Update RegisterBlock, MarkBlockComplete, ClearBlock to maintain sorted set
- Remove unused metaKeyPattern and extractBlockNumFromKey functions
- Add comprehensive tests for new functionality including concurrency test
Add verification that a block is still incomplete in ClickHouse before
calling ReprocessBlock in gap detection. This closes a TOCTOU race window
where a block could complete (MarkBlockComplete writes complete=1 and
cleans up Redis tracking) between when gap detection queries ClickHouse
and when it decides to reprocess.

Previously, gap detection only checked HasBlockTracking() which returns
false after a block completes and Redis is cleaned up, causing already-
complete blocks to be unnecessarily reprocessed.

- Add IsBlockComplete() to state manager for fresh ClickHouse query
- Add completion check in checkGaps() before ReprocessBlock call
- Add unit test for race condition logic
@Savid Savid merged commit 3d4921c into master Feb 4, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants