issue: close c83f - bug does not exist in practice

This commit is contained in:
DanConwayDev
2026-01-22 13:42:50 +00:00
parent 75f8faa59a
commit c50b334849
@@ -1,6 +1,7 @@
# Pagination misses events when relay doesn't return events in created_at order
**ID:** c83f
**ID:** c83f
**Status:** CLOSED - Invalid (bug does not exist in practice)
## Problem
@@ -39,23 +40,23 @@ This assumption is violated when relays don't return events in `created_at` orde
## Plan
- [ ] Phase 1: Research how `nak --paginate` handles this
- [x] Phase 1: Research how `nak --paginate` handles this
- Clone git@github.com:fiatjaf/nak.git
- Find the pagination implementation
- Understand how it ensures no events are missed
- Document findings in Progress section
- [ ] Phase 2: Design fix based on research
- [x] Phase 2: Design fix based on research
- Consider options:
1. Track seen event IDs, continue until no new events (nak approach?)
2. Use overlapping time windows with buffer
3. Use bounded `since` + `until` windows
- Choose approach that balances reliability vs efficiency
- [ ] Phase 3: Implement and test fix
- Update pagination logic in `src/sync/mod.rs`
- Add tests with mock relay returning unordered events
- Verify fix with relay.ngit.dev
- [x] Phase 3: Validate the bug exists
- Test with actual relay data
- Compare old logic vs nak --paginate
- Determine if bug is real or theoretical
## Progress
@@ -69,11 +70,58 @@ This assumption is violated when relays don't return events in `created_at` orde
- Started work: Created worktree for c83f-pagination-misses-events-unordered-relays
- Next: Begin Phase 1 - Research nak pagination implementation
### 2026-01-22 [Session 14:15]
- Completed Phase 1: Researched nak pagination implementation
- nak uses sliding window with deduplication cache
- Overlapping queries with `until=oldest_from_previous`
- Dual cache system (previous + current page IDs)
- Terminates when no new events found
- Completed Phase 2: Designed fix adapting nak's approach
- Modified `PaginationState` with dedup caches
- Added `new_event_count` tracking
- Implemented cache rotation between pages
- Implemented fix: Added deduplication logic to `src/sync/mod.rs`
- Added unit tests: 7 tests covering dedup, termination, cache rotation
### 2026-01-22 [Session 14:45] - CRITICAL FINDING
- Completed Phase 3: Validated bug with real data
- **Bug does NOT exist in practice**
- Testing results:
- relay.ngit.dev kind 30618: 658 events (nak) vs 658 events (old logic) = 0 missing
- relay.ngit.dev kind 30617: 707 events (nak) vs 707 events (old logic) = 0 missing
- relay.damus.io kind 1: ~5000 events both methods = 0 missing
- Why bug doesn't manifest:
- Timestamp collisions are rare (max 7 events at any timestamp)
- Relays are deterministic within fixed time windows
- Theoretical bug requires: more events at one timestamp than relay limit + non-deterministic ordering
- This is practically impossible with Unix second timestamps
- What dedup actually handles:
- Boundary duplicates (events at `min_created_at` appear in both pages due to inclusive `until`)
- Only ~3-11 duplicates per full pagination
- Existing database-level deduplication already handles this
- Original issue report discrepancy:
- Claimed 143 missing events, but testing shows 0 missing
- Likely due to different sync timing or database state, not pagination bug
- Decision: **Closing as invalid** - the bug was theoretical, not real
## Resolution
**The bug does not exist in practice.** Empirical testing with real relay data shows:
- Old pagination logic retrieves the same number of events as `nak --paginate`
- No events are missed due to relay ordering
- The theoretical bug requires conditions that don't occur in real-world usage
The original report of 143 missing events was likely due to:
- Different sync timing between measurements
- Database state differences
- Not an actual pagination bug
**Implementation was reverted** - the deduplication cache added unnecessary complexity for a non-existent problem.
## Notes
- Related issue: 820a-relay-ngit-dev-migration.md (where this was discovered)
- Affected code: `src/sync/mod.rs:768-877` (handle_eose pagination logic)
- PAGINATION_THRESHOLD = 75 events (defined at line 319)
- This affects any relay that doesn't return events in strict `created_at` descending order
- ngit-relay (relay.ngit.dev) is confirmed to have this behavior
- The `nak` tool's `--paginate` flag successfully retrieves all events, so there's a known working approach
- Testing methodology: Replicated old logic with nak + jq, compared to nak --paginate baseline
- Boundary duplicates (events at `min_created_at`) are handled by existing database-level deduplication