lance-format / lance-format/lance

feature: Adopt rerun-io/lance-fuzz for continuous stateful dataset fuzzing

Open
#9,039 5 comments 3 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug feature performance
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:

  1. 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.
  2. 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.
  3. 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.
  4. Dataset, scanner, and transaction internals — high value, low-to-medium effort. Expand existing schema shapes, options, error paths, and rollback scenarios.
  5. lance-datagen generators — medium value, very low effort. Call more existing generator variants from the harness.
  6. Sparse primitive encoding — medium value, low effort. Broaden values and schemas on an existing sparse-encoding path.
  7. Blob and large-value columns — medium value, medium effort. Add blob generation and write/read/scan cycles.
  8. Concurrent commits and conflict resolution — high value, high effort. Extend the sequential model to simulate overlapping writers on one dataset.
  9. Cleanup/vacuum and tags/refs — low effort. Add operations for old-version cleanup and named version tags.
  10. 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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.