lance-format / lance-format/lance
feature: Adopt rerun-io/lance-fuzz for continuous stateful dataset fuzzing
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 7.1k
- Forks
- 852
- Avg merge
- 3d 18h
- Merged PRs (30d)
- 272
Description
Handover: adopt rerun-io/lance-fuzz
Lance maintainers: please adopt rerun-io/lance-fuzz and run it continuously against Lance. The preferred outcome is to move the harness into the Lance monorepo. Another option is to maintain it as an official Lance project. Either way, the fuzzer should live alongside the code and tests it exercises.
The goal is continuous bug discovery:
- Run scheduled, time-bounded fuzzing campaigns against current Lance.
- Replay the curated crash suite in CI so fixed bugs do not regress.
- Triage and minimize new artifacts. Turn confirmed bugs into issues and focused regression tests.
- Measure corpus coverage to decide what to fuzz next.
What it is
lance-fuzz is a stateful, model-based fuzzer for Lance datasets. It is inspired by ClickHouse's BuzzHouse. It generates realistic sequences of operations, keeps an in-memory model of the expected rows, and checks Lance after every successful operation.
The dataset_ops target covers writes, schema and history changes, scalar and vector indices, compaction, and reads. It runs against several storage profiles and Lance file-format versions. A finding is an unexpected error, a mismatch with the model, or a validation failure. The repository includes replayable artifacts, a curated crash suite.
Track record
This project found these 26 Lance issues as of 2026-08-12:
- #7906
- #7907
- #7908
- #7910
- #7911
- #7912
- #7913
- #7934
- #7935
- #7936
- #8180
- #8217
- #8218
- #8221
- #8222
- #8225
- #8278
- #8279
- #8280
- #8281
- #8282
- #8501
- #8502
- #8503
- #8504
- #8505
These cover data correctness, index freshness, compaction, schema changes, file-format compatibility, query planning, and generators. The fuzzer finds bugs through operation sequences that isolated unit tests are less likely to create.
Coverage and development opportunities
The last campaign used Lance v11.0.0-beta.4. It replayed 12,713 inputs over about 16.5 hours. It ran about 637,000 sessions with fork=24 and covered 31.0% of the pinned Lance checkout: 58,107 of 187,192 lines, below per-crate coverage:
| Crate | Coverage | Covered / total lines |
|---|---|---|
lance-linalg |
5.7% | 217 / 3,825 |
arrow-scalar |
7.8% | 30 / 387 |
lance |
22.5% | 16,522 / 73,482 |
lance-index |
24.2% | 10,514 / 43,443 |
lance-io |
28.0% | 1,440 / 5,147 |
lance-index-core |
28.1% | 100 / 356 |
lance-tokenizer |
29.7% | 282 / 950 |
compression |
31.9% | 852 / 2,669 |
lance-datagen |
32.2% | 621 / 1,928 |
lance-arrow |
33.0% | 838 / 2,543 |
lance-datafusion |
40.6% | 1,548 / 3,816 |
lance-file |
41.9% | 3,786 / 9,034 |
arrow-stats |
42.6% | 107 / 251 |
lance-core |
43.6% | 2,464 / 5,645 |
lance-table |
47.6% | 2,623 / 5,506 |
lance-select |
52.4% | 573 / 1,093 |
lance-encoding |
57.5% | 15,590 / 27,117 |
Some low-hanging fruits based on coverage gaps:
- Vector indexing beyond IVF_FLAT — high value, high effort. Add product quantization, HNSW, binary/scalar quantization, k-means, and distributed indexes. First, broaden existing KNN queries with varied
k, prefilters, and scalar predicates. - Scalar and full-text indexes — high value, medium effort. Generate multi-term documents and real full-text queries. This would exercise WAND ranking, boolean queries, and FM-index paths.
mem_wal— high value, high effort. First check whether it is stable and public on the target version. The harness does not reach it today.- Dataset, scanner, and transaction internals — high value, low-to-medium effort. Expand existing schema shapes, options, error paths, and rollback scenarios.
lance-datagengenerators — medium value, very low effort. Call more existing generator variants from the harness.- Sparse primitive encoding — medium value, low effort. Broaden values and schemas on an existing sparse-encoding path.
- Blob and large-value columns — medium value, medium effort. Add blob generation and write/read/scan cycles.
- Concurrent commits and conflict resolution — high value, high effort. Extend the sequential model to simulate overlapping writers on one dataset.
- Cleanup/vacuum and tags/refs — low effort. Add operations for old-version cleanup and named version tags.
- Legacy v1 file format — do not prioritize. It is outside the harness's v2.0–v2.3 target range unless compatibility requirements change.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reading the linked lance-fuzz repository and its dataset_ops target, including the replayable artifacts and curated crash suite. Determine how the harness should live alongside Lance and how scheduled campaigns, CI replay, artifact triage, regression tests, and coverage measurement will be integrated. Done means continuous fuzzing and reproducible crash-suite checks are running against current Lance.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- data-engineering, testing-qa
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 32/100