Skip to content

perf: parallel file indexing with per-thread arena allocators #206

@justrach

Description

@justrach

Design from justrach/turbodb — adapted from src/parallel_index.zig per-thread arena pattern.

Problem

File indexing is single-threaded. On openclaw (4,950 files), indexing takes 42 seconds. The shared GPA allocator would cause lock contention if we naively added threads.

Evidence

Head-to-head benchmark on openclaw:

  • codedb: 42,000ms indexing
  • Competitor: 16ms (only walks files, no content indexing — but our content indexing should still be parallelizable)

Proposed Solution

Spawn N worker threads, each with its own ArenaAllocator. Partition files into chunks statically. Each thread indexes its chunk independently, then merge results.

Reference: justrach/turbodb parallel_index.zig — static work partitioning with per-thread arenas, zero allocator contention.

Design

Main thread:
  1. Walk directory → collect file paths
  2. Split into N chunks (N = min(cpu_count, file_count))
  3. Spawn N threads, each with ArenaAllocator

Worker thread:
  1. For each file in chunk:
     - Read content
     - Parse outline
     - Extract trigrams into local HashMap
  2. Return local results

Main thread:
  3. Join all threads
  4. Merge local indexes into global index

Failing test

test "issue-206: parallel indexing produces same results as sequential" {
    // Index 100 files with 1 thread and 4 threads
    // Compare outline counts, trigram candidates, search results
}

Expected impact

Metric Before After (4 cores)
Indexing 42s ~5-10s
Allocator contention N/A (single thread) Zero (per-thread arenas)

Files to modify

  • src/watcher.ziginitialScan
  • src/explore.zigindexFileInner
  • src/index.zig — trigram insertion merge

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions