From cc91b0a1be89019f99c29286098f9f73cd50b9ff Mon Sep 17 00:00:00 2001 From: Igor Motov Date: Thu, 23 Jul 2026 19:37:21 -1000 Subject: [PATCH 1/8] Brings the Java build in line with other clients. Fixes several build issues that previously allowed improperly formatted files and files with incorrect copyright headers to pass CI. - Replaces the Java-specific copyright check with the standard pre-commit check. - Adds Java and Maven dependencies to the all configuration. - Moves formatting and Spotless checks into pre-commit. - Fixes formatting in files that were not properly formatted. - Removes the remaining headers_h_1 imports. Fixes #2131 --- .pre-commit-config.yaml | 7 +++++++ .../all_cuda-129_arch-aarch64.yaml | 2 ++ .../all_cuda-129_arch-x86_64.yaml | 2 ++ .../all_cuda-133_arch-aarch64.yaml | 2 ++ .../all_cuda-133_arch-x86_64.yaml | 2 ++ dependencies.yaml | 5 +++++ java/cuvs-java/pom.xml | 19 ++++++++----------- .../java/com/nvidia/cuvs/CuVSAceParams.java | 15 ++++++++++----- .../java/com/nvidia/cuvs/CuVSResources.java | 8 +++----- .../java/com/nvidia/cuvs/HnswAceParams.java | 13 ++++++++----- .../java/com/nvidia/cuvs/HnswIndexParams.java | 10 ++-------- .../com/nvidia/cuvs/spi/CuVSProvider.java | 5 ++--- .../nvidia/cuvs/spi/UnsupportedProvider.java | 4 +--- .../nvidia/cuvs/internal/CagraIndexImpl.java | 8 +++++--- .../cuvs/internal/CuVSResourcesImpl.java | 11 +++-------- .../cuvs/internal/GPUInfoProviderImpl.java | 5 ++--- .../nvidia/cuvs/internal/HnswIndexImpl.java | 11 ++++++----- .../com/nvidia/cuvs/internal/common/Util.java | 3 +-- .../com/nvidia/cuvs/spi/JDKProvider.java | 4 +--- .../nvidia/cuvs/CagraAceBuildAndSearchIT.java | 7 +++++-- .../nvidia/cuvs/HnswAceBuildAndSearchIT.java | 5 +++-- .../com/nvidia/cuvs/HnswBuildAndSearchIT.java | 7 +++++-- .../com/nvidia/cuvs/HnswRandomizedIT.java | 7 +++++-- .../cuvs/MemoryTrackingResourcesIT.java | 9 +++------ java/examples/pom.xml | 3 --- java/license-header.txt | 4 ---- 26 files changed, 93 insertions(+), 85 deletions(-) delete mode 100644 java/license-header.txt diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index aa65eec100..6adf07c05b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -93,6 +93,13 @@ repos: pass_filenames: false files: rust/.* language: rust + - id: spotless-fmt + name: spotless-fmt + entry: mvn --batch-mode --quiet -f java/cuvs-java/pom.xml spotless:apply + pass_filenames: false + files: ^java/cuvs-java/src/.*\.java$ + exclude: .*/panama/.* + language: system - id: clang-format-with-cmake-placeholders name: clang-format-with-cmake-placeholders entry: python3 ci/checks/clang_format_with_cmake_placeholders.py diff --git a/conda/environments/all_cuda-129_arch-aarch64.yaml b/conda/environments/all_cuda-129_arch-aarch64.yaml index 955fbf4b3b..4c152e43da 100644 --- a/conda/environments/all_cuda-129_arch-aarch64.yaml +++ b/conda/environments/all_cuda-129_arch-aarch64.yaml @@ -30,11 +30,13 @@ dependencies: - libopenblas<=0.3.30 - librmm==26.10.*,>=0.0.0a0 - make +- maven - nccl>=2.19 - ninja - nodejs>=22 - numpy>=2.0,<3.0 - openblas +- openjdk=22.* - pre-commit - pylibraft==26.10.*,>=0.0.0a0 - pytest diff --git a/conda/environments/all_cuda-129_arch-x86_64.yaml b/conda/environments/all_cuda-129_arch-x86_64.yaml index e0b706e97e..37f0d5ab08 100644 --- a/conda/environments/all_cuda-129_arch-x86_64.yaml +++ b/conda/environments/all_cuda-129_arch-x86_64.yaml @@ -29,11 +29,13 @@ dependencies: - libnvjitlink-dev - librmm==26.10.*,>=0.0.0a0 - make +- maven - nccl>=2.19 - ninja - nodejs>=22 - numpy>=2.0,<3.0 - openblas +- openjdk=22.* - pre-commit - pylibraft==26.10.*,>=0.0.0a0 - pytest diff --git a/conda/environments/all_cuda-133_arch-aarch64.yaml b/conda/environments/all_cuda-133_arch-aarch64.yaml index e6972b30dc..545dcf5326 100644 --- a/conda/environments/all_cuda-133_arch-aarch64.yaml +++ b/conda/environments/all_cuda-133_arch-aarch64.yaml @@ -30,11 +30,13 @@ dependencies: - libopenblas<=0.3.30 - librmm==26.10.*,>=0.0.0a0 - make +- maven - nccl>=2.19 - ninja - nodejs>=22 - numpy>=2.0,<3.0 - openblas +- openjdk=22.* - pre-commit - pylibraft==26.10.*,>=0.0.0a0 - pytest diff --git a/conda/environments/all_cuda-133_arch-x86_64.yaml b/conda/environments/all_cuda-133_arch-x86_64.yaml index bab866e313..7b06a9c20e 100644 --- a/conda/environments/all_cuda-133_arch-x86_64.yaml +++ b/conda/environments/all_cuda-133_arch-x86_64.yaml @@ -29,11 +29,13 @@ dependencies: - libnvjitlink-dev - librmm==26.10.*,>=0.0.0a0 - make +- maven - nccl>=2.19 - ninja - nodejs>=22 - numpy>=2.0,<3.0 - openblas +- openjdk=22.* - pre-commit - pylibraft==26.10.*,>=0.0.0a0 - pytest diff --git a/dependencies.yaml b/dependencies.yaml index 0b82ed2f4e..e14e36ee99 100644 --- a/dependencies.yaml +++ b/dependencies.yaml @@ -288,6 +288,11 @@ dependencies: - output_types: [conda] packages: - c-compiler + # spotless-fmt pre-commit hook requires Maven and a JDK + - output_types: [conda] + packages: + - maven + - openjdk=22.* clang: common: - output_types: conda diff --git a/java/cuvs-java/pom.xml b/java/cuvs-java/pom.xml index 7d00a7e9b7..b48f3aaec4 100644 --- a/java/cuvs-java/pom.xml +++ b/java/cuvs-java/pom.xml @@ -252,14 +252,6 @@ SPDX-License-Identifier: Apache-2.0 com.diffplug.spotless spotless-maven-plugin 2.44.5 - - - - apply - - validate - - @@ -268,15 +260,20 @@ SPDX-License-Identifier: Apache-2.0 src/**/panama/*.java + + + Use the headers_h facade, not numbered jextract classes + \bheaders_h_[0-9]+\b + headers_h + 1.27.0 true false - - ${project.basedir}/../license-header.txt - diff --git a/java/cuvs-java/src/main/java/com/nvidia/cuvs/CuVSAceParams.java b/java/cuvs-java/src/main/java/com/nvidia/cuvs/CuVSAceParams.java index b70547b333..eddb404874 100644 --- a/java/cuvs-java/src/main/java/com/nvidia/cuvs/CuVSAceParams.java +++ b/java/cuvs-java/src/main/java/com/nvidia/cuvs/CuVSAceParams.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ package com.nvidia.cuvs; @@ -75,8 +75,13 @@ public class CuVSAceParams { */ private final double maxGpuMemoryGb; - private CuVSAceParams(long npartitions, long efConstruction, String buildDir, boolean useDisk, - double maxHostMemoryGb, double maxGpuMemoryGb) { + private CuVSAceParams( + long npartitions, + long efConstruction, + String buildDir, + boolean useDisk, + double maxHostMemoryGb, + double maxGpuMemoryGb) { this.npartitions = npartitions; this.efConstruction = efConstruction; this.buildDir = buildDir; @@ -259,8 +264,8 @@ public Builder withMaxGpuMemoryGb(double maxGpuMemoryGb) { * @return an instance of {@link CuVSAceParams} */ public CuVSAceParams build() { - return new CuVSAceParams(npartitions, efConstruction, buildDir, useDisk, - maxHostMemoryGb, maxGpuMemoryGb); + return new CuVSAceParams( + npartitions, efConstruction, buildDir, useDisk, maxHostMemoryGb, maxGpuMemoryGb); } } } diff --git a/java/cuvs-java/src/main/java/com/nvidia/cuvs/CuVSResources.java b/java/cuvs-java/src/main/java/com/nvidia/cuvs/CuVSResources.java index 3b346e92fb..959206f274 100644 --- a/java/cuvs-java/src/main/java/com/nvidia/cuvs/CuVSResources.java +++ b/java/cuvs-java/src/main/java/com/nvidia/cuvs/CuVSResources.java @@ -102,11 +102,9 @@ static CuVSResources create(Path tempDirectory) throws Throwable { * @throws LibraryException if the native library cannot be loaded */ static CuVSResources create( - Path tempDirectory, - Path memoryTrackingCsvPath, - Duration memoryTrackingSampleInterval) throws Throwable { + Path tempDirectory, Path memoryTrackingCsvPath, Duration memoryTrackingSampleInterval) + throws Throwable { return CuVSProvider.provider() - .newCuVSResources( - tempDirectory, memoryTrackingCsvPath, memoryTrackingSampleInterval); + .newCuVSResources(tempDirectory, memoryTrackingCsvPath, memoryTrackingSampleInterval); } } diff --git a/java/cuvs-java/src/main/java/com/nvidia/cuvs/HnswAceParams.java b/java/cuvs-java/src/main/java/com/nvidia/cuvs/HnswAceParams.java index 325f424fae..41370f0ac5 100644 --- a/java/cuvs-java/src/main/java/com/nvidia/cuvs/HnswAceParams.java +++ b/java/cuvs-java/src/main/java/com/nvidia/cuvs/HnswAceParams.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ package com.nvidia.cuvs; @@ -21,8 +21,12 @@ public class HnswAceParams { private double maxHostMemoryGb; private double maxGpuMemoryGb; - private HnswAceParams(long npartitions, String buildDir, boolean useDisk, - double maxHostMemoryGb, double maxGpuMemoryGb) { + private HnswAceParams( + long npartitions, + String buildDir, + boolean useDisk, + double maxHostMemoryGb, + double maxGpuMemoryGb) { this.npartitions = npartitions; this.buildDir = buildDir; this.useDisk = useDisk; @@ -188,8 +192,7 @@ public Builder withMaxGpuMemoryGb(double maxGpuMemoryGb) { * @return an instance of {@link HnswAceParams} */ public HnswAceParams build() { - return new HnswAceParams(npartitions, buildDir, useDisk, - maxHostMemoryGb, maxGpuMemoryGb); + return new HnswAceParams(npartitions, buildDir, useDisk, maxHostMemoryGb, maxGpuMemoryGb); } } } diff --git a/java/cuvs-java/src/main/java/com/nvidia/cuvs/HnswIndexParams.java b/java/cuvs-java/src/main/java/com/nvidia/cuvs/HnswIndexParams.java index 070cbedae1..294e21cce5 100644 --- a/java/cuvs-java/src/main/java/com/nvidia/cuvs/HnswIndexParams.java +++ b/java/cuvs-java/src/main/java/com/nvidia/cuvs/HnswIndexParams.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ package com.nvidia.cuvs; @@ -283,13 +283,7 @@ public Builder withAceParams(HnswAceParams aceParams) { */ public HnswIndexParams build() { return new HnswIndexParams( - hierarchy, - efConstruction, - numThreads, - vectorDimension, - m, - metric, - aceParams); + hierarchy, efConstruction, numThreads, vectorDimension, m, metric, aceParams); } } } diff --git a/java/cuvs-java/src/main/java/com/nvidia/cuvs/spi/CuVSProvider.java b/java/cuvs-java/src/main/java/com/nvidia/cuvs/spi/CuVSProvider.java index 60a2928aec..fc4dc990a0 100644 --- a/java/cuvs-java/src/main/java/com/nvidia/cuvs/spi/CuVSProvider.java +++ b/java/cuvs-java/src/main/java/com/nvidia/cuvs/spi/CuVSProvider.java @@ -54,9 +54,8 @@ default Path nativeLibraryPath() { * CSV samples */ default CuVSResources newCuVSResources( - Path tempDirectory, - Path memoryTrackingCsvPath, - Duration memoryTrackingSampleInterval) throws Throwable { + Path tempDirectory, Path memoryTrackingCsvPath, Duration memoryTrackingSampleInterval) + throws Throwable { throw new UnsupportedOperationException( "Memory-tracking resources are not supported by this provider"); } diff --git a/java/cuvs-java/src/main/java/com/nvidia/cuvs/spi/UnsupportedProvider.java b/java/cuvs-java/src/main/java/com/nvidia/cuvs/spi/UnsupportedProvider.java index 0c5643d2a3..bbb6257eff 100644 --- a/java/cuvs-java/src/main/java/com/nvidia/cuvs/spi/UnsupportedProvider.java +++ b/java/cuvs-java/src/main/java/com/nvidia/cuvs/spi/UnsupportedProvider.java @@ -28,9 +28,7 @@ public CuVSResources newCuVSResources(Path tempDirectory) { @Override public CuVSResources newCuVSResources( - Path tempDirectory, - Path memoryTrackingCsvPath, - Duration memoryTrackingSampleInterval) { + Path tempDirectory, Path memoryTrackingCsvPath, Duration memoryTrackingSampleInterval) { throw new UnsupportedOperationException(reasons); } diff --git a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CagraIndexImpl.java b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CagraIndexImpl.java index abc53a5945..93ad965a72 100644 --- a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CagraIndexImpl.java +++ b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CagraIndexImpl.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ package com.nvidia.cuvs.internal; @@ -632,8 +632,10 @@ private static void populateNativeIndexParams( cuvsAceParams.npartitions(cuvsAceParamsMemorySegment, cuVSAceParams.getNpartitions()); cuvsAceParams.ef_construction(cuvsAceParamsMemorySegment, cuVSAceParams.getEfConstruction()); cuvsAceParams.use_disk(cuvsAceParamsMemorySegment, cuVSAceParams.isUseDisk()); - cuvsAceParams.max_host_memory_gb(cuvsAceParamsMemorySegment, cuVSAceParams.getMaxHostMemoryGb()); - cuvsAceParams.max_gpu_memory_gb(cuvsAceParamsMemorySegment, cuVSAceParams.getMaxGpuMemoryGb()); + cuvsAceParams.max_host_memory_gb( + cuvsAceParamsMemorySegment, cuVSAceParams.getMaxHostMemoryGb()); + cuvsAceParams.max_gpu_memory_gb( + cuvsAceParamsMemorySegment, cuVSAceParams.getMaxGpuMemoryGb()); String buildDir = cuVSAceParams.getBuildDir(); if (buildDir != null && !buildDir.isEmpty()) { diff --git a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CuVSResourcesImpl.java b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CuVSResourcesImpl.java index 454ef57b81..e3c88e0ca9 100644 --- a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CuVSResourcesImpl.java +++ b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CuVSResourcesImpl.java @@ -6,7 +6,6 @@ import static com.nvidia.cuvs.internal.common.Util.checkCuVSError; import static com.nvidia.cuvs.internal.panama.headers_h.*; -import static com.nvidia.cuvs.internal.panama.headers_h_1.C_INT; import com.nvidia.cuvs.CuVSResources; import com.nvidia.cuvs.DelegatingScopedAccess; @@ -68,17 +67,13 @@ public CuVSResourcesImpl(Path tempDirectory) { * CSV samples */ public CuVSResourcesImpl( - Path tempDirectory, - Path memoryTrackingCsvPath, - Duration memoryTrackingSampleInterval) { + Path tempDirectory, Path memoryTrackingCsvPath, Duration memoryTrackingSampleInterval) { this.tempDirectory = tempDirectory; try (var localArena = Arena.ofConfined()) { var resourcesMemorySegment = localArena.allocate(cuvsResources_t); - byte[] pathBytes = - memoryTrackingCsvPath.toString().getBytes(StandardCharsets.UTF_8); + byte[] pathBytes = memoryTrackingCsvPath.toString().getBytes(StandardCharsets.UTF_8); var pathSegment = localArena.allocate(pathBytes.length + 1L); - MemorySegment.copy( - pathBytes, 0, pathSegment, ValueLayout.JAVA_BYTE, 0, pathBytes.length); + MemorySegment.copy(pathBytes, 0, pathSegment, ValueLayout.JAVA_BYTE, 0, pathBytes.length); pathSegment.set(ValueLayout.JAVA_BYTE, pathBytes.length, (byte) 0); long sampleIntervalMs = memoryTrackingSampleInterval.toMillis(); checkCuVSError( diff --git a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/GPUInfoProviderImpl.java b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/GPUInfoProviderImpl.java index f77d417069..6860fb9e89 100644 --- a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/GPUInfoProviderImpl.java +++ b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/GPUInfoProviderImpl.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ package com.nvidia.cuvs.internal; @@ -7,8 +7,7 @@ import static com.nvidia.cuvs.internal.common.LinkerHelper.C_INT; import static com.nvidia.cuvs.internal.common.Util.checkCudaError; import static com.nvidia.cuvs.internal.common.Util.cudaGetDeviceProperties; -import static com.nvidia.cuvs.internal.panama.headers_h.cudaMemGetInfo; -import static com.nvidia.cuvs.internal.panama.headers_h_1.*; +import static com.nvidia.cuvs.internal.panama.headers_h.*; import com.nvidia.cuvs.CuVSResources; import com.nvidia.cuvs.CuVSResourcesInfo; diff --git a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/HnswIndexImpl.java b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/HnswIndexImpl.java index ca528ac010..58457e0405 100644 --- a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/HnswIndexImpl.java +++ b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/HnswIndexImpl.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ package com.nvidia.cuvs.internal; @@ -251,8 +251,8 @@ public static HnswIndex.Builder newBuilder(CuVSResources cuvsResources) { * @return A new HNSW index ready for search * @throws Throwable if an error occurs during building */ - public static HnswIndex build(CuVSResources resources, HnswIndexParams hnswParams, CuVSMatrix dataset) - throws Throwable { + public static HnswIndex build( + CuVSResources resources, HnswIndexParams hnswParams, CuVSMatrix dataset) throws Throwable { Objects.requireNonNull(resources); Objects.requireNonNull(hnswParams); Objects.requireNonNull(dataset); @@ -288,7 +288,8 @@ public static HnswIndex build(CuVSResources resources, HnswIndexParams hnswParam return new HnswIndexImpl(new IndexReference(hnswIndex), resources, hnswParams); } - private static CloseableHandle createHnswIndexParamsForBuild(Arena arena, HnswIndexParams params) { + private static CloseableHandle createHnswIndexParamsForBuild( + Arena arena, HnswIndexParams params) { var hnswParams = createHnswIndexParams(); MemorySegment seg = hnswParams.handle(); @@ -324,7 +325,7 @@ private static MemorySegment prepareTensorFromMatrix(Arena arena, CuVSMatrix dat return prepareTensor( arena, matrixInternal.memorySegment(), - new long[]{dataset.size(), dataset.columns()}, + new long[] {dataset.size(), dataset.columns()}, matrixInternal.code(), matrixInternal.bits(), kDLCPU()); diff --git a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/common/Util.java b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/common/Util.java index 7ca7640cd8..253b8a447a 100644 --- a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/common/Util.java +++ b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/common/Util.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ package com.nvidia.cuvs.internal.common; @@ -9,7 +9,6 @@ import static com.nvidia.cuvs.internal.common.LinkerHelper.C_INT; import static com.nvidia.cuvs.internal.common.LinkerHelper.C_LONG; import static com.nvidia.cuvs.internal.panama.headers_h.*; -import static com.nvidia.cuvs.internal.panama.headers_h_1.cudaStream_t; import com.nvidia.cuvs.CuVSResources; import com.nvidia.cuvs.internal.panama.DLDataType; diff --git a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/spi/JDKProvider.java b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/spi/JDKProvider.java index c9cff1e272..e067120642 100644 --- a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/spi/JDKProvider.java +++ b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/spi/JDKProvider.java @@ -235,9 +235,7 @@ public CuVSResources newCuVSResources(Path tempDirectory) { @Override public CuVSResources newCuVSResources( - Path tempDirectory, - Path memoryTrackingCsvPath, - Duration memoryTrackingSampleInterval) { + Path tempDirectory, Path memoryTrackingCsvPath, Duration memoryTrackingSampleInterval) { Objects.requireNonNull(tempDirectory); Objects.requireNonNull(memoryTrackingCsvPath); Objects.requireNonNull(memoryTrackingSampleInterval); diff --git a/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraAceBuildAndSearchIT.java b/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraAceBuildAndSearchIT.java index a2639be5c4..1ca1ee93da 100644 --- a/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraAceBuildAndSearchIT.java +++ b/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraAceBuildAndSearchIT.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ package com.nvidia.cuvs; @@ -187,7 +187,10 @@ public void testAceDiskBasedBuild() throws Throwable { // Convert CAGRA index to HNSW using fromCagra // This automatically handles disk-based indices HnswIndexParams hnswIndexParams = - new HnswIndexParams.Builder().withVectorDimension(2).withHierarchy(HnswHierarchy.GPU).build(); + new HnswIndexParams.Builder() + .withVectorDimension(2) + .withHierarchy(HnswHierarchy.GPU) + .build(); try (var hnswIndexSerialized = HnswIndex.fromCagra(hnswIndexParams, index)) { var hnswIndexSerializedPath = buildDir.resolve("hnsw_index.bin"); diff --git a/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswAceBuildAndSearchIT.java b/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswAceBuildAndSearchIT.java index 17d64838dc..835fcd6e23 100644 --- a/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswAceBuildAndSearchIT.java +++ b/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswAceBuildAndSearchIT.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ package com.nvidia.cuvs; @@ -227,7 +227,8 @@ public void testHnswAceWithDifferentHierarchy() throws Throwable { float[][] queries = createSampleQueries(); List> expectedResults = getExpectedResults(); - for (CuvsHnswHierarchy hierarchy : Arrays.asList(CuvsHnswHierarchy.NONE, CuvsHnswHierarchy.GPU)) { + for (CuvsHnswHierarchy hierarchy : + Arrays.asList(CuvsHnswHierarchy.NONE, CuvsHnswHierarchy.GPU)) { try (CuVSResources resources = CheckedCuVSResources.create()) { Path buildDir = Files.createTempDirectory("hnsw_ace_hierarchy_test"); diff --git a/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswBuildAndSearchIT.java b/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswBuildAndSearchIT.java index c963efa374..6de9d13704 100644 --- a/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswBuildAndSearchIT.java +++ b/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswBuildAndSearchIT.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ package com.nvidia.cuvs; @@ -73,7 +73,10 @@ private static void indexAndQueryOnce( // Use NONE hierarchy since serializeToHNSW creates a base-layer-only index HnswIndexParams hnswIndexParams = - new HnswIndexParams.Builder().withVectorDimension(2).withHierarchy(HnswHierarchy.NONE).build(); + new HnswIndexParams.Builder() + .withVectorDimension(2) + .withHierarchy(HnswHierarchy.NONE) + .build(); try (var inputStreamHNSW = Files.newInputStream(hnswIndexPath)) { var hnswIndex = HnswIndex.newBuilder(resources) diff --git a/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswRandomizedIT.java b/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswRandomizedIT.java index d5c4f9096d..fe5ca88073 100644 --- a/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswRandomizedIT.java +++ b/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswRandomizedIT.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ package com.nvidia.cuvs; @@ -132,7 +132,10 @@ private void tmpResultsTopKWithRandomValues(boolean useNativeMemoryDataset) thro // Use NONE hierarchy since serializeToHNSW creates a base-layer-only index HnswIndexParams hnswIndexParams = - new HnswIndexParams.Builder().withVectorDimension(dimensions).withHierarchy(HnswHierarchy.NONE).build(); + new HnswIndexParams.Builder() + .withVectorDimension(dimensions) + .withHierarchy(HnswHierarchy.NONE) + .build(); try (var inputStreamHNSW = Files.newInputStream(hnswIndexPath)) { HnswIndex hnswIndex = diff --git a/java/cuvs-java/src/test/java/com/nvidia/cuvs/MemoryTrackingResourcesIT.java b/java/cuvs-java/src/test/java/com/nvidia/cuvs/MemoryTrackingResourcesIT.java index 494444ed9f..b80a789025 100644 --- a/java/cuvs-java/src/test/java/com/nvidia/cuvs/MemoryTrackingResourcesIT.java +++ b/java/cuvs-java/src/test/java/com/nvidia/cuvs/MemoryTrackingResourcesIT.java @@ -26,19 +26,16 @@ public void writesNonEmptyCsv() throws Throwable { Path csv = Files.createTempFile("cuvs-mtrack", ".csv"); try { try (var resources = - CuVSResources.create( - CuVSProvider.tempDirectory(), csv, Duration.ofMillis(2))) { + CuVSResources.create(CuVSProvider.tempDirectory(), csv, Duration.ofMillis(2))) { // Allocate / release a couple of small device buffers so the // background CSV reporter has something to report. - var b1 = - CuVSMatrix.deviceBuilder(resources, 64, 32, CuVSMatrix.DataType.FLOAT); + var b1 = CuVSMatrix.deviceBuilder(resources, 64, 32, CuVSMatrix.DataType.FLOAT); for (int i = 0; i < 64; ++i) { b1.addVector(new float[32]); } try (var m1 = b1.build()) { - var b2 = - CuVSMatrix.deviceBuilder(resources, 32, 16, CuVSMatrix.DataType.FLOAT); + var b2 = CuVSMatrix.deviceBuilder(resources, 32, 16, CuVSMatrix.DataType.FLOAT); for (int i = 0; i < 32; ++i) { b2.addVector(new float[16]); } diff --git a/java/examples/pom.xml b/java/examples/pom.xml index e0c327edde..b4c53552f1 100644 --- a/java/examples/pom.xml +++ b/java/examples/pom.xml @@ -105,9 +105,6 @@ SPDX-License-Identifier: Apache-2.0 true false - - ${project.basedir}/../license-header.txt - diff --git a/java/license-header.txt b/java/license-header.txt deleted file mode 100644 index e49ea20ab7..0000000000 --- a/java/license-header.txt +++ /dev/null @@ -1,4 +0,0 @@ -/* - * SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. - * SPDX-License-Identifier: Apache-2.0 - */ From 45c9fbf3bf95ba2e5525af8e332a806543cbc8d4 Mon Sep 17 00:00:00 2001 From: Igor Motov Date: Fri, 24 Jul 2026 16:51:40 -1000 Subject: [PATCH 2/8] Add tracking issue to checkstyle TODO comment --- java/cuvs-java/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/java/cuvs-java/pom.xml b/java/cuvs-java/pom.xml index b48f3aaec4..87c84794d7 100644 --- a/java/cuvs-java/pom.xml +++ b/java/cuvs-java/pom.xml @@ -262,6 +262,7 @@ SPDX-License-Identifier: Apache-2.0 Use the headers_h facade, not numbered jextract classes From ef310902785449bf912619608caceda9a76e23e9 Mon Sep 17 00:00:00 2001 From: Igor Motov Date: Tue, 28 Jul 2026 08:02:29 -1000 Subject: [PATCH 3/8] Use a single openjdk anchor --- dependencies.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.yaml b/dependencies.yaml index 0dff321ded..5733883724 100644 --- a/dependencies.yaml +++ b/dependencies.yaml @@ -301,7 +301,7 @@ dependencies: - output_types: [conda] packages: - maven - - openjdk=22.* + - &openjdk openjdk=22.* clang: common: - output_types: conda @@ -596,7 +596,7 @@ dependencies: - *cmake_ver - libboost-devel - maven - - openjdk=22.* + - *openjdk bench: common: - output_types: [conda, pyproject, requirements] From 1d49766ca7a5ccf3346836effc85f536be55062d Mon Sep 17 00:00:00 2001 From: Igor Motov Date: Tue, 28 Jul 2026 08:03:16 -1000 Subject: [PATCH 4/8] Don't force maven on all devs --- .pre-commit-config.yaml | 4 ++-- ci/checks/run_spotless.sh | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100755 ci/checks/run_spotless.sh diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6adf07c05b..083933bc5a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -95,11 +95,11 @@ repos: language: rust - id: spotless-fmt name: spotless-fmt - entry: mvn --batch-mode --quiet -f java/cuvs-java/pom.xml spotless:apply + entry: ci/checks/run_spotless.sh pass_filenames: false files: ^java/cuvs-java/src/.*\.java$ exclude: .*/panama/.* - language: system + language: script - id: clang-format-with-cmake-placeholders name: clang-format-with-cmake-placeholders entry: python3 ci/checks/clang_format_with_cmake_placeholders.py diff --git a/ci/checks/run_spotless.sh b/ci/checks/run_spotless.sh new file mode 100755 index 0000000000..5ad4dfe203 --- /dev/null +++ b/ci/checks/run_spotless.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# pre-commit hook wrapper that runs 'spotless:apply' to format the Java client sources. +# +# Most cuvs contributors do not work on the Java client and do not have Maven installed. For them +# (running outside CI without Maven) this skips gracefully, so that 'pre-commit run --all-files' +# does not require every contributor to install Maven. In CI, Maven is expected to be available and +# its absence is treated as an error. + +set -euo pipefail + +if ! command -v mvn >/dev/null 2>&1; then + if [ "${CI:-false}" = "true" ]; then + echo "spotless-fmt: 'mvn' is required in CI but was not found on PATH." >&2 + exit 1 + fi + echo "spotless-fmt: skipping Java formatting ('mvn' not installed and not running in CI)." >&2 + exit 0 +fi + +exec mvn --batch-mode --quiet -f java/cuvs-java/pom.xml spotless:apply From 518d5e76438eed0a7082a3293ec0d26bb991c743 Mon Sep 17 00:00:00 2001 From: Igor Motov Date: Tue, 28 Jul 2026 08:15:29 -1000 Subject: [PATCH 5/8] Check that CI fails on unformatted files --- .../src/main/java22/com/nvidia/cuvs/spi/JDKProvider.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/spi/JDKProvider.java b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/spi/JDKProvider.java index e067120642..b8fb4d64d1 100644 --- a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/spi/JDKProvider.java +++ b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/spi/JDKProvider.java @@ -39,9 +39,9 @@ record CuVSVersion(short major, short minor, short patch) { static CuVSVersion fromString(String versionString) { var tokens = versionString.split("\\."); - final short major = parseToken(tokens, 0); - final short minor = parseToken(tokens, 1); - final short patch = parseToken(tokens, 2); +final short major = parseToken(tokens, 0); +final short minor = parseToken(tokens, 1); +final short patch = parseToken(tokens, 2); if (major == 0 || minor == 0) { return null; } From d2e29a0cb1dd2a3edb26119cb0e7a16ea5579119 Mon Sep 17 00:00:00 2001 From: Igor Motov Date: Tue, 28 Jul 2026 08:23:39 -1000 Subject: [PATCH 6/8] Fix format --- .../src/main/java22/com/nvidia/cuvs/spi/JDKProvider.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/spi/JDKProvider.java b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/spi/JDKProvider.java index b8fb4d64d1..e067120642 100644 --- a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/spi/JDKProvider.java +++ b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/spi/JDKProvider.java @@ -39,9 +39,9 @@ record CuVSVersion(short major, short minor, short patch) { static CuVSVersion fromString(String versionString) { var tokens = versionString.split("\\."); -final short major = parseToken(tokens, 0); -final short minor = parseToken(tokens, 1); -final short patch = parseToken(tokens, 2); + final short major = parseToken(tokens, 0); + final short minor = parseToken(tokens, 1); + final short patch = parseToken(tokens, 2); if (major == 0 || minor == 0) { return null; } From dc401dd7a1842dd401494cde04751a3b18b27e3d Mon Sep 17 00:00:00 2001 From: Igor Motov Date: Fri, 31 Jul 2026 07:34:13 -1000 Subject: [PATCH 7/8] Fix java spotless and re-format files --- .pre-commit-config.yaml | 14 +++++++------- .../cuvs/internal/FilterBitsetPoolConfig.java | 3 +-- .../cuvs/internal/FilterBitsetHandleImpl.java | 16 ++++++++++------ .../internal/MultiPartitionCagraSearchImpl.java | 3 ++- .../com/nvidia/cuvs/BruteForceAndSearchIT.java | 5 +++-- .../com/nvidia/cuvs/CagraBuildAndSearchIT.java | 3 ++- .../com/nvidia/cuvs/FilterBitsetHandleIT.java | 3 ++- 7 files changed, 27 insertions(+), 20 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3ce0b93703..0f1d6b7842 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -93,13 +93,13 @@ repos: pass_filenames: false files: rust/.* language: rust - - id: spotless-fmt - name: spotless-fmt - entry: ci/checks/run_spotless.sh - pass_filenames: false - files: ^java/cuvs-java/src/.*\.java$ - exclude: .*/panama/.* - language: script + - id: spotless-fmt + name: spotless-fmt + entry: ci/checks/run_spotless.sh + pass_filenames: false + files: ^java/cuvs-java/src/.*\.java$ + exclude: .*/panama/.* + language: script - id: clang-format-with-cmake-placeholders name: clang-format-with-cmake-placeholders entry: python3 ci/checks/clang_format_with_cmake_placeholders.py diff --git a/java/cuvs-java/src/main/java/com/nvidia/cuvs/internal/FilterBitsetPoolConfig.java b/java/cuvs-java/src/main/java/com/nvidia/cuvs/internal/FilterBitsetPoolConfig.java index 514c518471..66694ea85b 100644 --- a/java/cuvs-java/src/main/java/com/nvidia/cuvs/internal/FilterBitsetPoolConfig.java +++ b/java/cuvs-java/src/main/java/com/nvidia/cuvs/internal/FilterBitsetPoolConfig.java @@ -43,8 +43,7 @@ static OptionalLong resolvePoolBytes(String raw) { return OptionalLong.of(DEFAULT_FILTER_POOL_BYTES); } - long alignedBytes = - (requestedBytes + (RMM_ALIGNMENT_BYTES - 1)) & ~(RMM_ALIGNMENT_BYTES - 1); + long alignedBytes = (requestedBytes + (RMM_ALIGNMENT_BYTES - 1)) & ~(RMM_ALIGNMENT_BYTES - 1); return OptionalLong.of(alignedBytes); } diff --git a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/FilterBitsetHandleImpl.java b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/FilterBitsetHandleImpl.java index 4aef526bc4..b567174aed 100644 --- a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/FilterBitsetHandleImpl.java +++ b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/FilterBitsetHandleImpl.java @@ -71,8 +71,8 @@ void close() { // (and callers configure per-resources workspace pools, so the workspace MRs are genuinely // distinct). Binding the allocation to the short-lived per-query resources passed to search // crashes: that resources can be torn down (e.g. on segment reader close) while a handle is still - // cached in the shared FilterBitsetCache, leaving the free with a dangling resources. A dedicated, - // never-closed resources keeps alloc and free on one always-valid workspace MR. + // cached in the shared FilterBitsetCache, leaving the free with a dangling resources. A + // dedicated, never-closed resources keeps alloc and free on one always-valid workspace MR. private static final Object FILTER_RESOURCES_LOCK = new Object(); private static volatile CuVSResources filterResources; @@ -85,7 +85,8 @@ private static CuVSResources filterResources() { try { r = CuVSResources.create(); } catch (Throwable t) { - throw new RuntimeException("Failed to create resources for filter bitset device memory", t); + throw new RuntimeException( + "Failed to create resources for filter bitset device memory", t); } maybeSetFilterPool(r); filterResources = r; @@ -183,8 +184,10 @@ DeviceData getOrUpload() { private DeviceData upload() { long combinedBitsetBytes = (long) combinedLongs.length * Long.BYTES; - // Serialize uploads: they share one resources (single stream/host-buffer) and are rare (once per - // distinct filter, on cache miss). The free path uses the captured resources handle directly and + // Serialize uploads: they share one resources (single stream/host-buffer) and are rare (once + // per + // distinct filter, on cache miss). The free path uses the captured resources handle directly + // and // is RMM-thread-safe, so it needs no lock. synchronized (FILTER_RESOURCES_LOCK) { try (var access = filterResources().access()) { @@ -203,7 +206,8 @@ private DeviceData upload() { checkCuVSError(cuvsStreamSync(cuvsRes), "cuvsStreamSync in FilterBitsetHandle.upload"); } - // Stream sync has returned — device memory is fully populated. uint32 words = long count * 2. + // Stream sync has returned — device memory is fully populated. uint32 words = long count + // * 2. return new DeviceData(combinedBitsetDP, (long) combinedLongs.length * 2); } catch (Throwable t) { try { diff --git a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/MultiPartitionCagraSearchImpl.java b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/MultiPartitionCagraSearchImpl.java index 2ccf357ecc..0c8837f7a2 100644 --- a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/MultiPartitionCagraSearchImpl.java +++ b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/MultiPartitionCagraSearchImpl.java @@ -172,7 +172,8 @@ public static MultiPartitionSearchResults search( FilterBitsetHandle f = filters.get(i); if (f != null) { FilterBitsetHandleImpl.DeviceData dev = ((FilterBitsetHandleImpl) f).getOrUpload(); - buildCuvsFilterStruct(arena, filterSeg, dev.combinedBitsetDP.handle(), dev.combinedWords); + buildCuvsFilterStruct( + arena, filterSeg, dev.combinedBitsetDP.handle(), dev.combinedWords); } else { cuvsFilter.type(filterSeg, 0 /* NO_FILTER */); cuvsFilter.addr(filterSeg, 0L); diff --git a/java/cuvs-java/src/test/java/com/nvidia/cuvs/BruteForceAndSearchIT.java b/java/cuvs-java/src/test/java/com/nvidia/cuvs/BruteForceAndSearchIT.java index d348c44c3f..ab59395dd2 100644 --- a/java/cuvs-java/src/test/java/com/nvidia/cuvs/BruteForceAndSearchIT.java +++ b/java/cuvs-java/src/test/java/com/nvidia/cuvs/BruteForceAndSearchIT.java @@ -156,8 +156,9 @@ public void testPrefilterWithTrailingZeroWords() throws Throwable { // farthest of all - so any leaked document from the corrupted high words would displace it. float[][] localQueries = {{64.0f, 0.0f}}; - // Allow only document 0. All higher bits are 0, so BitSet.toLongArray() drops the trailing words - // covering documents 64..127 - exactly the region the buggy copy fills from adjacent host memory. + // Allow only document 0. All higher bits are 0, so BitSet.toLongArray() drops the trailing + // words covering documents 64..127 - exactly the region the buggy copy fills from adjacent host + // memory. BitSet prefilter = new BitSet(numDocs); prefilter.set(0); diff --git a/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraBuildAndSearchIT.java b/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraBuildAndSearchIT.java index 7c938be458..1a5fa7d810 100644 --- a/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraBuildAndSearchIT.java +++ b/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraBuildAndSearchIT.java @@ -629,7 +629,8 @@ public void testByteQuerySearch() throws Throwable { CagraQuery query = new CagraQuery.Builder(resources) .withTopK(1) - // Pin SINGLE_CTA; AUTO may pick MULTI_CTA, which drops neighbors on this tiny dataset. + // Pin SINGLE_CTA; AUTO may pick MULTI_CTA, which drops neighbors on this tiny + // dataset. .withSearchParams( new CagraSearchParams.Builder() .withAlgo(CagraSearchParams.SearchAlgo.SINGLE_CTA) diff --git a/java/cuvs-java/src/test/java/com/nvidia/cuvs/FilterBitsetHandleIT.java b/java/cuvs-java/src/test/java/com/nvidia/cuvs/FilterBitsetHandleIT.java index 108a3610aa..217e4844b3 100644 --- a/java/cuvs-java/src/test/java/com/nvidia/cuvs/FilterBitsetHandleIT.java +++ b/java/cuvs-java/src/test/java/com/nvidia/cuvs/FilterBitsetHandleIT.java @@ -68,7 +68,8 @@ public void testConcurrentFilteredSearchWithSharedHandleIsStable() throws Throwa // Warm up the device upload on the long-lived `resources` so the shared allocation is bound // to it. Per-thread resources are closed when each search thread finishes; binding the // allocation to one of those would free it against destroyed resources at handle close. - assertNoFilteredRows(searchOnce(resources, indices, queries, partStart, filters), partStart); + assertNoFilteredRows( + searchOnce(resources, indices, queries, partStart, filters), partStart); List errors = runConcurrentSearches( indices, queries, partStart, filters, numThreads, searchesPerThread); From d70a20c72d9ffc3ab3e42009f2e2ec591bd665bc Mon Sep 17 00:00:00 2001 From: Igor Motov Date: Fri, 31 Jul 2026 13:29:29 -1000 Subject: [PATCH 8/8] Fix format after release/26.08 forwardport --- .../nvidia/cuvs/internal/CagraIndexImpl.java | 22 ++++++------------- .../nvidia/cuvs/CagraBuildAndSearchIT.java | 3 +-- .../com/nvidia/cuvs/FilterBitsetHandleIT.java | 1 + .../cuvs/MultiPartitionCagraSearchIT.java | 1 + 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CagraIndexImpl.java b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CagraIndexImpl.java index 0539a0da5f..691c99e93f 100644 --- a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CagraIndexImpl.java +++ b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CagraIndexImpl.java @@ -81,9 +81,7 @@ private CagraIndexImpl(InputStream inputStream, CuVSResources resources) throws } private CagraIndexImpl( - InputStream inputStream, - CuVSResources resources, - CagraIndex.DeserializeDataset outDataset) + InputStream inputStream, CuVSResources resources, CagraIndex.DeserializeDataset outDataset) throws Throwable { this.resources = resources; this.cagraIndexReference = deserialize(inputStream, outDataset); @@ -412,8 +410,7 @@ public MemorySegment getIndexHandle() { } @Override - public CagraIndex.PaddedDataset makePaddedDataset(CuVSMatrix dataset) - throws Throwable { + public CagraIndex.PaddedDataset makePaddedDataset(CuVSMatrix dataset) throws Throwable { checkNotDestroyed(); Objects.requireNonNull(dataset); if (!(dataset instanceof CuVSMatrixInternal datasetInternal)) { @@ -441,8 +438,7 @@ public CagraIndex.PaddedDataset makePaddedDataset(CuVSMatrix dataset) } @Override - public CagraIndex.PaddedDatasetView makePaddedDatasetView(CuVSMatrix dataset) - throws Throwable { + public CagraIndex.PaddedDatasetView makePaddedDatasetView(CuVSMatrix dataset) throws Throwable { checkNotDestroyed(); Objects.requireNonNull(dataset); if (!(dataset instanceof CuVSMatrixInternal datasetInternal)) { @@ -967,8 +963,7 @@ public static CagraIndex merge(CagraIndex[] indexes, CagraIndexParams mergeParam mergedDataset, mergedIndex), "cuvsCagraMerge"); - return new CagraIndexImpl( - new IndexReference(mergedIndex, null, datasetOwner), resources); + return new CagraIndexImpl(new IndexReference(mergedIndex, null, datasetOwner), resources); } catch (Throwable e) { try { datasetOwner.close(); @@ -1005,8 +1000,7 @@ public Builder from(InputStream inputStream) { } @Override - public Builder from( - InputStream inputStream, CagraIndex.DeserializeDataset outDataset) { + public Builder from(InputStream inputStream, CagraIndex.DeserializeDataset outDataset) { this.inputStream = inputStream; this.outDataset = Objects.requireNonNull(outDataset); return this; @@ -1053,7 +1047,7 @@ public CagraIndexImpl build() throws Throwable { } else if (dataset != null) { return new CagraIndexImpl(cagraIndexParams, dataset, cuvsResources); } else { - throw new IllegalArgumentException("dataset must be provided"); + throw new IllegalArgumentException("dataset must be provided"); } } } @@ -1083,9 +1077,7 @@ private IndexReference(MemorySegment indexMemorySegment, CuVSMatrix dataset) { } private IndexReference( - MemorySegment indexMemorySegment, - CuVSMatrix dataset, - AutoCloseable datasetOwner) { + MemorySegment indexMemorySegment, CuVSMatrix dataset, AutoCloseable datasetOwner) { this.memorySegment = indexMemorySegment; this.dataset = dataset; this.datasetOwner = datasetOwner; diff --git a/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraBuildAndSearchIT.java b/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraBuildAndSearchIT.java index 77f4256b0b..e2287c0a22 100644 --- a/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraBuildAndSearchIT.java +++ b/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraBuildAndSearchIT.java @@ -179,8 +179,7 @@ public void testDeserializeReturnsCallerOwnedStandardDataset() throws Throwable try (var indexDataset = index.makePaddedDataset(deviceVectors); var outDataset = new CagraIndex.StandardDataset(); var inputStream = Files.newInputStream(indexPath); - var loadedIndex = - CagraIndex.newBuilder(resources).from(inputStream, outDataset).build(); + var loadedIndex = CagraIndex.newBuilder(resources).from(inputStream, outDataset).build(); // The deserialized standard dataset is caller-owned but not searchable as-is. var loadedDataset = loadedIndex.makePaddedDataset(deviceVectors)) { assertTrue(outDataset.isPresent()); diff --git a/java/cuvs-java/src/test/java/com/nvidia/cuvs/FilterBitsetHandleIT.java b/java/cuvs-java/src/test/java/com/nvidia/cuvs/FilterBitsetHandleIT.java index 701758650c..2abb153207 100644 --- a/java/cuvs-java/src/test/java/com/nvidia/cuvs/FilterBitsetHandleIT.java +++ b/java/cuvs-java/src/test/java/com/nvidia/cuvs/FilterBitsetHandleIT.java @@ -47,6 +47,7 @@ public class FilterBitsetHandleIT extends CuVSTestCase { /** Device storage and views attached to the partition indexes, released by {@link #closeAll}. */ private final List partitionDeviceDatasets = new ArrayList<>(); + private final List partitionDatasetViews = new ArrayList<>(); @Before diff --git a/java/cuvs-java/src/test/java/com/nvidia/cuvs/MultiPartitionCagraSearchIT.java b/java/cuvs-java/src/test/java/com/nvidia/cuvs/MultiPartitionCagraSearchIT.java index 12e6df9630..62e13b733e 100644 --- a/java/cuvs-java/src/test/java/com/nvidia/cuvs/MultiPartitionCagraSearchIT.java +++ b/java/cuvs-java/src/test/java/com/nvidia/cuvs/MultiPartitionCagraSearchIT.java @@ -35,6 +35,7 @@ public class MultiPartitionCagraSearchIT extends CuVSTestCase { /** Device storage and views attached to the partition indexes, released by {@link #closeAll}. */ private final List partitionDeviceDatasets = new ArrayList<>(); + private final List partitionDatasetViews = new ArrayList<>(); @Before