From d015309ceb35f1fb3492c1f90c0f2377652868dc Mon Sep 17 00:00:00 2001 From: Jen Hamon Date: Thu, 15 Jan 2026 11:56:21 -0500 Subject: [PATCH 1/3] Fix test cleanup --- .cursor/commands/create-improvement.md | 2 +- .env.example | 5 ++++ .github/workflows/cleanup-test-resources.yml | 6 +++-- .github/workflows/pr.yml | 2 +- .gitignore | 6 +++++ .../pinecone/helpers/IndexCleanupUtility.java | 24 +++++++++++++++---- 6 files changed, 36 insertions(+), 9 deletions(-) create mode 100644 .env.example diff --git a/.cursor/commands/create-improvement.md b/.cursor/commands/create-improvement.md index d89e327a..3411a64b 100644 --- a/.cursor/commands/create-improvement.md +++ b/.cursor/commands/create-improvement.md @@ -21,7 +21,7 @@ When the planned code changes are complete, the agent should take the following - Ensure changes are adequately tested 2. **Create Pull Request** - - Create a PR in draft mode + - Create a PR - Rename the PR with a title that follows the Conventional Commits 1.0.0 format - Update the PR description with: - A clear description of the problem and solution diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..27c2330b --- /dev/null +++ b/.env.example @@ -0,0 +1,5 @@ +# Pinecone API Configuration +# Copy this file to .env and fill in your actual API key +# The .env file is gitignored and will not be committed + +PINECONE_API_KEY=your-api-key-here diff --git a/.github/workflows/cleanup-test-resources.yml b/.github/workflows/cleanup-test-resources.yml index 6d405cb5..60df354b 100644 --- a/.github/workflows/cleanup-test-resources.yml +++ b/.github/workflows/cleanup-test-resources.yml @@ -14,7 +14,7 @@ on: age_threshold_days: description: 'Minimum age in days for resources to be deleted' required: false - default: '1' + default: 1 type: number dry_run: description: 'Preview deletions without executing (dry-run mode)' @@ -63,7 +63,9 @@ jobs: echo "Running cleanup with: $ARGS" # Run the cleanup utility - java -cp "build/libs/*:build/classes/java/main" \ + # Use only the shadow JAR (-all.jar) which contains all dependencies + # This avoids classpath conflicts from mixing regular JAR, shadow JAR, and other artifacts + java -cp "build/libs/*-all.jar" \ io.pinecone.helpers.IndexCleanupUtility $ARGS - name: Summary diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 9acfb84c..8113c1c4 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -108,6 +108,6 @@ jobs: continue-on-error: true run: | echo "Running IndexCleanupUtility to clean up test indexes..." - java -cp "build/libs/*" io.pinecone.helpers.IndexCleanupUtility + java -cp "build/libs/*-all.jar" io.pinecone.helpers.IndexCleanupUtility env: PINECONE_API_KEY: ${{ secrets.PINECONE_API_KEY }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 018ae61d..70872e65 100644 --- a/.gitignore +++ b/.gitignore @@ -81,4 +81,10 @@ nb-configuration.xml ############################## .DS_Store +############################## +## Environment Variables +############################## +.env +.env.local + gen diff --git a/src/main/java/io/pinecone/helpers/IndexCleanupUtility.java b/src/main/java/io/pinecone/helpers/IndexCleanupUtility.java index def32496..e9ca4dda 100644 --- a/src/main/java/io/pinecone/helpers/IndexCleanupUtility.java +++ b/src/main/java/io/pinecone/helpers/IndexCleanupUtility.java @@ -1,6 +1,7 @@ package io.pinecone.helpers; import io.pinecone.clients.Pinecone; +import okhttp3.OkHttpClient; import org.openapitools.db_control.client.model.CollectionList; import org.openapitools.db_control.client.model.CollectionModel; import org.openapitools.db_control.client.model.IndexList; @@ -8,6 +9,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.concurrent.TimeUnit; /** * Utility for cleaning up Pinecone indexes and collections. @@ -65,7 +67,17 @@ public static void main(String[] args) { System.exit(1); } - Pinecone pinecone = new Pinecone.Builder(apiKey).build(); + // Configure OkHttpClient with longer timeouts for delete operations + // Delete operations can take longer, especially for large indexes + OkHttpClient httpClient = new OkHttpClient.Builder() + .connectTimeout(30, TimeUnit.SECONDS) + .readTimeout(120, TimeUnit.SECONDS) + .writeTimeout(30, TimeUnit.SECONDS) + .build(); + + Pinecone pinecone = new Pinecone.Builder(apiKey) + .withOkHttpClient(httpClient) + .build(); IndexCleanupUtility utility = new IndexCleanupUtility( pinecone, parsedArgs.ageThresholdDays, @@ -243,8 +255,9 @@ private boolean cleanupIndex(IndexModel index) throws Exception { pinecone.deleteIndex(indexName); logInfo("Successfully initiated deletion of index: %s", indexName); - // Add small delay to avoid rate limiting - Thread.sleep(1000); + // Add delay to avoid overwhelming the backend + logInfo("Waiting 30 seconds before next deletion..."); + Thread.sleep(30000); return true; } @@ -279,8 +292,9 @@ private boolean cleanupCollection(CollectionModel collection) throws Exception { pinecone.deleteCollection(collectionName); logInfo("Successfully initiated deletion of collection: %s", collectionName); - // Add small delay to avoid rate limiting - Thread.sleep(1000); + // Add delay to avoid overwhelming the backend + logInfo("Waiting 30 seconds before next deletion..."); + Thread.sleep(30000); return true; } From b8099dd71fe8093dbaf9d8a0298202480740d847 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 15 Jan 2026 17:45:23 +0000 Subject: [PATCH 2/3] Fix classpath glob in cleanup workflows Co-authored-by: jhamon --- .github/workflows/cleanup-test-resources.yml | 2 +- .github/workflows/pr.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cleanup-test-resources.yml b/.github/workflows/cleanup-test-resources.yml index 60df354b..09b940eb 100644 --- a/.github/workflows/cleanup-test-resources.yml +++ b/.github/workflows/cleanup-test-resources.yml @@ -65,7 +65,7 @@ jobs: # Run the cleanup utility # Use only the shadow JAR (-all.jar) which contains all dependencies # This avoids classpath conflicts from mixing regular JAR, shadow JAR, and other artifacts - java -cp "build/libs/*-all.jar" \ + java -cp build/libs/*-all.jar \ io.pinecone.helpers.IndexCleanupUtility $ARGS - name: Summary diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 8113c1c4..6ef70a67 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -108,6 +108,6 @@ jobs: continue-on-error: true run: | echo "Running IndexCleanupUtility to clean up test indexes..." - java -cp "build/libs/*-all.jar" io.pinecone.helpers.IndexCleanupUtility + java -cp build/libs/*-all.jar io.pinecone.helpers.IndexCleanupUtility env: PINECONE_API_KEY: ${{ secrets.PINECONE_API_KEY }} \ No newline at end of file From 0ea5e9c8ff841b7c999063f5dfeef1a157797a75 Mon Sep 17 00:00:00 2001 From: Jen Hamon Date: Fri, 16 Jan 2026 14:22:09 -0500 Subject: [PATCH 3/3] Adjust failing tests --- .../helpers/TestResourcesManager.java | 11 +++++++++ .../CreateDescribeListAndDeleteIndexTest.java | 24 +++++++++++++++---- .../serverless/ReadCapacityAndSchemaTest.java | 2 +- .../dataPlane/UpsertAndSearchRecordsTest.java | 14 ++++++++++- 4 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/integration/java/io/pinecone/helpers/TestResourcesManager.java b/src/integration/java/io/pinecone/helpers/TestResourcesManager.java index 15ffe7c3..e5d8f029 100644 --- a/src/integration/java/io/pinecone/helpers/TestResourcesManager.java +++ b/src/integration/java/io/pinecone/helpers/TestResourcesManager.java @@ -5,6 +5,7 @@ import io.pinecone.clients.Pinecone; import io.pinecone.exceptions.PineconeException; import io.pinecone.proto.DescribeIndexStatsResponse; +import okhttp3.OkHttpClient; import org.openapitools.db_control.client.model.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -12,6 +13,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.concurrent.TimeUnit; import static io.pinecone.helpers.BuildUpsertRequest.buildRequiredUpsertRequestByDimension; import static io.pinecone.helpers.TestUtilities.*; @@ -74,9 +76,18 @@ public class TestResourcesManager { private TestResourcesManager() { + // Configure OkHttpClient with longer timeouts for index creation operations + // Index creation can take longer, especially for serverless indexes + OkHttpClient httpClient = new OkHttpClient.Builder() + .connectTimeout(30, TimeUnit.SECONDS) + .readTimeout(120, TimeUnit.SECONDS) + .writeTimeout(30, TimeUnit.SECONDS) + .build(); + pineconeClient = new Pinecone .Builder(apiKey) .withSourceTag("pinecone_test") + .withOkHttpClient(httpClient) .build(); } diff --git a/src/integration/java/io/pinecone/integration/controlPlane/pod/CreateDescribeListAndDeleteIndexTest.java b/src/integration/java/io/pinecone/integration/controlPlane/pod/CreateDescribeListAndDeleteIndexTest.java index 7b45d252..8b731d20 100644 --- a/src/integration/java/io/pinecone/integration/controlPlane/pod/CreateDescribeListAndDeleteIndexTest.java +++ b/src/integration/java/io/pinecone/integration/controlPlane/pod/CreateDescribeListAndDeleteIndexTest.java @@ -4,19 +4,35 @@ import io.pinecone.exceptions.PineconeBadRequestException; import io.pinecone.helpers.RandomStringBuilder; import io.pinecone.helpers.TestResourcesManager; +import okhttp3.OkHttpClient; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.openapitools.db_control.client.model.*; +import java.util.concurrent.TimeUnit; + import static org.junit.jupiter.api.Assertions.*; public class CreateDescribeListAndDeleteIndexTest { private static final TestResourcesManager indexManager = TestResourcesManager.getInstance(); - private static final Pinecone controlPlaneClient = new Pinecone - .Builder(System.getenv("PINECONE_API_KEY")) - .withSourceTag("pinecone_test") - .build(); + private static final Pinecone controlPlaneClient; + + static { + // Configure OkHttpClient with longer timeouts for index operations + // Index creation and deletion can take longer than default timeouts + OkHttpClient httpClient = new OkHttpClient.Builder() + .connectTimeout(30, TimeUnit.SECONDS) + .readTimeout(120, TimeUnit.SECONDS) + .writeTimeout(30, TimeUnit.SECONDS) + .build(); + + controlPlaneClient = new Pinecone + .Builder(System.getenv("PINECONE_API_KEY")) + .withSourceTag("pinecone_test") + .withOkHttpClient(httpClient) + .build(); + } private static String indexName; private static int indexDimension; private static String indexPodType; diff --git a/src/integration/java/io/pinecone/integration/controlPlane/serverless/ReadCapacityAndSchemaTest.java b/src/integration/java/io/pinecone/integration/controlPlane/serverless/ReadCapacityAndSchemaTest.java index 24e8c19a..16399b17 100644 --- a/src/integration/java/io/pinecone/integration/controlPlane/serverless/ReadCapacityAndSchemaTest.java +++ b/src/integration/java/io/pinecone/integration/controlPlane/serverless/ReadCapacityAndSchemaTest.java @@ -64,7 +64,7 @@ public void createServerlessIndexWithDedicatedReadCapacity() throws InterruptedE tags.put("read-capacity", "dedicated"); // Create index with Dedicated read capacity - ScalingConfigManual manual = new ScalingConfigManual().shards(2).replicas(2); + ScalingConfigManual manual = new ScalingConfigManual().shards(1).replicas(1); ReadCapacityDedicatedConfig dedicated = new ReadCapacityDedicatedConfig() .nodeType("t1") .scaling("Manual") diff --git a/src/integration/java/io/pinecone/integration/dataPlane/UpsertAndSearchRecordsTest.java b/src/integration/java/io/pinecone/integration/dataPlane/UpsertAndSearchRecordsTest.java index 2a82b20a..bcad0c11 100644 --- a/src/integration/java/io/pinecone/integration/dataPlane/UpsertAndSearchRecordsTest.java +++ b/src/integration/java/io/pinecone/integration/dataPlane/UpsertAndSearchRecordsTest.java @@ -3,6 +3,7 @@ import io.pinecone.clients.Index; import io.pinecone.clients.Pinecone; import io.pinecone.helpers.RandomStringBuilder; +import okhttp3.OkHttpClient; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openapitools.db_control.client.model.CreateIndexForModelRequestEmbed; @@ -12,11 +13,22 @@ import org.openapitools.db_data.client.model.SearchRecordsResponse; import java.util.*; +import java.util.concurrent.TimeUnit; public class UpsertAndSearchRecordsTest { @Test public void upsertAndSearchRecordsTest() throws ApiException, org.openapitools.db_control.client.ApiException, InterruptedException { - Pinecone pinecone = new Pinecone.Builder(System.getenv("PINECONE_API_KEY")).build(); + // Configure OkHttpClient with longer timeouts for index operations + // Index creation and deletion can take longer than default timeouts + OkHttpClient httpClient = new OkHttpClient.Builder() + .connectTimeout(30, TimeUnit.SECONDS) + .readTimeout(120, TimeUnit.SECONDS) + .writeTimeout(30, TimeUnit.SECONDS) + .build(); + + Pinecone pinecone = new Pinecone.Builder(System.getenv("PINECONE_API_KEY")) + .withOkHttpClient(httpClient) + .build(); String indexName = RandomStringBuilder.build("inf", 8); HashMap fieldMap = new HashMap<>(); fieldMap.put("text", "chunk_text");