Visitar URL original
Close exact-scoring vector suppliers and make thread-local cleanup exception-safe · Issue #764 · datastax/jvector · GitHub
Skip to content

Close exact-scoring vector suppliers and make thread-local cleanup exception-safe #764

Open

Description

@tlwillke

Follow-up to #635 and #715 covering two existing lifecycle gaps. These are separate from #715's worker-draining and remapped-copy concerns.

1. Exact-scoring suppliers have no teardown path

BuildScoreProvider.randomAccessScoreProvider creates two thread-local vector suppliers. Neither the returned provider nor GraphIndexBuilder.close() releases those suppliers; builder.close() only closes its searchers. Closing the separate insertion supplier in #715 therefore leaves the scoring copies unclosed.

Reproduced against the unmodified #715 source snapshot (264979e), with a shared AutoCloseable RAVV that counts copy/close calls, a single-worker pool, and an exact-scoring build followed by builder.close(): 3 copies created, 1 closed, 2 unclosed. Current main retains the same ownership gap.

Define an explicit ownership/teardown path for library-owned scoring suppliers, retaining their availability through final scoring and graph cleanup. Preserve caller ownership of the source and externally supplied providers. Audit the bounded VectorAccess supplier callers introduced by #744 for the same gap.

2. A throwing close skips remaining copies and cache clearing

ExplicitThreadLocal.close() exits immediately if one value's close() throws. Remaining values are never attempted and map.clear() is skipped. The new ThreadLocalCopies.close() in #715 delegates directly to this method.

Reproduction: populate the supplier from two dedicated worker threads, make both copies' close() throw, then close the supplier after the workers finish. Observed: 2 copies created, only 1 close attempted.

Attempt every close, reliably clear the cache, and aggregate failures with suppressed exceptions. Call sites should also preserve an original operation failure if cleanup fails.

Validation

  • Add an exact-scoring build/teardown test that verifies all owned copies are released while the caller-owned source remains usable.
  • Add a multi-copy throwing-close test verifying every close is attempted, the cache is cleared, and failures remain inspectable.
  • Exercise the supported supplier reuse-after-close behavior after a cleanup failure.

The targeted reproductions ran on OpenJDK 23.0.1 with the scalar provider and assertions enabled. The PR's three added TestThreadLocalCopies tests pass, but do not cover these cases.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions