Commit Graph
7407 Commits
Author SHA1 Message Date
Jonathan Shook 19f04125ee feat(vectordata): read a facet spread across several files
- a facet may be a series: the uniform form names `base__NNNN.fvec`
  with shard_stride, shard_count, and record_count; the explicit form
  lists entries in the source grammar, each bare, `=`-counted,
  windowed, or both, checked against each other
- ordinals map in O(1) whenever the lengths are uniform however the
  series was spelled, and by prefix-sum search otherwise; an entry
  window is in that file's ordinals, the facet window is in facet
  ordinals, and a suffix on a uniform pattern is the facet window
- storage, sidecars, and offset indexes are per file, so two shards of
  one file share one of each; the readers present a single surface,
  refuse shards that disagree on shape, and name a missing shard
  rather than reading a shorter facet
- prefetch plans carry ShardRange in place of ByteRange, decompose a
  window across the shards it spans, never merge across shards, and
  sum prerequisite bytes per file; a whole-facet request names every
  shard, and cache statistics report the weakest access mode
- format_version is a minimum reader requirement: a dataset above 2,
  or one stating less than its content needs, is refused naming both
  numbers; declarations are checked for self-consistency at load, and
  a directory falls back to knn_entries.yaml only when dataset.yaml is
  absent, so a refusal keeps its diagnosis
- a series holds open no more files than a quarter of the descriptor
  soft limit, floor 8, or VECTORDATA_SHARD_FD_CAP
2026-09-04 21:17:39 +00:00
J S f999cce819 Merge pull request #2301 from nosqlbench/dependabot/github_actions/actions/setup-java-6.0.0
build(deps): bump actions/setup-java from 5.6.0 to 6.0.0
2026-09-04 10:46:43 -05:00
J S 55dd413097 Merge branch 'main' into dependabot/github_actions/actions/setup-java-6.0.0 2026-09-04 10:46:32 -05:00
J S 52857adaf3 Merge pull request #2300 from nosqlbench/dependabot/github_actions/softprops/action-gh-release-3.0.3
build(deps): bump softprops/action-gh-release from 3.0.2 to 3.0.3
2026-09-04 10:46:15 -05:00
J S dca4386feb Merge branch 'main' into dependabot/github_actions/softprops/action-gh-release-3.0.3 2026-09-04 10:45:59 -05:00
Jonathan Shook 5a82d60305 fix(expr-api): render datetime seconds even on a whole minute
The ISO forms of LocalTime and LocalDateTime omit the seconds field
when the second is 00, so currentTime(), currentDateTime(),
currentTimeInZone() and millisToDateTime() each returned a shorter
string once a minute — HH:mm instead of HH:mm:ss. That failed
testCurrentTime in CI roughly one run in sixty, and silently handed
workloads a differently-shaped timestamp the rest of the time.

Each now formats with an explicit pattern rather than toString(), which
also makes the truncatedTo(SECONDS) calls redundant.

The new test pins the boundary through millisToDateTime, whose instant
comes from the caller: the wall-clock functions can only be asserted
for shape, which catches this one second in sixty. It builds a
timestamp on a whole minute, requires the seconds to be there, and
repeats at second 30 so a fix in the other direction is caught too.
5.25.15-release 5.25.15-preview
2026-09-02 20:19:36 +00:00
Jonathan Shook 59d604aed6 fix(virtdata): binding windows warm records without renumbering them
A binding window re-based the reader to zero, so BaseVectors(spec,
'[50000..100000)') exposed indices 0..49999. A workload running the
cycles that window names then indexed past the end and failed, and it
only ever worked from cycle 0, where the re-basing is the identity. It
also disagreed with the two surfaces beside it: VariableFacet and
prefetchCycles both speak absolute ordinals.

The window now selects which records to warm and nothing else. Indices
are absolute everywhere, so cycles address the records they name, and
the fetch still covers only the window — a [50000..100000) slice of a
100k profile warms 74 MiB rather than the full 146 MiB.

Reads outside the window demand-page rather than failing, which is
load-bearing rather than lenient: VirtData probes a newly resolved
function with a small sample index before any cycle runs, so refusing
out-of-window reads leaves a window above zero unable to resolve at
all. A test pins that.

WindowedReader keeps its restricting behaviour for the windowedFacet
expression function, where a caller asks for a restricted reader
directly and no resolver probe is involved.
2026-09-02 19:36:03 +00:00
Jonathan Shook 52dc31bfce feat(virtdata): meter the background prefetch and reach it directly
Asking for a prefetch with progress meant asking for prefetch=false and
then a binding mode — two knobs that read as contradicting each other,
because the background expr function was the one prefetch form that
never got a meter, so the only way to see a background download was to
route it through a binding.

prefetchBackground now announces its plan and watches the handle like
every other form, and prefetchCyclesBackground takes the ordinal range
directly. With the API reachable at the surface, the demo asks for what
it wants in one word: prefetch=load blocks on prefetchCycles before the
run, prefetch=background hands back a metered handle that fetches while
the cycles run, prefetch=none leaves reads to demand-page. The binding
mode knob is gone.
2026-09-02 15:54:14 +00:00
Jonathan Shook 66fc07c15f docs(stdout): correct the demo workload invocation
The documented 'nb5 run vectordata_demo' does not work: run is itself a
command, so the workload name is parsed as a second one and resolves to
no service. The scenario form drops the run — 'nb5 vectordata_demo
dataset=<name>:<profile>' — and the long form names the full bundled
path, 'nb5 run workload=activities/examples/vectordata_demo.yaml'.
Both are now shown in the workload and the guide.

Verified against the 5.25.15-release binary: the workload is bundled
and listed, both corrected forms load it, and a real dataset run meters
the download and reads base, query, and neighbor records.
2026-09-02 01:04:19 +00:00
Jonathan Shook 0b9e16ee20 feat(stdout): bundle the vectordata demo as a runnable workload
The demo only worked from a checkout. It now ships in the stdout
adapter's activities, so 'nb5 run vectordata_demo dataset=<name>:<profile>'
works from the distribution alone, with --cat and --copy for reading or
editing it.

Every catalog-touching expression is guarded on the dataset parameter
being given. Bundled workloads are parsed through the expression
pipeline by --list-workloads and --list-scenarios, so a workload that
opened a catalog unconditionally would fail listing for every user
without one configured; with no dataset named it now renders usage text
and touches nothing.
2026-09-01 23:23:47 +00:00
Jonathan Shook 0edf2abd5a version bump 2026-09-01 22:12:13 +00:00
Jonathan Shook acc1034d14 docs(vectordata): runnable demo workload with a live download meter
vectordata_demo.yaml needs no database — the stdout driver exercises
dataset access alone. It prints what it derived from the dataset,
fetches a record range with the meter running, and reads records back,
so a download can be watched from one command line. prefetch=false
with mode=background moves the fetch off the load path and overlaps it
with the cycles instead.

Binding meter labels now carry the profile, matching the expr form, so
both name the same thing in a run that uses both.
2026-09-01 21:36:06 +00:00
Jonathan Shook 9085bf06ad feat(virtdata): prefetch progress, profile warm-up, and cycle ranges from exprs
A prefetch driven from a workload was silent and awkward to aim:

- every expr prefetch now reports through the same meter the bindings
  use, so a download started from a workload announces its cost, emits
  progress while the bytes move, and confirms completion
- prefetchProfile(spec) warms every facet the profile declares, each to
  the window it declares, in one call — the form that cannot
  accidentally pull a whole shared base file, since an empty window
  means the entire facet by design
- prefetchCycles(spec, facet, start, end) takes the ordinal range
  directly, which is how an activity already describes its work

The docs record the three things that bite: expressions evaluate at
load time rather than when a tagged block runs, an empty window is a
request for everything, and assignment sigils render their value where
they are written.
2026-09-01 18:51:09 +00:00
dependabot[bot] 20cf28e2dc build(deps): bump actions/setup-java from 5.6.0 to 6.0.0
Bumps [actions/setup-java](https://github.com/actions/setup-java) from 5.6.0 to 6.0.0.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/v5.6.0...v6.0.0)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-01 12:32:46 +00:00
dependabot[bot] 0c59a58191 build(deps): bump softprops/action-gh-release from 3.0.2 to 3.0.3
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 3.0.2 to 3.0.3.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v3.0.2...v3.0.3)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-version: 3.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-01 12:32:15 +00:00
Jonathan Shook 20eb4f3c89 feat(cqld4): dataset-derived vector search workload
cql_vector_dataset.yaml takes one dataset input —
dataset='<dataset>:<profile>' — and derives everything dataset-shaped
through the expr system at load time: the schema's vector dimensions
and similarity function, rampup cycles from the base count, search
cycles from the query count, and the ANN LIMIT and recall k from the
ground-truth width. Bindings read through the vectordata mappers, so
the profile's base window warms eagerly with download progress before
the first cycle; the plan's cost is echoed into the rendered
description. Operational knobs (keyspace, table, rf, cl) stay
conventional TEMPLATE parameters.

Verified through the real load-path transforms (TemplateRewriter +
ExprPreprocessor) against a published remote dataset: dimensions 384,
train 100k, test 10k, k 100, dot_product, all spliced correctly.
2026-08-27 18:14:50 +00:00
Jonathan Shook b22741ccc9 feat(vectordata): expose dataset attributes on the view
The manifest's attributes block — distance_function and whatever else
the publisher recorded — was parsed and discarded; the Rust view
carries it for metadata accessors. TestDataView.attributes() returns
it on every profile view, which is how a workload derives
configuration from the dataset instead of restating it.
2026-08-27 18:14:50 +00:00
Jonathan Shook 85f936acac update test script 5.25.14-release 5.25.14-preview 2026-08-26 21:02:03 +00:00
Jonathan Shook ad58eb804c fix(vectordata): map ivec windows at the uniform header stride
In this catalog format, ivec/ivecs records are length-qualified but
fixed throughout — ground-truth neighbor files — so a window maps at
the header stride like any other xvec, and only the *vvec extensions
carry variable-length records. Classifying ivec as variable sent
neighbor-facet windows through the offset-index path, and a remote
ground-truth file publishes no sidecar, so the window degraded and the
consent gate refused an eager warm-up of three records.

ElementType now recognizes the *vvec extension families, and the
variable-length test fixtures use them instead of overloading .ivecs.
Verified against the real remote dataset: a neighbor window resolves
to exactly its records' bytes and the reader decodes them.

The Rust source's is_vvec_ext still classifies ivec as variable; noted
in RUST_COMPATIBILITY.md for upstream reconciliation.
2026-08-26 20:57:07 +00:00
Jonathan Shook 683c2d5849 docs(vectordata): remote access guide with a standalone smoke-test script
devdocs/vectordata/ holds the guide and remote_smoke_test.sh, which
checks base, query, and neighbor-index facets of one profile by
eagerly warming exactly the records each check reads — with the plan
announced and download progress on stderr — aborting on the first
failure. VECTORDATA_CATALOG and DATASET are required, DATASET as
'<dataset>' or '<dataset>:<profile>' with the profile defaulting to
'default', and NB selects how nosqlbench is invoked. The guide keeps
the Facet, windowed-background, and whole-profile warm-up forms as
separate examples.
2026-08-26 20:47:21 +00:00
Jonathan Shook 69510b3062 feat(virtdata): emit download progress while binding warm-ups fetch
Eager and background prefetches announce the plan's cost before any
bytes move, emit rate-limited progress on stderr while the download
runs — a meter, not a log event, so it shows regardless of logging
configuration — and confirm completion. Silent when there is nothing
to fetch, so local and already-warm facets add no noise.
2026-08-26 20:47:21 +00:00
Jonathan Shook 5b992e89df fix(vectordata): resolve sized profiles against the default profile
Published sized profiles name only what differs: a windowed base
override and their own neighbor facets, with no extends key. Facets a
profile does not declare — query vectors included — resolve from
'default' implicitly, matching the expanded layout the publishing
toolchain emits into catalogs. Java honored only explicit extends, so
a released dataset failed with 'Profile 100k lacks facet
query_vectors' while its own catalog showed the facet plainly.

The window: key also accepts the serializer's structured form (a list
of {min_incl, max_excl} maps) and bare counts; dropping an
unrecognized form silently would read the whole facet where a window
was declared, so it fails instead.

Verified against the real remote dataset: profile 100k resolves all
four facets, reads query vectors, and clips the base to its window.
2026-08-26 20:30:19 +00:00
Jonathan Shook 33cbde93fb test(vectordata): isolate unit tests from ambient vectordata settings
Every unit test now builds explicit VectorDataSettings with a temporary
cache directory instead of reaching VectorDataSettings.defaults(). The
defaults path deliberately refuses to auto-configure a cache when the
largest writable mount is outside the home filesystem — exactly the
shape of a GitHub runner — so any test depending on it fails there by
design. This broke the 5.25.14-release build, the first CI run to
execute these suites after they were tagged into the unit group.
2026-08-26 19:50:45 +00:00
Jonathan Shook cdf750344f docs(vectordata): add a quick remote smoke-test stub
Environment-variable catalog selection with an isolated VECTORDATA_HOME
and three stdout-driver one-liners: profile-window warm-up, a
caller-named ordinal range in the background, and demand-paged access.
2026-08-26 19:28:36 +00:00
Jonathan Shook 7b3f802135 docs(vectordata): how to test remote dataset access
Java API, expr, and inline-op examples for remote reads and for
precache/prefetch in both profile-window and caller-named ordinal-range
forms, plus the verification patterns the integration tests use.
2026-08-26 19:07:38 +00:00
Jonathan Shook 70ff9ac23d bump minor version 2026-08-26 18:45:30 +00:00
Jonathan Shook 81ccb847b4 feat(virtdata): expr functions for facets, windows, and prefetch
metadataResults, facet, windowedFacet, and variableFacet round out
facet access from expressions; prefetchPlan prices a caller-named
record window without fetching, prefetch blocks until it is resident,
and prefetchBackground returns the running handle. Unresolvable
windows are refused rather than quietly fetching the whole facet.
2026-08-26 18:36:01 +00:00
Jonathan Shook 4045517879 feat(virtdata): facet-addressed vector bindings with windows and prefetch modes
The standard mappers (BaseVectors, QueryVectors, NeighborIndices,
NeighborDistances, new MetadataResults) address facets by canonical
name, so Rust-published datasets resolve; each takes an optional record
window — clipping the reader and warming exactly those bytes — and a
prefetch mode of eager, background, or none. Facet reads any named
facet including scalars and custom facets; VariableFacet reads vvec
records, warming a window through the offset index while indices stay
absolute. A binding window composes with a profile-declared window by
shifting to absolute records for the fetch.
2026-08-26 18:36:01 +00:00
Jonathan Shook fdfbbdadf2 feat(vectordata): prefetch caller-named windows with planning, consent, and background fetch
A profile window names a range someone wants repeatedly; it is not a
fence. TestDataView gains prefetchPlan, prefetch, and
prefetchInBackground, taking a DSWindow in record coordinates for any
facet:

- per-format mapping: xvec by header stride, scalars at the element
  stride, vvec through the offset index — loaded whole, cached on the
  view's facet handle, and never rebuilt by a remote walk while
  planning; locally walked indexes persist atomically beside the data
- plans price chunk-level residency, coalesce ranges at chunk
  adjacency, and separate what was asked from what will be issued
- an unresolvable window degrades to a whole-facet fetch that
  WholeFacetFallback refuses unless the caller consents; an empty
  window is a request for the whole facet, never a degrade
- background prefetch exposes a handle with plan, counters,
  range-granular cancel, and a join that surfaces worker failures
- manifests accept the window-suffix sugar on source strings and key
  resolved facets canonically, so Rust-published dataset.yaml files
  resolve through the standard accessors

Behavior tracks vectordata-rs at 96d787722b39, per RUST_COMPATIBILITY.md.
2026-08-26 18:35:51 +00:00
Jonathan Shook b578f97855 fix(vectordata): read both IDXFOR sidecar layouts and clamp reader windows
Two layouts sit next to real data: N record starts (the vectordata-rs
walk rebuild) and N+1 entries ending in a payload-size sentinel (what
nbdatatools publishes). No record can start at the payload size, so the
reader detects the sentinel and both layouts describe N records; a
Rust-walked local dataset is no longer unreadable here. Sidecar probing
is size-directed — the width the payload calls for, first — and reader
windows parse the DSWindow grammar, apply the first interval, and clamp
both bounds to the data instead of throwing.
2026-08-26 18:35:51 +00:00
Jonathan Shook b30d1d074e feat(vectordata): chunk-range residency and range prebuffer on storage
RangeFill reports what fetching a byte range would cost at chunk
granularity — resident chunks are free, and alignment overfetch is
visible before the fetch. prebufferRange drives only the covering
chunks; CacheStats carries the transfer-chunk size so consumers can map
byte offsets to chunk ordinals; rangeCapable distinguishes sources that
cannot service partial fetches.
2026-08-26 18:35:36 +00:00
Jonathan Shook 2af9dec9cc feat(vectordata): add the canonical facet-name alias table
Ports the StandardFacet canonical/alias table: base_vectors and kin are
the dataset.yaml keys, with base, train, query, gt, ground_truth, the
metadata shorthands, and the prefiltered/postfiltered families accepted
as aliases. The test pins the whole table so drift from the reference
is a deliberate change, not an accident.
2026-08-26 18:35:36 +00:00
Jonathan Shook e0e9cdeae0 feat(vectordata): port the DSWindow record-window grammar
The canonical window spelling from the vectordata-rs dataset-source
parser: half-open intervals, open ends, bracket bound adjustment,
count/size suffixes with compound forms, and comma-separated interval
lists. Intervals that select no records are rejected at parse, naming
the comma-for-'..' mistake.
2026-08-26 18:35:36 +00:00
Jonathan Shook 625941cd42 test(vectordata): tag unit suites for the CI groups filter
Surefire runs only tests tagged 'unit' (nb.junit.tags), so the module's
untagged suites were invisible to 'mvn -B test' in CI. Tag every unit
test class; the *IntegrationTest suites already run under failsafe.
2026-08-26 18:35:23 +00:00
J S 4fbe0d57ff Merge pull request #2299 from nosqlbench/rehome_vectordata
Rehome vectordata
5.25.13-preview 5.25.13-release
2026-08-24 17:47:31 -05:00
J S 8530674e76 Merge branch 'main' into rehome_vectordata 2026-08-24 16:55:51 -05:00
Jonathan Shook eff569c74d fix(virtdata): isolate vectordata mapper cache settings 2026-08-24 21:32:55 +00:00
Jonathan Shook 45c8a3ca56 chore(vectordata): remove stale planning and fixture provenance 2026-08-24 21:25:30 +00:00
Jonathan Shook 2591c75d41 docs(vectordata): reconcile porting plan status 2026-08-24 20:32:05 +00:00
Jonathan Shook 9ce73b9069 refactor(virtdata): migrate vector readers to nb-vectordata 2026-08-24 20:12:56 +00:00
J S f0a3315226 Merge pull request #2298 from stonewhitener/sched_rebase
Fix metrics scheduler lifecycle across rebases
2026-08-24 15:12:37 -05:00
Jonathan Shook cbff0ee9f5 feat(vectordata): add Rust-compatible Java dataset access 2026-08-24 20:11:47 +00:00
Youki Shiraishi 654574784c Fix metrics scheduler lifecycle across rebases 2026-08-21 16:50:06 +09:00
J S 4a5e567718 Merge pull request #2292 from nosqlbench/dependabot/maven/nb-adapters/adapter-aws-opensearch/org.apache.httpcomponents.client5-httpclient5-5.6.3
build(deps): bump org.apache.httpcomponents.client5:httpclient5 from 5.2.1 to 5.6.3 in /nb-adapters/adapter-aws-opensearch
2026-08-20 16:12:02 -05:00
J S 7f1017f5a5 Merge branch 'main' into dependabot/maven/nb-adapters/adapter-aws-opensearch/org.apache.httpcomponents.client5-httpclient5-5.6.3 2026-08-20 16:11:40 -05:00
J S 6bc872bb05 Merge pull request #2293 from nosqlbench/dependabot/maven/nb-apis/nb-mql-api/org.apache.logging.log4j-log4j-api-2.25.5
build(deps): bump org.apache.logging.log4j:log4j-api from 2.25.2 to 2.25.5 in /nb-apis/nb-mql-api
2026-08-20 16:11:12 -05:00
J S c7d9d87f31 Merge branch 'main' into dependabot/maven/nb-apis/nb-mql-api/org.apache.logging.log4j-log4j-api-2.25.5 2026-08-20 16:11:00 -05:00
J S 5aa04a7294 Merge pull request #2296 from nosqlbench/dependabot/maven/nb-adapters/adapter-amqp/com.rabbitmq-amqp-client-5.33.1
build(deps): bump com.rabbitmq:amqp-client from 5.18.0 to 5.33.1 in /nb-adapters/adapter-amqp
2026-08-20 16:10:32 -05:00
J S 43644643b9 Merge branch 'main' into dependabot/maven/nb-adapters/adapter-amqp/com.rabbitmq-amqp-client-5.33.1 2026-08-20 15:27:32 -05:00
J S fa32acbf7f Merge pull request #2297 from stonewhitener/terminate
Flush pending metric snapshots at activity completion
2026-08-20 20:27:15 +00:00