Skip to content

Commit 9ab63b3

Browse files
authored
Merge pull request #537 from weaviate/feat/ssb
Server-side batching (SSB)
2 parents 2e0c086 + 1bf5e50 commit 9ab63b3

62 files changed

Lines changed: 4405 additions & 1581 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/test.yaml

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,32 @@ env:
1515
DOCKER_IMAGES_TAR: docker-images.tar
1616

1717
jobs:
18+
maven-cache:
19+
name: Cache Maven dependencies
20+
runs-on: ubuntu-latest
21+
steps:
22+
- uses: actions/checkout@v4
23+
- uses: actions/setup-java@v4
24+
with:
25+
distribution: "zulu"
26+
java-version: "17"
27+
cache: "maven"
28+
- run: mvn dependency:go-offline
29+
30+
unit:
31+
name: Unit tests
32+
runs-on: ubuntu-latest
33+
steps:
34+
- uses: actions/checkout@v4
35+
- uses: actions/setup-java@v4
36+
with:
37+
distribution: "zulu"
38+
java-version: "17"
39+
cache: "maven"
40+
- run: mvn test -Dtest='!*ITest'
41+
1842
docker-cache:
43+
needs: unit
1944
name: Cache shared Docker images
2045
runs-on: ubuntu-latest
2146
steps:
@@ -59,22 +84,10 @@ jobs:
5984
path: ${{ env.DOCKER_IMAGES_TAR }}
6085
key: ${{ env.DOCKER_CACHE_KEY }}
6186

62-
maven-cache:
63-
name: Cache Maven dependencies
64-
runs-on: ubuntu-latest
65-
steps:
66-
- uses: actions/checkout@v4
67-
- uses: actions/setup-java@v4
68-
with:
69-
distribution: "zulu"
70-
java-version: "17"
71-
cache: "maven"
72-
- run: mvn dependency:go-offline
73-
74-
test:
75-
name: Test
87+
integration:
88+
name: Integration Tests
7689
runs-on: ubuntu-latest
77-
needs: [docker-cache, maven-cache]
90+
needs: [maven-cache, unit, docker-cache]
7891
strategy:
7992
fail-fast: false
8093
matrix:
@@ -118,4 +131,4 @@ jobs:
118131
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
119132
OPENAI_APIKEY: ${{ secrets.OPENAI_APIKEY }}
120133
WEAVIATE_VERSION: ${{ matrix.WEAVIATE_VERSION }}
121-
run: mvn verify -Dgpg.skip
134+
run: mvn verify -Dtest='*ITest' -Dgpg.skip

pom.xml

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,8 @@
170170
</dependency>
171171
<dependency>
172172
<groupId>org.slf4j</groupId>
173-
<artifactId>slf4j-nop</artifactId>
173+
<artifactId>slf4j-api</artifactId>
174174
<version>${slf4j.version}</version>
175-
<scope>test</scope>
176175
</dependency>
177176
<dependency>
178177
<groupId>org.mock-server</groupId>
@@ -237,13 +236,11 @@
237236
<artifactId>maven-surefire-plugin</artifactId>
238237
<version>3.5.4</version>
239238
<configuration>
240-
<trimStackTrace>false</trimStackTrace>
241-
<parallel>classes</parallel>
242-
<forkCount>4</forkCount>
243-
<reuseForks>true</reuseForks>
244-
<threadCount>1</threadCount>
245-
<perCoreThreadCount>true</perCoreThreadCount>
246-
<runOrder>balanced</runOrder>
239+
<systemPropertyVariables>
240+
<java.util.logging.config.file>
241+
${project.basedir}/src/test/resources/logging.properties
242+
</java.util.logging.config.file>
243+
</systemPropertyVariables>
247244
</configuration>
248245
</plugin>
249246
<plugin>
@@ -546,5 +543,5 @@
546543
<artifactId>central-publishing-maven-plugin</artifactId>
547544
</plugin>
548545
</plugins>
549-
</build>
546+
</build>
550547
</project>

src/it/java/io/weaviate/containers/Container.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public class Container {
1919
public static final MinIo MINIO = MinIo.createDefault();
2020

2121
public static ContainerGroup compose(Weaviate weaviate, GenericContainer<?>... containers) {
22+
assert weaviate != WEAVIATE : "cannot compose with static WEAVIATE contaier";
2223
return new ContainerGroup(weaviate, containers);
2324
}
2425

@@ -50,7 +51,9 @@ public void start() {
5051
@Override
5152
public void stop() {
5253
weaviate.stop();
53-
containers.forEach(GenericContainer::stop);
54+
containers.stream()
55+
.dropWhile(c -> c == MODEL2VEC || c == IMG2VEC_NEURAL || c == MINIO)
56+
.forEach(GenericContainer::stop);
5457
}
5558

5659
private void setSharedNetwork() {

src/it/java/io/weaviate/containers/Weaviate.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@ public class Weaviate extends WeaviateContainer {
2828
public static final String DOCKER_IMAGE = "semitechnologies/weaviate";
2929
public static final String LATEST_VERSION = Version.latest().semver.toString();
3030
public static final String VERSION;
31+
private static final boolean DEBUG;
3132

3233
static {
3334
VERSION = System.getenv().getOrDefault("WEAVIATE_VERSION", LATEST_VERSION);
35+
DEBUG = System.getenv("DEBUG") != null;
3436
}
3537
public static String OIDC_ISSUER = "https://auth.wcs.api.weaviate.io/auth/realms/SeMI";
3638

@@ -93,6 +95,9 @@ public String getContainerName() {
9395
public WeaviateClient getClient() {
9496
if (!isRunning()) {
9597
start();
98+
if (DEBUG) {
99+
followOutput(frame -> System.out.println(frame.getUtf8String()));
100+
}
96101
}
97102
if (clientInstance != null) {
98103
return clientInstance;

src/it/java/io/weaviate/integration/BackupITest.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,16 @@
77
import java.util.concurrent.CompletableFuture;
88
import java.util.concurrent.CompletionException;
99
import java.util.concurrent.ExecutionException;
10+
import java.util.concurrent.ExecutorService;
11+
import java.util.concurrent.Executors;
1012
import java.util.concurrent.TimeoutException;
1113
import java.util.stream.IntStream;
1214

1315
import org.assertj.core.api.Assertions;
1416
import org.assertj.core.api.InstanceOfAssertFactories;
17+
import org.junit.AfterClass;
1518
import org.junit.Test;
1619

17-
import com.sun.nio.sctp.IllegalUnbindException;
18-
1920
import io.weaviate.ConcurrentTest;
2021
import io.weaviate.client6.v1.api.WeaviateClient;
2122
import io.weaviate.client6.v1.api.backup.Backup;
@@ -25,10 +26,16 @@
2526
import io.weaviate.containers.Weaviate;
2627

2728
public class BackupITest extends ConcurrentTest {
29+
private static final ExecutorService EXEC = Executors.newSingleThreadExecutor();
2830
private static final WeaviateClient client = Weaviate.custom()
2931
.withFilesystemBackup("/tmp/backups").build()
3032
.getClient();
3133

34+
@AfterClass
35+
public static void tearDown() {
36+
EXEC.shutdownNow();
37+
}
38+
3239
@Test
3340
public void test_lifecycle() throws IOException, TimeoutException {
3441
Weaviate.Version.V132.orSkip(); // List backups not implemented in earlier versions
@@ -258,6 +265,6 @@ private CompletableFuture<Void> spamData(String collectionName) {
258265
throw new CompletionException(e);
259266
}
260267
return null;
261-
});
268+
}, EXEC);
262269
}
263270
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package io.weaviate.integration;
2+
3+
import java.io.IOException;
4+
5+
import org.assertj.core.api.Assertions;
6+
import org.junit.BeforeClass;
7+
import org.junit.Test;
8+
9+
import io.weaviate.ConcurrentTest;
10+
import io.weaviate.client6.v1.api.WeaviateClient;
11+
import io.weaviate.client6.v1.api.collections.WeaviateObject;
12+
import io.weaviate.client6.v1.api.collections.batch.BatchContext;
13+
import io.weaviate.containers.Container;
14+
import io.weaviate.containers.Weaviate;
15+
16+
public class BatchITest extends ConcurrentTest {
17+
private static final WeaviateClient client = Container.WEAVIATE.getClient();
18+
19+
@BeforeClass
20+
public static void __() {
21+
Weaviate.Version.V136.orSkip();
22+
}
23+
24+
@Test
25+
public void test10_000Objects() throws IOException {
26+
var nsThings = ns("Things");
27+
28+
var things = client.collections.create(nsThings);
29+
30+
// Act
31+
try (BatchContext<?> batch = things.batch.start()) {
32+
for (int i = 0; i < 10_000; i++) {
33+
batch.add(WeaviateObject.of());
34+
}
35+
} catch (InterruptedException e) {
36+
}
37+
38+
// Assert
39+
Assertions.assertThat(things.size()).isEqualTo(10_000);
40+
}
41+
}

src/it/java/io/weaviate/integration/ClusterITest.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.io.IOException;
44

55
import org.assertj.core.api.Assertions;
6+
import org.junit.AfterClass;
67
import org.junit.Test;
78

89
import io.weaviate.ConcurrentTest;
@@ -17,7 +18,13 @@
1718
import io.weaviate.containers.Weaviate.Version;
1819

1920
public class ClusterITest extends ConcurrentTest {
20-
private static final WeaviateClient client = Weaviate.cluster(3).getClient();
21+
private static final Weaviate cluster = Weaviate.cluster(3);
22+
private static final WeaviateClient client = cluster.getClient();
23+
24+
@AfterClass
25+
public static void tearDown() {
26+
cluster.stop();
27+
}
2128

2229
@Test
2330
public void test_shardingState() throws IOException {

src/it/java/io/weaviate/integration/CollectionsITest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,8 +370,8 @@ public void test_dropPropertyIndex() throws IOException {
370370
.returns(false, Property::indexFilterable)
371371
.returns(false, Property::indexSearchable)
372372
.returns(false, Property::indexRangeFilters));
373-
}
374-
373+
}
374+
375375
@Test
376376
public void test_asyncReplicationConfig() throws IOException {
377377
Weaviate.Version.latest().orSkip();

src/it/java/io/weaviate/integration/DataITest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,7 @@ public void testDataTypes() throws IOException {
486486
.asInstanceOf(InstanceOfAssertFactories.map(String.class, Object.class))
487487
// Most of PhoneNumber fields are only present on read and are null on write.
488488
.usingRecursiveComparison()
489-
.withComparatorForType(ORMITest::comparePhoneNumbers, PhoneNumber.class)
489+
.withComparatorForType(OrmITest::comparePhoneNumbers, PhoneNumber.class)
490490
.isEqualTo(want);
491491
}
492492

src/it/java/io/weaviate/integration/OIDCSupportITest.java renamed to src/it/java/io/weaviate/integration/OidcSupportITest.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import org.assertj.core.api.Assertions;
1111
import org.junit.Assume;
12+
import org.junit.Ignore;
1213
import org.junit.Test;
1314

1415
import io.weaviate.ConcurrentTest;
@@ -28,7 +29,7 @@
2829
* Additionally, {@code WCS_DUMMY_CI_PW} and {@code OKTA_CLIENT_SECRET}
2930
* environment variables must be set.
3031
*/
31-
public class OIDCSupportITest extends ConcurrentTest {
32+
public class OidcSupportITest extends ConcurrentTest {
3233
private static final String WCS_DUMMY_CI_USERNAME = "oidc-test-user@weaviate.io";
3334
private static final String WCS_DUMMY_CI_PW = System.getenv("WCS_DUMMY_CI_PW");
3435

@@ -66,10 +67,7 @@ public void test_bearerToken() throws Exception {
6667
var auth = SpyTokenProvider.spyOn(Authentication.bearerToken(t.accessToken(), t.refreshToken(), 0));
6768
pingWeaviate(wcsContainer, auth);
6869

69-
var newT = auth.getToken();
70-
Assertions.assertThat(newT.accessToken())
71-
.as("expect access_token was refreshed")
72-
.isNotEqualTo(t.accessToken());
70+
eventually(() -> auth.getToken() != t, 100, 5, "expect access_token was refreshed");
7371

7472
// Check that the new token authenticates requests.
7573
pingWeaviate(wcsContainer, auth);
@@ -81,7 +79,7 @@ public void test_resourceOwnerPassword() throws Exception {
8179
Assume.assumeTrue("WCS_DUMMY_CI_PW is not set", WCS_DUMMY_CI_PW != null && !WCS_DUMMY_CI_PW.isBlank());
8280
Assume.assumeTrue("no internet connection", hasInternetConnection());
8381

84-
// Check norwal resource owner password flow works.
82+
// Check normal resource owner password flow works.
8583
var password = Authentication.resourceOwnerPassword(WCS_DUMMY_CI_USERNAME, WCS_DUMMY_CI_PW, List.of());
8684
var auth = SpyTokenProvider.spyOn(password);
8785
pingWeaviate(wcsContainer, auth);

0 commit comments

Comments
 (0)