From cc91b0a1be89019f99c29286098f9f73cd50b9ff Mon Sep 17 00:00:00 2001 From: Igor Motov Date: Thu, 23 Jul 2026 19:37:21 -1000 Subject: [PATCH 1/6] 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/6] 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/6] 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/6] 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/6] 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/6] 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; }