Skip to content

fix(file_index): align file index format with Java V1 - #719

Merged
JingsongLi merged 1 commit into
apache:mainfrom
QuakeWang:file-index-v1
Aug 16, 2026
Merged

fix(file_index): align file index format with Java V1#719
JingsongLi merged 1 commit into
apache:mainfrom
QuakeWang:file-index-v1

Conversation

@QuakeWang

Copy link
Copy Markdown
Member

Purpose

Linked issue: #34

The existing Rust FileIndex implementation used a Rust-only wire format that differed from Java Paimon V1 in byte order, version, string encoding, and integer widths. This prevented Java and Rust from exchanging FileIndex files reliably. The reader also assumed a fixed-size header and did not fully validate encoded ranges.

Brief change log

  • Align FileIndex reading and writing with Java V1.
  • Preserve absent and empty index payloads separately.
  • Validate truncated headers, invalid offsets, lengths, and overflows.
  • Support headers larger than 1 MiB.
  • Add Java golden fixtures and boundary tests.

Tests

  • cargo fmt --all -- --check
  • cargo clippy --locked --all-targets --workspace --features fulltext,vortex -- -D warnings
  • cargo test --locked -p paimon --all-targets --features fulltext,vortex
  • cargo test --locked -p paimon-rest-server --all-targets
  • Rust 1.91 workspace MSRV check
  • Java/Rust V1 interoperability verification

API and Format

FileIndex payload APIs now use Option<Bytes> to distinguish absent indexes from empty payloads. The wire format is changed to Java-compatible V1. The legacy Rust-only format is intentionally unsupported.

Documentation

Updated inline format documentation.

Signed-off-by: QuakeWang <wangfuzheng0814@foxmail.com>

@JingsongLi JingsongLi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

@JingsongLi
JingsongLi merged commit 8118b6d into apache:main Aug 16, 2026
13 checks passed
jerry-024 added a commit to jerry-024/paimon-rust that referenced this pull request Aug 17, 2026
* main:
  perf(vindex): size native batches by active indexes (apache#709)
  fix(data-evolution): require row tracking and row IDs (apache#718)
  feat(go): add table write bindings (apache#658)
  fix(scan): preserve Data Evolution file order in row-id groups (apache#717)
  fix(file_index): align file index format with Java V1 (apache#719)
  fix: configure OpenDAL writer chunk size (apache#713)
  fix(python): release GIL during catalog I/O (apache#716)
  feat(write): add fixed-bucket write primitives for postpone tables (apache#659)
  feat: rust examples for creating and querying Paimon tables (apache#648)
  fix(table): reject row ranges for format tables at read construction (apache#700)
  perf(arrow): prune IN predicates with row-group stats (apache#705)
  feat(io): support in-memory local cache (apache#710)
  fix(dlf): refresh expiring credentials (apache#714)
  fix(datafusion): normalize index_type in global index procedures (apache#715)
  fix(auth): fail closed on query-auth tables outside the read boundary (apache#691)

# Conflicts:
#	crates/paimon/src/table/vector_search_builder.rs
#	crates/paimon/src/vindex/reader.rs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants