feat: add parquet receipt store with DuckDB range queries#2861
feat: add parquet receipt store with DuckDB range queries#2861
Conversation
|
The latest Buf updates on your PR. Results from workflow Buf / buf (pull_request).
|
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #2861 +/- ##
==========================================
+ Coverage 57.16% 57.28% +0.12%
==========================================
Files 2091 2095 +4
Lines 171145 172176 +1031
==========================================
+ Hits 97827 98627 +800
- Misses 64609 64722 +113
- Partials 8709 8827 +118
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
| for blockNum, logs := range chunk.logs { | ||
| if blockNum < fromBlock || blockNum > toBlock { | ||
| continue | ||
| } | ||
| for _, lg := range logs { | ||
| if matchLog(lg, crit) { | ||
| logCopy := *lg | ||
| result = append(result, &logCopy) | ||
| } | ||
| } | ||
| } |
Check warning
Code scanning / CodeQL
Iteration over map Warning
| "database/sql" | ||
| "fmt" | ||
| "path/filepath" | ||
| "runtime" |
Check notice
Code scanning / CodeQL
Sensitive package import Note
| go func() { | ||
| for { | ||
| latestVersion := s.latestVersion.Load() | ||
| pruneBeforeBlock := latestVersion - s.config.KeepRecent | ||
| if pruneBeforeBlock > 0 { | ||
| pruned := s.pruneOldFiles(uint64(pruneBeforeBlock)) | ||
| if pruned > 0 && s.log != nil { | ||
| s.log.Info(fmt.Sprintf("Pruned %d parquet file pairs older than block %d", pruned, pruneBeforeBlock)) | ||
| } | ||
| } | ||
|
|
||
| // Add jitter to avoid thundering herd | ||
| jitter := time.Duration(float64(pruneIntervalSeconds)*0.5) * time.Second | ||
| sleepDuration := time.Duration(pruneIntervalSeconds)*time.Second + jitter | ||
|
|
||
| select { | ||
| case <-s.pruneStop: | ||
| return | ||
| case <-time.After(sleepDuration): | ||
| // Continue to next iteration | ||
| } | ||
| } | ||
| }() |
Check notice
Code scanning / CodeQL
Spawning a Go routine Note
| } | ||
|
|
||
| // Add random jitter (up to 50% of base interval) to avoid thundering herd | ||
| jitter := time.Duration(rand.Float64()*float64(pruneIntervalSeconds)*0.5) * time.Second |
Check notice
Code scanning / CodeQL
Floating point arithmetic Note
| } | ||
|
|
||
| // Add random jitter (up to 50% of base interval) to avoid thundering herd | ||
| jitter := time.Duration(rand.Float64()*float64(pruneIntervalSeconds)*0.5) * time.Second |
Check notice
Code scanning / CodeQL
Floating point arithmetic Note
Summary
This PR adds a parquet-based receipt storage backend with DuckDB for efficient range queries on logs, enabling fast
eth_getLogsqueries across block ranges.Backend: "parquet"in config)KeepRecentconfig-tags duckdbto enable parquet backendThe parquet backend supports the new
FilterLogsrange query API introduced in #2788, enabling efficient cross-block log queries without falling back to per-receipt fetching.Dependencies
Test plan
-tags duckdb