Skip to content

Commit 6072a1d

Browse files
Bump version to 6.2.0, resolve integration test flakiness (#219)
## Problem We need to bump version packaging and constants for releasing v6.2.0. There's also a significant amount of integration test flakiness to address, and the suite was taking ~20 minutes to run. ## Solution **Version bump** Bump version to 6.2.0 in `gradle.properties` and `CHANGELOG.md`. **NOTE: All of the following changes are within the integration testing harness, so none of the client code is actually touched. I spent a bit of time working with claude to tighten up the testing harness itself. Test execution went from 20-24mins per run to 7-8mins, it looks like. Primarily, this was achieved through parallelizing the test classes since a lot of them are reusing the TestResourcesManagerSingle already. The singleton class also needed a lot of work to make it a bit more robust when being accessed by parallel testing threads. I summarized most of this with claude since it was done across numerous commits.** **Parallel test execution** Added `junit-platform.properties` enabling concurrent class-level execution at parallelism 4, with methods within each class remaining sequential. This alone brought the suite runtime from ~20 minutes to ~8 minutes. **AssertRetry — exception handling gap** The retry helper only caught `AssertionError`, `ExecutionException`, and `IOException`. Any other exception (most commonly `NullPointerException` when a namespace key is absent from the stats map during eventual consistency) escaped the retry loop immediately. Widened the catch and the `AssertionRunnable` interface to `Exception`. Also added explicit `InterruptedException` re-throw before the broad catch so that cancellation signals propagate correctly rather than being silently retried. **TestResourcesManager — thread safety** Enabling parallel class execution exposed multiple races in the shared singleton: - `getInstance()` was unsynchronized; two classes could both see `null` and construct duplicate instances. Fixed with `volatile` + `synchronized`. - `getOrCreatePodIndex()`, `getOrCreateServerlessIndex()`, and `getOrCreateCollection()` had check-then-act races where two threads could both pass the null guard and create duplicate indexes. All marked `synchronized`. - `getOrCreate*Connection()` methods now cache their results and are `synchronized`, ensuring parallel classes that both call `getOrCreateServerlessIndexConnection()` share the same `Index` object rather than creating duplicate channels. - `cleanupResources()` now closes all cached connections before deleting indexes. - Fixed a string identity comparison bug (`!= "ready"`) in the collection-readiness loop that caused it to always run to the full 120-second timeout. Fixed to `!"ready".equals(...)`. **Parallel tests closing shared connections early** `Index.close()` shuts down the underlying `PineconeConnection`, which is shared via a `static final ConcurrentHashMap` keyed by index name across all `Pinecone` instances. With parallel class execution, one class calling `close()` in `@AfterAll` could terminate the channel while another class was mid-request. Removed `close()` calls from `@AfterAll` in all test classes that obtained connections from `TestResourcesManager`. Connections are now closed exclusively in `TestResourcesManager.cleanupResources()` at the end of the run. **ResponseMetadata tests — static connection map race** The `ResponseMetadata*` tests create their own `Pinecone` client with a listener interceptor, but `getIndexConnection()` uses `computeIfAbsent` on the shared static map — whichever class first creates a connection for the shared index name wins. If another class won the race, the `ResponseMetadata*` tests got a listener-less connection and captured nothing. Fixed by constructing `PineconeConnection` directly (bypassing `computeIfAbsent`) using a host exposed via `TestResourcesManager.getOrCreateServerlessIndexHost()`. Each `ResponseMetadata*` test now owns its connection and closes it in its own `@AfterAll`. **UpsertDescribeIndexStatsAndDeletePodTest / ...ServerlessTest — shared mutable counter** A `static namespaceVectorCount` field was shared and mutated across all test methods. Each test now creates its own isolated namespace and tracks its own local count, with null-safe assertions for the case where a deleted namespace is removed from the stats map. **NamespacesTest — cross-test namespace count interference** Both sync and async tests asserted on exact total namespace counts against the same shared index. Each test now uses a unique random prefix and counts only its own namespaces via prefix-filtered `listNamespaces`, making assertions fully isolated. `Thread.sleep` replaced with `assertWithRetry`. Async upserts now properly await with `.get()`. **ListEndpointTest — concurrent write interference** Count assertions against the shared serverless index were vulnerable to concurrent writes from parallel classes inflating the results. All assertions now use prefix-filtered `list()` calls that only count vectors seeded by `TestResourcesManager` under known prefixes. **ReadCapacityAndSchemaTest — unnecessary waits + missing cleanup** Removed `waitUntilIndexIsReady` from tests 1–5 (assertions are on the create response, not index state). Added `@AfterAll` that deletes all indexes created by the class, with logged warnings on deletion failure rather than silent swallowing. **ConfigureIndexTest — parallel isolation** Added `@Isolated` since this test mutates a shared pod index's replica count and pod type, which cannot safely run concurrently with any other class. Also fixed a string identity comparison (`!= "ready"`) in the local readiness poll. **ConnectionsMapTest — size assertions replaced** `assertEquals(size, 1)` / `assertEquals(size, 2)` assumed the static map contained only this test's entries, which breaks under parallel execution when other classes have their own connections in the map. Replaced with key-presence checks (`assertFalse(containsKey(...))`) and object-identity checks (`assertSame`) to verify connection reuse without counting map entries. Also replaced bare `assert` keywords (silently skipped without `-ea`) with `assertFalse`/`assertSame`. Fixed a pre-existing typo where `config1.setHost(host2)` was overwriting the wrong config. **UpsertAndSearchRecordsTest — cleanup masking failures** `createIndexForModel` was called before the `try` block, so if it failed the `finally` clause would call `deleteIndex` on a non-existent index, replacing the original exception with a not-found error. Moved creation inside `try` with an `indexCreated` flag so `deleteIndex` only runs when there is actually an index to clean up. Also replaced hardcoded sleeps with `waitUntilIndexIsReady` and `assertWithRetry`.
1 parent e57171b commit 6072a1d

22 files changed

+473
-562
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
[comment]: <> (When bumping [pc:VERSION_LATEST_RELEASE] create a new entry below)
44
### Unreleased version
5+
### 6.2.0
6+
- Add readUnits, upsertedCount, and matchedRecords to ResponseMetadata
7+
- Add List operation to ResponseMetadataInterceptor
8+
59
### 6.1.0
610
- Add ResponseMetadataListener for dataplane operation observability
711

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
pineconeClientVersion = 6.1.0
1+
pineconeClientVersion = 6.2.0

src/integration/java/io/pinecone/clients/ConnectionsMapTest.java

Lines changed: 18 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
import static io.pinecone.helpers.TestUtilities.waitUntilIndexIsReady;
1616
import static org.junit.jupiter.api.Assertions.assertEquals;
17+
import static org.junit.jupiter.api.Assertions.assertFalse;
18+
import static org.junit.jupiter.api.Assertions.assertSame;
1719
import static org.junit.jupiter.api.Assertions.assertThrows;
1820

1921
public class ConnectionsMapTest {
@@ -78,59 +80,36 @@ public void testMultipleIndexesWithMultipleClients() throws InterruptedException
7880

7981
// Create config2 for getting index connection and set the host
8082
PineconeConfig config2 = new PineconeConfig(System.getenv("PINECONE_API_KEY"));
81-
config1.setHost(host2);
83+
config2.setHost(host2);
8284

8385

8486
// Establish grpc connection for index-1
8587
Index index1_1 = pinecone1.getIndexConnection(indexName1);
8688
// Get connections map
87-
ConcurrentHashMap<String, PineconeConnection> connectionsMap1_1 = pinecone1.getConnectionsMap();
89+
ConcurrentHashMap<String, PineconeConnection> connectionsMap = pinecone1.getConnectionsMap();
8890

89-
// Verify connectionsMap contains only one <indexName, connection> pair i.e. for index1 and its connection
90-
assertEquals(pinecone1.getConnectionsMap().size(), 1);
91-
// Verify the value for index1 by comparing its value with host1 in the connectionsMap
92-
assertEquals(host1, connectionsMap1_1.get(indexName1).toString());
91+
// Verify indexName1 is in the map with the correct host
92+
assertEquals(host1, connectionsMap.get(indexName1).toString());
9393

9494
// Establish grpc connection for index-2
9595
Index index1_2 = pinecone1.getIndexConnection(indexName2);
96-
// Get connections map after establishing second connection
97-
ConcurrentHashMap<String, PineconeConnection> connectionsMap1_2 = pinecone1.getConnectionsMap();
98-
99-
// Verify connectionsMap contains two <indexName, connection> pairs i.e. for index1 and index2
100-
assertEquals(connectionsMap1_2.size(), 2);
101-
// Verify the values by checking host for both indexName1 and indexName2
102-
assertEquals(host1, connectionsMap1_2.get(indexName1).toString());
103-
assertEquals(host2, connectionsMap1_2.get(indexName2).toString());
104-
105-
// Establishing connections with index1 and index2 using another pinecone client
106-
pinecone2.getConnection(indexName1, config1);
107-
ConcurrentHashMap<String, PineconeConnection> connectionsMap2_1 = pinecone1.getConnectionsMap();
108-
// Verify the new connections map is pointing to the same reference
109-
assert connectionsMap2_1 == connectionsMap1_2;
110-
// Verify the size of connections map is still 2 since the connection for index2 was not closed
111-
assertEquals(2, connectionsMap2_1.size());
112-
// Verify the connection value for index1 is host1
113-
assertEquals(host1, connectionsMap2_1.get(indexName1).toString());
114-
115-
pinecone2.getConnection(indexName2, config2);
116-
ConcurrentHashMap<String, PineconeConnection> connectionsMap2_2 = pinecone1.getConnectionsMap();
117-
// Verify the new connections map is pointing to the same reference
118-
assert connectionsMap2_1 == connectionsMap2_2;
119-
// Verify the size of connections map is still 2 since the connections are not closed
120-
assertEquals(2, connectionsMap2_2.size());
121-
// Verify the values by checking host for both indexName1 and indexName2
122-
assertEquals(host1, connectionsMap2_2.get(indexName1).toString());
123-
assertEquals(host2, connectionsMap2_2.get(indexName2).toString());
96+
97+
// Verify both indexes are now in the map with the correct hosts
98+
assertEquals(host1, connectionsMap.get(indexName1).toString());
99+
assertEquals(host2, connectionsMap.get(indexName2).toString());
100+
101+
// Connecting a second client to the same indexes should reuse the existing map entries
102+
assertSame(connectionsMap, pinecone2.getConnectionsMap());
103+
assertSame(connectionsMap.get(indexName1), pinecone2.getConnection(indexName1, config1));
104+
assertSame(connectionsMap.get(indexName2), pinecone2.getConnection(indexName2, config2));
124105

125106
// Close the connections
126107
index1_1.close();
127108
index1_2.close();
128109

129-
// Verify the map size is now 0
130-
assertEquals(connectionsMap1_1.size(), 0);
131-
assertEquals(connectionsMap1_2.size(), 0);
132-
assertEquals(connectionsMap2_1.size(), 0);
133-
assertEquals(connectionsMap2_2.size(), 0);
110+
// Verify the specific entries for this test's indexes were removed
111+
assertFalse(connectionsMap.containsKey(indexName1));
112+
assertFalse(connectionsMap.containsKey(indexName2));
134113

135114
// Delete the indexes
136115
pinecone1.deleteIndex(indexName1);

src/integration/java/io/pinecone/helpers/AssertRetry.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,15 @@
22

33
import io.pinecone.exceptions.PineconeException;
44

5-
import java.io.IOException;
6-
import java.util.concurrent.ExecutionException;
7-
85
public class AssertRetry {
96
private static final int maxRetry = 4;
107
private static final int delay = 1500;
118

12-
public static void assertWithRetry(AssertionRunnable assertionRunnable) throws InterruptedException, PineconeException {
9+
public static void assertWithRetry(AssertionRunnable assertionRunnable) throws Exception {
1310
assertWithRetry(assertionRunnable, 2);
1411
}
1512

16-
public static void assertWithRetry(AssertionRunnable assertionRunnable, int backOff) throws AssertionError, InterruptedException {
13+
public static void assertWithRetry(AssertionRunnable assertionRunnable, int backOff) throws Exception {
1714
int retryCount = 0;
1815
int delayCount = delay;
1916
boolean success = false;
@@ -23,7 +20,10 @@ public static void assertWithRetry(AssertionRunnable assertionRunnable, int back
2320
try {
2421
assertionRunnable.run();
2522
success = true;
26-
} catch (AssertionError | ExecutionException | IOException e) {
23+
} catch (InterruptedException e) {
24+
Thread.currentThread().interrupt();
25+
throw e;
26+
} catch (AssertionError | Exception e) {
2727
errorMessage = e.getLocalizedMessage();
2828
retryCount++;
2929
delayCount*=backOff;
@@ -38,6 +38,6 @@ public static void assertWithRetry(AssertionRunnable assertionRunnable, int back
3838

3939
@FunctionalInterface
4040
public interface AssertionRunnable {
41-
void run() throws AssertionError, ExecutionException, InterruptedException, IOException, PineconeException;
41+
void run() throws Exception;
4242
}
4343
}

src/integration/java/io/pinecone/helpers/TestResourcesManager.java

Lines changed: 58 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
*/
4343
public class TestResourcesManager {
4444
private static final Logger logger = LoggerFactory.getLogger(TestUtilities.class);
45-
private static TestResourcesManager instance;
45+
private static volatile TestResourcesManager instance;
4646
private static final String apiKey = System.getenv("PINECONE_API_KEY");
4747
private final int dimension = System.getenv("DIMENSION") == null
4848
? 4
@@ -66,6 +66,10 @@ public class TestResourcesManager {
6666
private String serverlessIndexName;
6767
private String collectionName;
6868
private CollectionModel collectionModel;
69+
private Index serverlessIndexConnection;
70+
private AsyncIndex serverlessAsyncIndexConnection;
71+
private Index podIndexConnection;
72+
private AsyncIndex podAsyncIndexConnection;
6973
private final List<String> vectorIdsForDefaultNamespace = Arrays.asList("def-id1", "def-id2", "def-prefix-id3", "def-prefix-id4");
7074
private final List<String> vectorIdsForCustomNamespace = Arrays.asList("cus-id1", "cus-id2", "cus-prefix-id3", "cus" +
7175
"-prefix-id4");
@@ -85,7 +89,7 @@ private TestResourcesManager() {
8589
*
8690
* @return the {@link TestResourcesManager} instance.
8791
*/
88-
public static TestResourcesManager getInstance() {
92+
public static synchronized TestResourcesManager getInstance() {
8993
if (instance == null) {
9094
instance = new TestResourcesManager();
9195
}
@@ -185,8 +189,22 @@ public List<String> getVectorIdsFromCustomNamespace() {
185189
*
186190
* @return a {@link Index} connection to the serverless index.
187191
*/
188-
public Index getOrCreateServerlessIndexConnection() throws InterruptedException {
189-
return getInstance().pineconeClient.getIndexConnection(getOrCreateServerlessIndex());
192+
/**
193+
* Gets the host for the shared serverless index. Creates the index first if it doesn't exist.
194+
* Used by tests that need to construct their own PineconeConnection (e.g. to attach a custom listener)
195+
* without going through the shared static connection cache.
196+
*
197+
* @return the host URL of the shared serverless index.
198+
*/
199+
public synchronized String getOrCreateServerlessIndexHost() throws InterruptedException {
200+
return pineconeClient.describeIndex(getOrCreateServerlessIndex()).getHost();
201+
}
202+
203+
public synchronized Index getOrCreateServerlessIndexConnection() throws InterruptedException {
204+
if (serverlessIndexConnection == null) {
205+
serverlessIndexConnection = pineconeClient.getIndexConnection(getOrCreateServerlessIndex());
206+
}
207+
return serverlessIndexConnection;
190208
}
191209

192210
/**
@@ -195,8 +213,11 @@ public Index getOrCreateServerlessIndexConnection() throws InterruptedException
195213
*
196214
* @return a {@link AsyncIndex} connection to the serverless index.
197215
*/
198-
public AsyncIndex getOrCreateServerlessAsyncIndexConnection() throws InterruptedException {
199-
return getInstance().pineconeClient.getAsyncIndexConnection(getOrCreateServerlessIndex());
216+
public synchronized AsyncIndex getOrCreateServerlessAsyncIndexConnection() throws InterruptedException {
217+
if (serverlessAsyncIndexConnection == null) {
218+
serverlessAsyncIndexConnection = pineconeClient.getAsyncIndexConnection(getOrCreateServerlessIndex());
219+
}
220+
return serverlessAsyncIndexConnection;
200221
}
201222

202223
/**
@@ -205,8 +226,11 @@ public AsyncIndex getOrCreateServerlessAsyncIndexConnection() throws Interrupted
205226
*
206227
* @return a {@link Index} connection to the pod index.
207228
*/
208-
public Index getOrCreatePodIndexConnection() throws InterruptedException {
209-
return getInstance().pineconeClient.getIndexConnection(getOrCreatePodIndex());
229+
public synchronized Index getOrCreatePodIndexConnection() throws InterruptedException {
230+
if (podIndexConnection == null) {
231+
podIndexConnection = pineconeClient.getIndexConnection(getOrCreatePodIndex());
232+
}
233+
return podIndexConnection;
210234
}
211235

212236
/**
@@ -215,8 +239,11 @@ public Index getOrCreatePodIndexConnection() throws InterruptedException {
215239
*
216240
* @return a {@link AsyncIndex} connection to the pod index.
217241
*/
218-
public AsyncIndex getOrCreatePodAsyncIndexConnection() throws InterruptedException {
219-
return getInstance().pineconeClient.getAsyncIndexConnection(getOrCreatePodIndex());
242+
public synchronized AsyncIndex getOrCreatePodAsyncIndexConnection() throws InterruptedException {
243+
if (podAsyncIndexConnection == null) {
244+
podAsyncIndexConnection = pineconeClient.getAsyncIndexConnection(getOrCreatePodIndex());
245+
}
246+
return podAsyncIndexConnection;
220247
}
221248

222249
/**
@@ -225,7 +252,7 @@ public AsyncIndex getOrCreatePodAsyncIndexConnection() throws InterruptedExcepti
225252
*
226253
* @return the {@link IndexModel} of the pod index.
227254
*/
228-
public IndexModel getOrCreatePodIndexModel() throws InterruptedException {
255+
public synchronized IndexModel getOrCreatePodIndexModel() throws InterruptedException {
229256
podIndexModel = pineconeClient.describeIndex(getOrCreatePodIndex());
230257
return podIndexModel;
231258
}
@@ -236,7 +263,7 @@ public IndexModel getOrCreatePodIndexModel() throws InterruptedException {
236263
*
237264
* @return the {@link IndexModel} of the serverless index.
238265
*/
239-
public IndexModel getOrCreateServerlessIndexModel() throws InterruptedException {
266+
public synchronized IndexModel getOrCreateServerlessIndexModel() throws InterruptedException {
240267
serverlessIndexModel = pineconeClient.describeIndex(getOrCreateServerlessIndex());
241268
return serverlessIndexModel;
242269
}
@@ -247,7 +274,7 @@ public IndexModel getOrCreateServerlessIndexModel() throws InterruptedException
247274
*
248275
* @return the {@link CollectionModel} of the serverless index.
249276
*/
250-
public CollectionModel getOrCreateCollectionModel() throws InterruptedException {
277+
public synchronized CollectionModel getOrCreateCollectionModel() throws InterruptedException {
251278
collectionModel = pineconeClient.describeCollection(getOrCreateCollection());
252279
return collectionModel;
253280
}
@@ -257,6 +284,19 @@ public CollectionModel getOrCreateCollectionModel() throws InterruptedException
257284
* after all tests have finished running.
258285
*/
259286
public void cleanupResources() {
287+
if (serverlessIndexConnection != null) {
288+
serverlessIndexConnection.close();
289+
}
290+
if (serverlessAsyncIndexConnection != null) {
291+
serverlessAsyncIndexConnection.close();
292+
}
293+
if (podIndexConnection != null) {
294+
podIndexConnection.close();
295+
}
296+
if (podAsyncIndexConnection != null) {
297+
podAsyncIndexConnection.close();
298+
}
299+
260300
if (podIndexName != null) {
261301
pineconeClient.deleteIndex(podIndexName);
262302
}
@@ -280,7 +320,7 @@ public void cleanupResources() {
280320
* @throws InterruptedException if the thread is interrupted while waiting for the index to be ready.
281321
* @throws PineconeException if the API encounters an error during index creation or if any of the arguments are invalid.
282322
*/
283-
public String getOrCreatePodIndex() throws InterruptedException, PineconeException {
323+
public synchronized String getOrCreatePodIndex() throws InterruptedException, PineconeException {
284324
if (podIndexName != null) {
285325
return podIndexName;
286326
}
@@ -311,7 +351,7 @@ public String getOrCreatePodIndex() throws InterruptedException, PineconeExcepti
311351
* @throws InterruptedException if the thread is interrupted while waiting for the index to be ready.
312352
* @throws PineconeException if the API encounters an error during index creation or if any of the arguments are invalid.
313353
*/
314-
public String getOrCreateServerlessIndex() throws InterruptedException, PineconeException {
354+
public synchronized String getOrCreateServerlessIndex() throws InterruptedException, PineconeException {
315355
if (this.serverlessIndexName != null) {
316356
return this.serverlessIndexName;
317357
}
@@ -344,7 +384,7 @@ public String getOrCreateServerlessIndex() throws InterruptedException, Pinecone
344384
* @throws InterruptedException if the thread is interrupted while waiting for the collection to be ready.
345385
* @throws PineconeException if the API encounters an error during collection creation.
346386
*/
347-
public String getOrCreateCollection() throws InterruptedException, PineconeException {
387+
public synchronized String getOrCreateCollection() throws InterruptedException, PineconeException {
348388
if (collectionName != null) {
349389
return collectionName;
350390
}
@@ -359,13 +399,13 @@ public String getOrCreateCollection() throws InterruptedException, PineconeExcep
359399
// Wait until collection is ready
360400
int timeWaited = 0;
361401
String collectionReady = collectionModel.getStatus().toLowerCase();
362-
while (collectionReady != "ready" && timeWaited < 120000) {
402+
while (!"ready".equals(collectionReady) && timeWaited < 120000) {
363403
logger.info("Waiting for collection " + collectionName + " to be ready. Waited " + timeWaited + " " +
364404
"milliseconds...");
365405
Thread.sleep(5000);
366406
timeWaited += 5000;
367407
collectionModel = pineconeClient.describeCollection(collectionName);
368-
collectionReady = collectionModel.getStatus();
408+
collectionReady = collectionModel.getStatus().toLowerCase();
369409
}
370410

371411
if (timeWaited > 120000) {

src/integration/java/io/pinecone/integration/controlPlane/pod/CollectionTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,23 @@ public class CollectionTest {
4141
private static String namespace;
4242

4343
@BeforeAll
44-
public static void setUp() throws InterruptedException {
44+
public static void setUp() throws Exception {
4545
indexName = indexManager.getOrCreatePodIndex();
4646
collectionName = indexManager.getOrCreateCollection();
4747
collection = indexManager.getOrCreateCollectionModel();
4848
namespace = indexManager.getDefaultNamespace();
4949
}
5050

5151
@AfterAll
52-
public static void cleanUp() throws InterruptedException {
52+
public static void cleanUp() throws Exception {
5353
// Clean up indexes
5454
for (String index : indexesToCleanUp) {
5555
pineconeClient.deleteIndex(index);
5656
}
5757
}
5858

5959
@Test
60-
public void testIndexFromCollectionHappyPath() throws InterruptedException {
60+
public void testIndexFromCollectionHappyPath() throws Exception {
6161
// Verify collection is listed
6262
List<CollectionModel> collectionList = pineconeClient.listCollections().getCollections();
6363
boolean collectionFound = false;
@@ -115,7 +115,7 @@ public void testIndexFromCollectionHappyPath() throws InterruptedException {
115115
}
116116

117117
@Test
118-
public void testCreateIndexFromCollectionWithDiffMetric() throws InterruptedException {
118+
public void testCreateIndexFromCollectionWithDiffMetric() throws Exception {
119119
// Use a different metric than the source index
120120
String[] metrics = {
121121
"cosine",
@@ -232,7 +232,7 @@ public void testCreateIndexWithMismatchedDimension() {
232232
}
233233

234234
@Test
235-
public void testCreateCollectionFromNotReadyIndex() throws InterruptedException {
235+
public void testCreateCollectionFromNotReadyIndex() throws Exception {
236236
String notReadyIndexName = RandomStringBuilder.build("from-coll", 8);
237237
String newCollectionName = RandomStringBuilder.build("coll-", 8);
238238
try {

0 commit comments

Comments
 (0)