diff --git a/fdb-extensions/src/test/java/com/apple/foundationdb/async/RangeSetTest.java b/fdb-extensions/src/test/java/com/apple/foundationdb/async/RangeSetTest.java index b830405c33..732f8861ee 100644 --- a/fdb-extensions/src/test/java/com/apple/foundationdb/async/RangeSetTest.java +++ b/fdb-extensions/src/test/java/com/apple/foundationdb/async/RangeSetTest.java @@ -65,7 +65,7 @@ public class RangeSetTest { @RegisterExtension static final TestDatabaseExtension dbExtension = new TestDatabaseExtension(); @RegisterExtension - TestSubspaceExtension rsSubspaceExtension = new TestSubspaceExtension(dbExtension); + final TestSubspaceExtension rsSubspaceExtension = new TestSubspaceExtension(dbExtension); private Database db; private Subspace rsSubspace; private RangeSet rs; diff --git a/fdb-extensions/src/test/java/com/apple/test/LimitConcurrencyExtension.java b/fdb-extensions/src/test/java/com/apple/test/LimitConcurrencyExtension.java new file mode 100644 index 0000000000..794bd568f8 --- /dev/null +++ b/fdb-extensions/src/test/java/com/apple/test/LimitConcurrencyExtension.java @@ -0,0 +1,48 @@ +/* + * LimitConcurrencyExtension.java + * + * This source file is part of the FoundationDB open source project + * + * Copyright 2015-2024 Apple Inc. and the FoundationDB project authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.apple.test; + +import com.google.auto.service.AutoService; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.Extension; +import org.junit.jupiter.api.extension.ExtensionContext; + +import javax.annotation.Nonnull; +import java.util.concurrent.Semaphore; + +@AutoService(Extension.class) +@Order(0) +public class LimitConcurrencyExtension implements BeforeEachCallback, AfterEachCallback { + @Nonnull + static Semaphore testConcurrency = new Semaphore(Integer.parseInt(System.getProperty("com.apple.foundationdb.test.concurrencyLimit", "50"))); + + @Override + public void beforeEach(final ExtensionContext context) throws InterruptedException { + testConcurrency.acquire(); + } + + @Override + public void afterEach(final ExtensionContext context) { + testConcurrency.release(); + } +} diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/cursors/ConcatCursorTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/cursors/ConcatCursorTest.java index 3938c0ea33..12184f87a3 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/cursors/ConcatCursorTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/cursors/ConcatCursorTest.java @@ -40,6 +40,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -60,8 +61,10 @@ public class ConcatCursorTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); FDBDatabase fdb; FDBRecordContext context; diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/common/MappedPoolTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/common/MappedPoolTest.java index 3bc7532e98..a05baacfc4 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/common/MappedPoolTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/common/MappedPoolTest.java @@ -21,6 +21,8 @@ package com.apple.foundationdb.record.provider.common; import org.junit.jupiter.api.Test; + +import javax.annotation.Nonnull; import javax.crypto.Cipher; import java.security.GeneralSecurityException; @@ -40,37 +42,43 @@ public class MappedPoolTest { public static String CIPHER = "DES/ECB/PKCS5Padding"; - public static MappedPool MAPPED_POOL = new MappedPool<>(Cipher::getInstance); + + @Nonnull + private MappedPool getPool() { + return new MappedPool<>(Cipher::getInstance); + } @Test public void testCipherPool() throws Exception { + final var mappedPool = getPool(); Cipher lastCipher = null; for (int i = 0; i < 100; i++) { - Cipher cipher = MAPPED_POOL.poll(CIPHER); + Cipher cipher = mappedPool.poll(CIPHER); if (lastCipher != null) { assertSame(cipher, lastCipher); lastCipher = cipher; } assertNotNull(cipher); - assertTrue(MAPPED_POOL.offer(CIPHER, cipher)); + assertTrue(mappedPool.offer(CIPHER, cipher)); } - assertEquals(1, MAPPED_POOL.getPoolSize(CIPHER)); - assertThat(MAPPED_POOL.getKeys(), hasItem(CIPHER)); + assertEquals(1, mappedPool.getPoolSize(CIPHER)); + assertThat(mappedPool.getKeys(), hasItem(CIPHER)); } @Test public void testMaxPoolSize() throws Exception { + final var mappedPool = getPool(); Cipher[] ciphers = new Cipher[1000]; for (int i = 0; i < 1000; i++) { - ciphers[i] = MAPPED_POOL.poll(CIPHER); + ciphers[i] = mappedPool.poll(CIPHER); } for (int i = 0; i < MappedPool.DEFAULT_POOL_SIZE; i++) { - assertTrue(MAPPED_POOL.offer(CIPHER, ciphers[i])); + assertTrue(mappedPool.offer(CIPHER, ciphers[i])); } for (int i = MappedPool.DEFAULT_POOL_SIZE; i < 1000; i++) { - assertFalse(MAPPED_POOL.offer(CIPHER, ciphers[i])); + assertFalse(mappedPool.offer(CIPHER, ciphers[i])); } - assertEquals(64, MAPPED_POOL.getPoolSize(CIPHER)); + assertEquals(64, mappedPool.getPoolSize(CIPHER)); } } diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/BlockingInAsyncDetectionTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/BlockingInAsyncDetectionTest.java index deb86e7aa3..c2d74606fa 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/BlockingInAsyncDetectionTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/BlockingInAsyncDetectionTest.java @@ -28,6 +28,7 @@ import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.api.parallel.Isolated; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @@ -36,6 +37,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +@Isolated @Tag(Tags.RequiresFDB) class BlockingInAsyncDetectionTest { @RegisterExtension diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBDatabaseRunnerTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBDatabaseRunnerTest.java index 1a84fa5aaf..c79a5af10b 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBDatabaseRunnerTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBDatabaseRunnerTest.java @@ -38,6 +38,7 @@ import com.google.protobuf.Message; import org.apache.logging.log4j.ThreadContext; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -70,8 +71,10 @@ @Tag(Tags.RequiresFDB) public class FDBDatabaseRunnerTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); FDBDatabase database; diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBDatabaseTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBDatabaseTest.java index 6037031f56..a9653aaaeb 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBDatabaseTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBDatabaseTest.java @@ -40,12 +40,15 @@ import com.apple.test.BooleanSource; import com.apple.test.Tags; import com.google.protobuf.Message; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.function.Executable; import org.junit.jupiter.api.parallel.Execution; import org.junit.jupiter.api.parallel.ExecutionMode; +import org.junit.jupiter.api.parallel.ResourceLock; +import org.junit.jupiter.api.parallel.Resources; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.slf4j.Logger; @@ -83,8 +86,10 @@ class FDBDatabaseTest { @Nonnull private static final Logger LOGGER = LoggerFactory.getLogger(FDBDatabaseTest.class); @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); @Test @@ -216,6 +221,7 @@ void cachedReadVersionWithRetryLoops(boolean async) throws InterruptedException, @ParameterizedTest(name = "testJoinNowOnCompletedFuture (behavior = {0})") @EnumSource(BlockingInAsyncDetection.class) + @ResourceLock(Resources.GLOBAL) void testJoinNowOnCompletedFuture(BlockingInAsyncDetection behavior) { FDBDatabaseFactory factory = dbExtension.getDatabaseFactory(); factory.setBlockingInAsyncDetection(behavior); @@ -231,6 +237,7 @@ void testJoinNowOnCompletedFuture(BlockingInAsyncDetection behavior) { @ParameterizedTest(name = "testJoinNowOnNonCompletedFuture (behavior = {0})") @EnumSource(BlockingInAsyncDetection.class) + @ResourceLock(Resources.GLOBAL) void testJoinNowOnNonCompletedFuture(BlockingInAsyncDetection behavior) { FDBDatabaseFactory factory = dbExtension.getDatabaseFactory(); factory.setBlockingInAsyncDetection(behavior); diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBMetaDataStoreTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBMetaDataStoreTest.java index 9c3e7c65af..05a0245a72 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBMetaDataStoreTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBMetaDataStoreTest.java @@ -66,6 +66,7 @@ import com.google.protobuf.Descriptors; import com.google.protobuf.ExtensionRegistry; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -103,8 +104,10 @@ @Tag(Tags.RequiresFDB) public class FDBMetaDataStoreTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); FDBDatabase fdb; diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordContextTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordContextTest.java index f517382b6a..05e7ee5498 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordContextTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordContextTest.java @@ -43,9 +43,12 @@ import com.google.common.base.Utf8; import com.google.common.collect.ImmutableList; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.api.parallel.ResourceLock; +import org.junit.jupiter.api.parallel.Resources; import org.junit.jupiter.params.ParameterizedTest; import javax.annotation.Nonnull; @@ -82,8 +85,10 @@ @Tag(Tags.RequiresFDB) public class FDBRecordContextTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); // A list of transaction IDs where the left item is the original ID and the right item is the expected @@ -333,6 +338,7 @@ public void getReadVersionWithWeakReadSemantics() { } } + @ResourceLock(Resources.GLOBAL) @Test public void getReadVersionAtBatch() { final FDBStoreTimer timer = new FDBStoreTimer(); diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreConcurrentTestBase.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreConcurrentTestBase.java index d8e3a8b651..f6ea4c0b19 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreConcurrentTestBase.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreConcurrentTestBase.java @@ -39,6 +39,7 @@ import com.apple.test.Tags; import com.google.common.collect.ImmutableMap; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.extension.RegisterExtension; import org.slf4j.Logger; @@ -57,8 +58,10 @@ @Tag(Tags.RequiresFDB) public class FDBRecordStoreConcurrentTestBase { @RegisterExtension + @Order(0) protected final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) protected final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); private static final Logger LOGGER = LoggerFactory.getLogger(FDBRecordStoreConcurrentTestBase.class); diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreCountRecordsTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreCountRecordsTest.java index d0c969ba42..65eb4ae1a0 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreCountRecordsTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreCountRecordsTest.java @@ -45,6 +45,8 @@ import com.google.protobuf.Message; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; import javax.annotation.Nonnull; import java.util.HashMap; @@ -69,6 +71,7 @@ * Tests related to built in functionality for getting the count of records in a store. */ @Tag(Tags.RequiresFDB) +@Execution(ExecutionMode.CONCURRENT) public class FDBRecordStoreCountRecordsTest extends FDBRecordStoreTestBase { @Test @@ -380,7 +383,7 @@ public void addCountIndex() throws Exception { } // Build the index - try (OnlineIndexer onlineIndexBuilder = OnlineIndexer.forRecordStoreAndIndex(recordStore, "record_count")) { + try (OnlineIndexer onlineIndexBuilder = newIndexer("record_count")) { onlineIndexBuilder.buildIndex(); } try (FDBRecordContext context = openContext()) { diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreIndexTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreIndexTest.java index af3f89a54c..295279561d 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreIndexTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreIndexTest.java @@ -1239,8 +1239,7 @@ void markReadableTest() throws Exception { openSimpleRecordStore(context); Index index = recordStore.getRecordMetaData().getIndex(indexName); assertThat(recordStore.isIndexReadable(index), is(false)); - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder().setRecordStore(recordStore).setIndex(index) - .build()) { + try (OnlineIndexer indexBuilder = newIndexer(indexName)) { indexBuilder.buildIndex(false); } commit(context); @@ -2251,7 +2250,7 @@ public IndexState needRebuildIndex(Index index, long recordCount, boolean indexO recordStore.clearAndMarkIndexWriteOnly("index-1").join(); context.commit(); } - try (OnlineIndexer onlineIndexBuilder = OnlineIndexer.forRecordStoreAndIndex(recordStore, "index-1")) { + try (OnlineIndexer onlineIndexBuilder = newIndexerBuilder().setIndex("index-1").build()) { onlineIndexBuilder.buildIndex(); } try (FDBRecordContext context = openContext()) { diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreTestBase.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreTestBase.java index c7bc419919..19a935c702 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreTestBase.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreTestBase.java @@ -305,4 +305,18 @@ protected FDBStoredRecord saveAndSplitSimpleRecord(long recno, String s md.removeIndex("MySimpleRecord$str_value_indexed"); md.setStoreRecordVersions(false); }; + + @Nonnull + protected OnlineIndexer.Builder newIndexerBuilder() { + return OnlineIndexer.newBuilder() + .setRecordStore(recordStore) + .setPriority(FDBTransactionPriority.DEFAULT); + } + + @Nonnull + protected OnlineIndexer newIndexer(@Nonnull String indexName) { + return newIndexerBuilder() + .setIndex(indexName) + .build(); + } } diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreUniqueIndexTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreUniqueIndexTest.java index cd6eeaf48c..60c14765fb 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreUniqueIndexTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBRecordStoreUniqueIndexTest.java @@ -45,8 +45,8 @@ import com.apple.foundationdb.record.metadata.Key; import com.apple.foundationdb.record.provider.foundationdb.indexes.InvalidIndexEntry; import com.apple.foundationdb.record.provider.foundationdb.indexes.ValueIndexMaintainer; -import com.apple.foundationdb.record.query.QueryToKeyMatcher; import com.apple.foundationdb.record.provider.foundationdb.keyspace.KeySpacePath; +import com.apple.foundationdb.record.query.QueryToKeyMatcher; import com.apple.foundationdb.record.query.plan.QueryPlanner; import com.apple.foundationdb.record.test.TestKeySpace; import com.apple.foundationdb.record.util.pair.Pair; @@ -59,6 +59,8 @@ import org.hamcrest.Matchers; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -98,6 +100,7 @@ * Tests of uniqueness checks. */ @Tag(Tags.RequiresFDB) +@Execution(ExecutionMode.CONCURRENT) public class FDBRecordStoreUniqueIndexTest extends FDBRecordStoreTestBase { private static final String NO_UNIQUE_CLEAR_INDEX_TYPE = "no_unique_clear"; @@ -310,8 +313,7 @@ void multipleStores() throws Exception { recordStore = createOrOpenRecordStore(context, simpleMetaData(uniqueHook), path).getLeft(); commit(context); - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) + try (OnlineIndexer indexBuilder = newIndexerBuilder() .setTargetIndexes(List.of(uniqueIndex)) .setIndexingPolicy(OnlineIndexer.IndexingPolicy.newBuilder() .allowUniquePendingState(true)) @@ -630,8 +632,7 @@ public void addUniqueIndexViaBuild() { if (allowReadableUniquePending) { indexingPolicy.allowUniquePendingState(); } - try (OnlineIndexer indexer = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) + try (OnlineIndexer indexer = newIndexerBuilder() .setTargetIndexesByName(List.of(uniqueIndex.getName())) .setIndexingPolicy(indexingPolicy .build()).build()) { diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBReverseDirectoryCacheTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBReverseDirectoryCacheTest.java index 6aaafbeacb..a679d2d3f4 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBReverseDirectoryCacheTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBReverseDirectoryCacheTest.java @@ -40,6 +40,7 @@ import com.google.common.collect.BiMap; import com.google.common.collect.ImmutableBiMap; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -80,8 +81,10 @@ @Tag(Tags.RequiresFDB) public class FDBReverseDirectoryCacheTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); private static final Logger logger = LoggerFactory.getLogger(FDBReverseDirectoryCacheTest.class); diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBStoreTimerTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBStoreTimerTest.java index 33e4af6238..335a6833f0 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBStoreTimerTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBStoreTimerTest.java @@ -43,6 +43,7 @@ import org.hamcrest.Matchers; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -76,8 +77,10 @@ @Execution(ExecutionMode.CONCURRENT) public class FDBStoreTimerTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); FDBDatabase fdb; KeySpacePath path; diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBTypedRecordStoreTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBTypedRecordStoreTest.java index b6201caf59..41797f2f49 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBTypedRecordStoreTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/FDBTypedRecordStoreTest.java @@ -33,6 +33,7 @@ import com.apple.foundationdb.tuple.Tuple; import com.apple.test.Tags; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -47,8 +48,10 @@ @Tag(Tags.RequiresFDB) public class FDBTypedRecordStoreTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); FDBDatabase fdb; KeySpacePath path; diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/KeyValueCursorTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/KeyValueCursorTest.java index d97e4b0ef9..9606e971b9 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/KeyValueCursorTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/KeyValueCursorTest.java @@ -41,6 +41,7 @@ import com.apple.foundationdb.tuple.Tuple; import com.apple.test.Tags; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -64,8 +65,10 @@ @Tag(Tags.RequiresFDB) public class KeyValueCursorTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); private FDBDatabase fdb; diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OneOfTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OneOfTest.java index cbad474586..3ab54f3a47 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OneOfTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OneOfTest.java @@ -34,6 +34,7 @@ import com.apple.test.Tags; import com.google.protobuf.Message; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -47,8 +48,10 @@ @Tag(Tags.RequiresFDB) public class OneOfTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); private FDBDatabase fdb; private KeySpacePath path; diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerBuildUnnestedIndexTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerBuildUnnestedIndexTest.java index 687cf7e41d..243b067ac6 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerBuildUnnestedIndexTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerBuildUnnestedIndexTest.java @@ -679,6 +679,7 @@ void doNotAllowBuildingIndexFromUnnestedIndex() { try (OnlineIndexer indexer = OnlineIndexer.newBuilder() .setRecordStoreBuilder(storeBuilder) .setIndex(targetIndex) + .setPriority(FDBTransactionPriority.DEFAULT) .setIndexingPolicy(OnlineIndexer.IndexingPolicy.newBuilder() .setSourceIndex(sourceIndex.getName()) .setIfDisabled(OnlineIndexer.IndexingPolicy.DesiredAction.REBUILD) diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerMergeTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerMergeTest.java index 4aded5dcc7..50ff413d52 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerMergeTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerMergeTest.java @@ -50,6 +50,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Isolated; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -72,6 +73,7 @@ * Tests specifically of {@link OnlineIndexer#mergeIndex()}. */ @Tag(Tags.RequiresFDB) +@Isolated public class OnlineIndexerMergeTest extends FDBRecordStoreConcurrentTestBase { private static final String INDEX_NAME = "mergableIndex"; @@ -145,6 +147,7 @@ void testRepartitionTimeout() { try (OnlineIndexer indexer = OnlineIndexer.newBuilder() .setRecordStoreBuilder(storeBuilder) .setTargetIndexesByName(List.of(INDEX_NAME)) + .setPriority(FDBTransactionPriority.DEFAULT) .setMaxAttempts(9) .build()) { Assertions.assertThrows(FDBExceptions.FDBStoreTransactionIsTooOldException.class, indexer::mergeIndex); diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerMutualTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerMutualTest.java index 7258a25577..fc5097098b 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerMutualTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerMutualTest.java @@ -41,6 +41,7 @@ import com.apple.test.Tags; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Isolated; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.slf4j.Logger; @@ -75,6 +76,7 @@ * Tests for mutually building indexes {@link OnlineIndexer}. */ @Tag(Tags.Slow) +@Isolated class OnlineIndexerMutualTest extends OnlineIndexerTest { private static final Logger LOGGER = LoggerFactory.getLogger(OnlineIndexerMutualTest.class); diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerSimpleTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerSimpleTest.java index 803c323a45..715537b298 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerSimpleTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerSimpleTest.java @@ -45,6 +45,8 @@ import org.hamcrest.Matchers; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.ResourceLock; +import org.junit.jupiter.api.parallel.Resources; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -382,6 +384,7 @@ public void readableAtEnd() { } } + @ResourceLock(Resources.GLOBAL) @Test public void logsEnd() { List records = LongStream.range(0, 50).mapToObj(val -> @@ -846,6 +849,7 @@ public void testTimeLimit() { } } + @ResourceLock(Resources.GLOBAL) @Test public void testLogInterval() { final int limit = 20; @@ -901,6 +905,7 @@ public void testLogInterval() { .setTimer(timer) .setProgressLogIntervalMillis(0) .setLimit(limit) + .setPriority(FDBTransactionPriority.BATCH) .setConfigLoader(old -> { // Ensure that time limit is exceeded try { diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerTest.java index 6e5824c1cb..546399e12b 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/OnlineIndexerTest.java @@ -41,6 +41,7 @@ import com.google.protobuf.Descriptors; import com.google.protobuf.Message; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.extension.RegisterExtension; @@ -62,8 +63,10 @@ @Tag(Tags.RequiresFDB) public abstract class OnlineIndexerTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); FDBDatabase fdb; @@ -156,6 +159,7 @@ OnlineIndexer.Builder newIndexerBuilder() { .setMetaData(metaData) .setSubspaceProvider(new SubspaceProviderByKeySpacePath(path)) .setIndexMaintenanceFilter(getIndexMaintenanceFilter()) + .setPriority(FDBTransactionPriority.DEFAULT) .setFormatVersion(formatVersion); } @@ -181,6 +185,7 @@ OnlineIndexScrubber.Builder newScrubberBuilder() { .setMetaData(metaData) .setSubspaceProvider(new SubspaceProviderByKeySpacePath(path)) .setIndexMaintenanceFilter(getIndexMaintenanceFilter()) + .setPriority(FDBTransactionPriority.DEFAULT) .setFormatVersion(formatVersion); } diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/RecordTypeKeyTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/RecordTypeKeyTest.java index 46aec50a58..cce49140c1 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/RecordTypeKeyTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/RecordTypeKeyTest.java @@ -602,7 +602,7 @@ public void testOnlineIndexBuilder() throws Exception { timer.reset(); // Build in this transaction. - try (OnlineIndexer indexBuilder = OnlineIndexer.forRecordStoreAndIndex(recordStore, "newIndex")) { + try (OnlineIndexer indexBuilder = newIndexer("newIndex")) { indexBuilder.rebuildIndex(recordStore); } recordStore.markIndexReadable("newIndex").join(); @@ -629,7 +629,7 @@ public void testOnlineIndexBuilder() throws Exception { timer.reset(); // Build in multiple transactions. - try (OnlineIndexer indexBuilder = OnlineIndexer.forRecordStoreAndIndex(recordStore, "newIndex")) { + try (OnlineIndexer indexBuilder = newIndexer("newIndex")) { indexBuilder.buildIndex(); } @@ -682,7 +682,7 @@ public void testOnlineIndexMultiTargetBuilder() throws Exception { } // Build multiple indexes of typed records - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder().setRecordStore(recordStore) + try (OnlineIndexer indexBuilder = newIndexerBuilder() .addTargetIndex("newIndex") .addTargetIndex("newSumIndex") .addTargetIndex("newMaxIndex") diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/RemoteFetchTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/RemoteFetchTest.java index 152e5c871e..4893a63efa 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/RemoteFetchTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/RemoteFetchTest.java @@ -23,6 +23,7 @@ import com.apple.foundationdb.record.CursorStreamingMode; import com.apple.foundationdb.record.ExecuteProperties; import com.apple.foundationdb.record.IndexEntry; +import com.apple.foundationdb.record.IndexFetchMethod; import com.apple.foundationdb.record.IndexScanType; import com.apple.foundationdb.record.IsolationLevel; import com.apple.foundationdb.record.RecordCoreStorageException; @@ -34,7 +35,6 @@ import com.apple.foundationdb.record.metadata.expressions.KeyExpression; import com.apple.foundationdb.record.query.RecordQuery; import com.apple.foundationdb.record.query.expressions.Query; -import com.apple.foundationdb.record.IndexFetchMethod; import com.apple.foundationdb.record.query.plan.plans.RecordQueryComparatorPlan; import com.apple.foundationdb.record.query.plan.plans.RecordQueryPlan; import com.apple.foundationdb.tuple.Tuple; diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/RemoteFetchTestBase.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/RemoteFetchTestBase.java index 2873244b52..da33d9cb6b 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/RemoteFetchTestBase.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/RemoteFetchTestBase.java @@ -40,6 +40,7 @@ import com.apple.test.Tags; import com.google.protobuf.Message; import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.parallel.Isolated; import org.junit.jupiter.params.provider.Arguments; import javax.annotation.Nonnull; @@ -59,6 +60,7 @@ * Base class for RemoteFetch tests. */ @Tag(Tags.RequiresFDB) +@Isolated public class RemoteFetchTestBase extends FDBRecordStoreQueryTestBase { protected static final RecordQuery NUM_VALUES_LARGER_THAN_990 = RecordQuery.newBuilder() diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/SynchronizedSessionTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/SynchronizedSessionTest.java index ee42087d61..2656ad6140 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/SynchronizedSessionTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/SynchronizedSessionTest.java @@ -21,6 +21,7 @@ package com.apple.foundationdb.record.provider.foundationdb; import com.apple.foundationdb.async.AsyncUtil; +import com.apple.foundationdb.record.logging.KeyValueLogMessage; import com.apple.foundationdb.record.provider.foundationdb.synchronizedsession.SynchronizedSessionRunner; import com.apple.foundationdb.record.test.FDBDatabaseExtension; import com.apple.foundationdb.record.test.TestKeySpace; @@ -29,21 +30,27 @@ import com.apple.foundationdb.synchronizedsession.SynchronizedSessionLockedException; import com.apple.test.Tags; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Random; +import javax.annotation.Nonnull; +import java.util.Collection; +import java.util.Deque; import java.util.UUID; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentLinkedDeque; +import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; /** * Tests for {@link com.apple.foundationdb.record.provider.foundationdb.synchronizedsession.SynchronizedSessionRunner}. @@ -51,9 +58,13 @@ @Tag(Tags.RequiresFDB) public abstract class SynchronizedSessionTest { private static final Logger LOGGER = LoggerFactory.getLogger(SynchronizedSessionTest.class); + private static final AtomicInteger threadCounter = new AtomicInteger(); + @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); private FDBDatabase database; @@ -64,8 +75,6 @@ public abstract class SynchronizedSessionTest { private static final long DEFAULT_LEASE_LENGTH_MILLIS = 250; - private Random random = new Random(); - private SynchronizedSessionTest(boolean runAsync) { this.runAsync = runAsync; } @@ -223,18 +232,16 @@ public void takeLaterOneWhenThereAreDifferentLeaseEndTimes() throws Exception { UUID session1Id = session1Runner1.getSessionId(); try (SynchronizedSessionRunner session1Runner2 = database.newRunner().joinSynchronizedSession(lockSubspace1, session1Id, DEFAULT_LEASE_LENGTH_MILLIS * 2)) { - Thread run1 = new Thread(() -> checkActive(session1Runner1)); - Thread run2 = new Thread(() -> checkActive(session1Runner2)); - - AtomicBoolean threadsHaveExceptions = new AtomicBoolean(false); - logExceptionsInThreads(threadsHaveExceptions); + Deque uncaughtExceptions = new ConcurrentLinkedDeque<>(); + Thread run1 = createThread(uncaughtExceptions, () -> checkActive(session1Runner1)); + Thread run2 = createThread(uncaughtExceptions, () -> checkActive(session1Runner2)); run1.start(); run2.start(); run1.join(); run2.join(); - assertTrue(!threadsHaveExceptions.get()); + assertNoExceptions(uncaughtExceptions); // Runner 1 set the lease end time to 2 seconds in the future, while Runner 2 set it to 3 seconds, // the later one should be honoured. So a new session shouldn't take the lock until 3 seconds. @@ -266,7 +273,8 @@ private void testRenewLeaseContinuously(boolean reuseRunner) throws Exception { try (SynchronizedSessionRunner session1Runner0 = database.newRunner().startSynchronizedSession(lockSubspace1, 1_000)) { UUID session1 = session1Runner0.getSessionId(); AtomicBoolean session1Stopped = new AtomicBoolean(false); - Thread longSession = new Thread(() -> { + Deque uncaughtExceptions = new ConcurrentLinkedDeque<>(); + Thread longSession = createThread(uncaughtExceptions, () -> { for (int i = 0; i < 10; i++) { try { Thread.sleep(500); @@ -279,37 +287,27 @@ private void testRenewLeaseContinuously(boolean reuseRunner) throws Exception { } session1Stopped.set(true); }); - Thread tryStartSession = new Thread(() -> { + Thread tryStartSession = createThread(uncaughtExceptions, () -> { while (!session1Stopped.get()) { assertFailedStartSession(lockSubspace1); try { - Thread.sleep(random.nextInt(500)); + Thread.sleep(ThreadLocalRandom.current().nextInt(500)); } catch (InterruptedException e) { e.printStackTrace(); } } }); - AtomicBoolean threadsHaveExceptions = new AtomicBoolean(false); - logExceptionsInThreads(threadsHaveExceptions); - longSession.start(); tryStartSession.start(); tryStartSession.join(); - assertTrue(!threadsHaveExceptions.get()); + assertNoExceptions(uncaughtExceptions); session1Runner0.endSession(); } } - private void logExceptionsInThreads(AtomicBoolean threadsHaveExceptions) { - Thread.setDefaultUncaughtExceptionHandler((thread, exception) -> { - threadsHaveExceptions.set(true); - LOGGER.error("Exception in a thread", thread.toString(), exception); - }); - } - private SynchronizedSessionRunner newRunnerStartSession(Subspace lockSubspace) { return database.newRunner().startSynchronizedSession(lockSubspace, DEFAULT_LEASE_LENGTH_MILLIS); } @@ -345,6 +343,27 @@ private void assertFailedContinueSession(SynchronizedSessionRunner synchronizedS assertEquals("Failed to continue the session", exception.getMessage()); } + @Nonnull + private static Thread createThread(Collection uncaughtExceptions, Runnable task) { + Thread t = new Thread(task); + t.setName("synchronized-session-test-" + threadCounter.getAndIncrement()); + t.setDaemon(false); + t.setUncaughtExceptionHandler((thread, exception) -> { + LOGGER.error(KeyValueLogMessage.of("Uncaught exception in thread", + "thread", thread.getName() + ), exception); + uncaughtExceptions.add(exception); + }); + return t; + } + + private static void assertNoExceptions(Collection uncaughtExceptions) { + if (!uncaughtExceptions.isEmpty()) { + Throwable t = uncaughtExceptions.iterator().next(); + fail("Found " + uncaughtExceptions.size() + " unexpected exceptions", t); + } + } + private void waitLongEnough() throws InterruptedException { Thread.sleep(DEFAULT_LEASE_LENGTH_MILLIS + 100); } diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/indexes/SimpleMultidimensionalIndexTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/indexes/SimpleMultidimensionalIndexTest.java index f203aa1d04..9296664df2 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/indexes/SimpleMultidimensionalIndexTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/indexes/SimpleMultidimensionalIndexTest.java @@ -21,6 +21,8 @@ package com.apple.foundationdb.record.provider.foundationdb.indexes; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -35,18 +37,22 @@ /** * Simple tests for Multidimensional Index. */ +@Execution(ExecutionMode.CONCURRENT) class SimpleMultidimensionalIndexTest extends MultidimensionalIndexTestBase { + static Stream storageAdapterArgs() { + return Stream.of(BY_NODE.toString(), BY_SLOT.toString()); + } + + static Stream booleanArgs() { + return Stream.of(false, true); + } + static Stream argumentsForBasicReads() { - return Stream.of( - Arguments.of(BY_NODE.toString(), false, false), - Arguments.of(BY_NODE.toString(), false, true), - Arguments.of(BY_NODE.toString(), true, false), - Arguments.of(BY_NODE.toString(), true, true), - Arguments.of(BY_SLOT.toString(), false, false), - Arguments.of(BY_SLOT.toString(), false, true), - Arguments.of(BY_SLOT.toString(), true, false), - Arguments.of(BY_SLOT.toString(), true, true)); + return storageAdapterArgs().flatMap(storageAdapter -> + booleanArgs().flatMap(storeHilbertValues -> + booleanArgs().map(useNodeSlotIndex -> + Arguments.of(storageAdapter, storeHilbertValues, useNodeSlotIndex)))); } /** @@ -57,62 +63,51 @@ static Stream argumentsForBasicReads() { * * @return a stream of arguments */ + @Nonnull static Stream argumentsForIndexReads() { final Random random = new Random(System.currentTimeMillis()); - return Stream.of( - Arguments.of(random.nextLong(), 100, BY_SLOT.toString(), false, false), - Arguments.of(random.nextLong(), 100, BY_SLOT.toString(), false, true), - Arguments.of(random.nextLong(), 100, BY_SLOT.toString(), true, false), - Arguments.of(random.nextLong(), 100, BY_SLOT.toString(), true, true), - Arguments.of(random.nextLong(), 100, BY_NODE.toString(), false, false), - Arguments.of(random.nextLong(), 100, BY_NODE.toString(), false, true), - Arguments.of(random.nextLong(), 100, BY_NODE.toString(), true, false), - Arguments.of(random.nextLong(), 100, BY_NODE.toString(), true, true), - Arguments.of(random.nextLong(), 500, BY_SLOT.toString(), false, false), - Arguments.of(random.nextLong(), 500, BY_SLOT.toString(), false, true), - Arguments.of(random.nextLong(), 500, BY_SLOT.toString(), true, false), - Arguments.of(random.nextLong(), 500, BY_SLOT.toString(), true, true), - Arguments.of(random.nextLong(), 500, BY_NODE.toString(), false, false), - Arguments.of(random.nextLong(), 500, BY_NODE.toString(), false, true), - Arguments.of(random.nextLong(), 500, BY_NODE.toString(), true, false), - Arguments.of(random.nextLong(), 500, BY_NODE.toString(), true, true), - // large values only for default config - Arguments.of(random.nextLong(), 1000, BY_NODE.toString(), true, false), - Arguments.of(random.nextLong(), 5000, BY_NODE.toString(), true, false) - ); + return storageAdapterArgs().flatMap(storageAdapter -> + booleanArgs().flatMap(storeHilbertValue -> + booleanArgs().flatMap(useNodeSlotIndex -> + argumentsForIndexReads(random, storageAdapter, storeHilbertValue, useNodeSlotIndex)))); } + @Nonnull + static Stream argumentsForIndexReads(@Nonnull Random random, @Nonnull String storageAdapter, boolean storeHilbertValue, boolean useNodeSlotIndex) { + Arguments small = Arguments.of(random.nextLong(), 100, storageAdapter, storeHilbertValue, useNodeSlotIndex); + Arguments medium = Arguments.of(random.nextLong(), 500, storageAdapter, storeHilbertValue, useNodeSlotIndex); + // large values only for default config + if (storeHilbertValue && !useNodeSlotIndex && storageAdapter.equals(BY_NODE.toString())) { + Arguments large = Arguments.of(random.nextLong(), 1000, storageAdapter, storeHilbertValue, useNodeSlotIndex); + Arguments extraLarge = Arguments.of(random.nextLong(), 5000, storageAdapter, storeHilbertValue, useNodeSlotIndex); + return Stream.of(small, medium, large, extraLarge); + } else { + return Stream.of(small, medium); + } + } + + @Nonnull static Stream argumentsForIndexReadsAfterDeletes() { final Random random = new Random(System.currentTimeMillis()); - return Stream.of( - Arguments.of(random.nextLong(), 10, random.nextInt(10) + 1, BY_SLOT.toString(), false, false), - Arguments.of(random.nextLong(), 10, random.nextInt(10) + 1, BY_SLOT.toString(), false, true), - Arguments.of(random.nextLong(), 10, random.nextInt(10) + 1, BY_SLOT.toString(), true, false), - Arguments.of(random.nextLong(), 10, random.nextInt(10) + 1, BY_SLOT.toString(), true, true), - Arguments.of(random.nextLong(), 100, random.nextInt(100) + 1, BY_SLOT.toString(), false, false), - Arguments.of(random.nextLong(), 100, random.nextInt(100) + 1, BY_SLOT.toString(), false, true), - Arguments.of(random.nextLong(), 100, random.nextInt(100) + 1, BY_SLOT.toString(), true, false), - Arguments.of(random.nextLong(), 100, random.nextInt(100) + 1, BY_SLOT.toString(), true, true), - Arguments.of(random.nextLong(), 300, random.nextInt(300) + 1, BY_SLOT.toString(), false, false), - Arguments.of(random.nextLong(), 300, random.nextInt(300) + 1, BY_SLOT.toString(), false, true), - Arguments.of(random.nextLong(), 300, random.nextInt(300) + 1, BY_SLOT.toString(), true, false), - Arguments.of(random.nextLong(), 300, random.nextInt(300) + 1, BY_SLOT.toString(), true, true), - Arguments.of(random.nextLong(), 10, random.nextInt(10) + 1, BY_NODE.toString(), false, false), - Arguments.of(random.nextLong(), 10, random.nextInt(10) + 1, BY_NODE.toString(), false, true), - Arguments.of(random.nextLong(), 10, random.nextInt(10) + 1, BY_NODE.toString(), true, false), - Arguments.of(random.nextLong(), 10, random.nextInt(10) + 1, BY_NODE.toString(), true, true), - Arguments.of(random.nextLong(), 100, random.nextInt(100) + 1, BY_NODE.toString(), false, false), - Arguments.of(random.nextLong(), 100, random.nextInt(100) + 1, BY_NODE.toString(), false, true), - Arguments.of(random.nextLong(), 100, random.nextInt(100) + 1, BY_NODE.toString(), true, false), - Arguments.of(random.nextLong(), 100, random.nextInt(100) + 1, BY_NODE.toString(), true, true), - Arguments.of(random.nextLong(), 300, random.nextInt(300) + 1, BY_NODE.toString(), false, false), - Arguments.of(random.nextLong(), 300, random.nextInt(300) + 1, BY_NODE.toString(), false, true), - Arguments.of(random.nextLong(), 300, random.nextInt(300) + 1, BY_NODE.toString(), true, false), - Arguments.of(random.nextLong(), 300, random.nextInt(300) + 1, BY_NODE.toString(), true, true), - // large values only for default config - Arguments.of(random.nextLong(), 1000, random.nextInt(1000) + 1, BY_NODE.toString(), true, false), - Arguments.of(random.nextLong(), 5000, random.nextInt(1000) + 1, BY_NODE.toString(), true, false) - ); + return storageAdapterArgs().flatMap(storageAdapter -> + booleanArgs().flatMap(storeHilbertValue -> + booleanArgs().flatMap(useNodeSlotIndex -> + argumentsForIndexReadsAfterDeletes(random, storageAdapter, storeHilbertValue, useNodeSlotIndex)))); + } + + @Nonnull + static Stream argumentsForIndexReadsAfterDeletes(@Nonnull Random random, @Nonnull String storageAdapter, boolean storeHilbertValue, boolean useNodeSlotIndex) { + Arguments extraSmall = Arguments.of(random.nextLong(), 10, random.nextInt(10) + 1, storageAdapter, storeHilbertValue, useNodeSlotIndex); + Arguments small = Arguments.of(random.nextLong(), 100, random.nextInt(100) + 1, storageAdapter, storeHilbertValue, useNodeSlotIndex); + Arguments medium = Arguments.of(random.nextLong(), 300, random.nextInt(300) + 1, storageAdapter, storeHilbertValue, useNodeSlotIndex); + // large values only for default config + if (storeHilbertValue && !useNodeSlotIndex && storageAdapter.equals(BY_NODE.toString())) { + Arguments large = Arguments.of(random.nextLong(), 1000, random.nextInt(1000) + 1, storageAdapter, storeHilbertValue, useNodeSlotIndex); + Arguments extraLarge = Arguments.of(random.nextLong(), 5000, random.nextInt(5000) + 1, storageAdapter, storeHilbertValue, useNodeSlotIndex); + return Stream.of(extraSmall, small, medium, large, extraLarge); + } else { + return Stream.of(extraSmall, small, medium); + } } /** diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/indexes/SlowMultidimensionalIndexTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/indexes/SlowMultidimensionalIndexTest.java index 2ca83d6c6b..9ab579ecdf 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/indexes/SlowMultidimensionalIndexTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/indexes/SlowMultidimensionalIndexTest.java @@ -25,12 +25,15 @@ import com.apple.foundationdb.record.ExecuteProperties; import com.apple.foundationdb.record.provider.foundationdb.FDBStoredRecord; import com.apple.foundationdb.record.query.plan.plans.RecordQueryIndexPlan; +import com.apple.test.RandomizedTestUtils; import com.apple.test.Tags; import com.google.common.collect.ImmutableList; import com.google.protobuf.Message; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -49,6 +52,7 @@ * Additional tests for Multidimensional Index around concurrency and large data-sets. */ @Tag(Tags.Slow) +@Execution(ExecutionMode.CONCURRENT) class SlowMultidimensionalIndexTest extends MultidimensionalIndexTestBase { static Stream argumentsForBasicReads() { @@ -88,27 +92,20 @@ static Stream argumentsForIndexReads() { } static Stream argumentsForIndexReadsAfterDeletes() { - final Random random = new Random(System.currentTimeMillis()); - return Stream.concat( - SimpleMultidimensionalIndexTest.argumentsForIndexReadsAfterDeletes(), - Stream.of( - Arguments.of(random.nextLong(), 1000, random.nextInt(1000) + 1, BY_SLOT.toString(), false, false), - Arguments.of(random.nextLong(), 1000, random.nextInt(1000) + 1, BY_SLOT.toString(), false, true), - Arguments.of(random.nextLong(), 1000, random.nextInt(1000) + 1, BY_SLOT.toString(), true, false), - Arguments.of(random.nextLong(), 1000, random.nextInt(1000) + 1, BY_SLOT.toString(), true, true), - Arguments.of(random.nextLong(), 5000, random.nextInt(5000) + 1, BY_SLOT.toString(), false, false), - Arguments.of(random.nextLong(), 5000, random.nextInt(5000) + 1, BY_SLOT.toString(), false, true), - Arguments.of(random.nextLong(), 5000, random.nextInt(5000) + 1, BY_SLOT.toString(), true, false), - Arguments.of(random.nextLong(), 5000, random.nextInt(5000) + 1, BY_SLOT.toString(), true, true), - Arguments.of(random.nextLong(), 1000, random.nextInt(1000) + 1, BY_NODE.toString(), false, false), - Arguments.of(random.nextLong(), 1000, random.nextInt(1000) + 1, BY_NODE.toString(), false, true), - Arguments.of(random.nextLong(), 1000, random.nextInt(1000) + 1, BY_NODE.toString(), true, false), - Arguments.of(random.nextLong(), 1000, random.nextInt(1000) + 1, BY_NODE.toString(), true, true), - Arguments.of(random.nextLong(), 5000, random.nextInt(5000) + 1, BY_NODE.toString(), false, false), - Arguments.of(random.nextLong(), 5000, random.nextInt(5000) + 1, BY_NODE.toString(), false, true), - Arguments.of(random.nextLong(), 5000, random.nextInt(5000) + 1, BY_NODE.toString(), true, false), - Arguments.of(random.nextLong(), 5000, random.nextInt(5000) + 1, BY_NODE.toString(), true, true) - )); + Stream fixedArgs = Stream.of( + Arguments.of(0x5ca1b13, 1000, 459, BY_NODE.toString(), true, false), + Arguments.of(0xd133451045L, 5000, 1259, BY_NODE.toString(), true, false) + ); + Stream randomArgs = RandomizedTestUtils.randomArguments(random -> { + long seed = random.nextLong(); + int size = random.nextInt(4000) + 1000; + int deletes = random.nextInt(size); + String storageAdapter = random.nextBoolean() ? BY_SLOT.toString() : BY_NODE.toString(); + boolean useHilbertValue = random.nextBoolean(); + boolean useNodeSlotIndex = random.nextBoolean(); + return Arguments.of(seed, size, deletes, storageAdapter, useHilbertValue, useNodeSlotIndex); + }); + return Stream.concat(fixedArgs, randomArgs); } static Stream argumentsForIndexReadsWithDuplicates() { diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/indexes/VersionIndexTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/indexes/VersionIndexTest.java index 42f2a06614..c82eefb403 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/indexes/VersionIndexTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/indexes/VersionIndexTest.java @@ -88,9 +88,12 @@ import com.google.protobuf.Message; import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.EnumSource; @@ -150,11 +153,14 @@ * Tests for {@code VERSION} type indexes. */ @Tag(Tags.RequiresFDB) +@Execution(ExecutionMode.CONCURRENT) public class VersionIndexTest { private static final byte VERSIONSTAMP_CODE = Tuple.from(Versionstamp.complete(new byte[10])).pack()[0]; @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); private RecordMetaData metaData; diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/keyspace/ResolverCreateHooksTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/keyspace/ResolverCreateHooksTest.java index affc4fa028..c51404caad 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/keyspace/ResolverCreateHooksTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/keyspace/ResolverCreateHooksTest.java @@ -30,6 +30,7 @@ import com.apple.foundationdb.tuple.Tuple; import com.apple.test.Tags; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -45,8 +46,10 @@ @Tag(Tags.RequiresFDB) class ResolverCreateHooksTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); private FDBDatabase database; diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/keyspace/ResolverMappingDigestTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/keyspace/ResolverMappingDigestTest.java index f33bdea1b1..3d0f7e6c55 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/keyspace/ResolverMappingDigestTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/keyspace/ResolverMappingDigestTest.java @@ -32,6 +32,7 @@ import com.apple.test.Tags; import com.google.common.collect.ImmutableSortedMap; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -55,8 +56,10 @@ @Tag(Tags.RequiresFDB) public class ResolverMappingDigestTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); private FDBDatabase database; private Random random = new Random(); diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/keyspace/ResolverMappingReplicatorTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/keyspace/ResolverMappingReplicatorTest.java index e893b656ad..d3855ad627 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/keyspace/ResolverMappingReplicatorTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/keyspace/ResolverMappingReplicatorTest.java @@ -35,6 +35,7 @@ import com.apple.test.Tags; import com.google.common.collect.ImmutableMap; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -60,8 +61,10 @@ @Tag(Tags.RequiresFDB) public abstract class ResolverMappingReplicatorTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); protected LocatableResolver primary; diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/layers/interning/HighContentionAllocatorTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/layers/interning/HighContentionAllocatorTest.java index 4c0065fb95..68f8f888a7 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/layers/interning/HighContentionAllocatorTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/layers/interning/HighContentionAllocatorTest.java @@ -37,6 +37,7 @@ import com.apple.foundationdb.tuple.Tuple; import com.apple.test.Tags; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -66,8 +67,10 @@ @Tag(Tags.RequiresFDB) class HighContentionAllocatorTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); private FDBDatabase database; private KeySpacePath path; diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/layers/interning/StringInterningLayerTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/layers/interning/StringInterningLayerTest.java index 8a8074cbe7..ba28723109 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/layers/interning/StringInterningLayerTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/layers/interning/StringInterningLayerTest.java @@ -35,6 +35,7 @@ import com.apple.foundationdb.tuple.Tuple; import com.apple.test.Tags; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -66,8 +67,10 @@ @Tag(Tags.RequiresFDB) class StringInterningLayerTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); private FDBDatabase database; private Subspace testSubspace; diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/leaderboard/LeaderboardIndexTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/leaderboard/LeaderboardIndexTest.java index b93fe02e53..508dffb1bf 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/leaderboard/LeaderboardIndexTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/leaderboard/LeaderboardIndexTest.java @@ -68,6 +68,7 @@ import com.google.protobuf.Message; import org.hamcrest.Matchers; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -98,8 +99,10 @@ @Tag(Tags.RequiresFDB) public class LeaderboardIndexTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); private FDBDatabase fdb; diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/query/FDBOrQueryToUnionTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/query/FDBOrQueryToUnionTest.java index c03b44329d..6100c5aee9 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/query/FDBOrQueryToUnionTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/query/FDBOrQueryToUnionTest.java @@ -71,6 +71,8 @@ import org.hamcrest.Matchers; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -145,6 +147,7 @@ * Tests related to planning a query with an OR clause into a union plan. */ @Tag(Tags.RequiresFDB) +@Execution(ExecutionMode.CONCURRENT) class FDBOrQueryToUnionTest extends FDBRecordStoreQueryTestBase { private static Stream booleanArgs() { return Stream.of(false, true); diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/runners/TransactionalRunnerTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/runners/TransactionalRunnerTest.java index 58db04c972..7a28745232 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/runners/TransactionalRunnerTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/runners/TransactionalRunnerTest.java @@ -36,6 +36,7 @@ import com.apple.test.Tags; import org.hamcrest.Matchers; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -80,8 +81,10 @@ @Execution(ExecutionMode.CONCURRENT) class TransactionalRunnerTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); private FDBDatabase database; diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/query/plan/cascades/BooleanValueTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/query/plan/cascades/BooleanValueTest.java index 0531fac330..b5a6f62384 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/query/plan/cascades/BooleanValueTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/query/plan/cascades/BooleanValueTest.java @@ -51,6 +51,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.ArgumentsProvider; @@ -71,6 +73,7 @@ *
  • Nullability tests.
  • * */ +@Execution(ExecutionMode.SAME_THREAD) // necessary as the debugger can do weird things with the current quantifier if run in multiple threads class BooleanValueTest { private static final Type.Enum ENUM_TYPE_FOR_TEST = new Type.Enum(false, List.of( diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/query/plan/synthetic/AbstractSyntheticRecordPlannerTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/query/plan/synthetic/AbstractSyntheticRecordPlannerTest.java index 7b367a7357..841fe8459a 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/query/plan/synthetic/AbstractSyntheticRecordPlannerTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/query/plan/synthetic/AbstractSyntheticRecordPlannerTest.java @@ -40,6 +40,7 @@ import org.hamcrest.Matcher; import org.hamcrest.Matchers; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.extension.RegisterExtension; @@ -56,8 +57,10 @@ @API(API.Status.EXPERIMENTAL) public abstract class AbstractSyntheticRecordPlannerTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); protected FDBDatabase fdb; diff --git a/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/FDBLuceneIndexFailureTest.java b/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/FDBLuceneIndexFailureTest.java index cf20e7ade8..f5847d472e 100644 --- a/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/FDBLuceneIndexFailureTest.java +++ b/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/FDBLuceneIndexFailureTest.java @@ -578,8 +578,7 @@ private void explicitMergeIndex(Index index, RecordLayerPropertyStorage contextP injectedFailures.removeFailure(LUCENE_GET_FDB_LUCENE_FILE_REFERENCE_ASYNC); } - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) + try (OnlineIndexer indexBuilder = newIndexerBuilder() .setIndex(index) .setTimer(timer) .build()) { diff --git a/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/LuceneIndexMaintenanceTest.java b/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/LuceneIndexMaintenanceTest.java index 93a12cac99..9cc2fef238 100644 --- a/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/LuceneIndexMaintenanceTest.java +++ b/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/LuceneIndexMaintenanceTest.java @@ -41,6 +41,7 @@ import com.apple.foundationdb.record.provider.foundationdb.FDBRecordStore; import com.apple.foundationdb.record.provider.foundationdb.FDBRecordStoreConcurrentTestBase; import com.apple.foundationdb.record.provider.foundationdb.FDBStoreTimer; +import com.apple.foundationdb.record.provider.foundationdb.FDBTransactionPriority; import com.apple.foundationdb.record.provider.foundationdb.IndexMaintainerState; import com.apple.foundationdb.record.provider.foundationdb.IndexMaintenanceFilter; import com.apple.foundationdb.record.provider.foundationdb.OnlineIndexer; @@ -60,6 +61,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -112,6 +115,7 @@ * Tests of the consistency of the Lucene Index. */ @Tag(Tags.RequiresFDB) +@Execution(ExecutionMode.CONCURRENT) public class LuceneIndexMaintenanceTest extends FDBRecordStoreConcurrentTestBase { private static final Logger LOGGER = LoggerFactory.getLogger(LuceneIndexMaintenanceTest.class); @@ -1140,6 +1144,7 @@ private void explicitMergeIndex(Index index, FDBRecordStore recordStore = Objects.requireNonNull(schemaSetup.apply(context)); try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() .setRecordStore(recordStore) + .setPriority(FDBTransactionPriority.DEFAULT) .setIndex(index) .setTimer(new FDBStoreTimer()) .build()) { diff --git a/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/LuceneIndexTest.java b/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/LuceneIndexTest.java index aa7afdd0a3..bc28ede997 100644 --- a/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/LuceneIndexTest.java +++ b/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/LuceneIndexTest.java @@ -102,6 +102,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -227,6 +229,7 @@ */ @SuppressWarnings({"resource", "SameParameterValue"}) @Tag(Tags.RequiresFDB) +@Execution(ExecutionMode.CONCURRENT) public class LuceneIndexTest extends FDBLuceneTestBase { private static final Logger LOGGER = LoggerFactory.getLogger(LuceneIndexTest.class); diff --git a/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/LuceneOnlineIndexingTest.java b/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/LuceneOnlineIndexingTest.java index d1fbb6b933..5ed647a461 100644 --- a/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/LuceneOnlineIndexingTest.java +++ b/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/LuceneOnlineIndexingTest.java @@ -66,6 +66,8 @@ import org.hamcrest.Matchers; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import org.slf4j.Logger; @@ -112,6 +114,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; +@Execution(ExecutionMode.CONCURRENT) class LuceneOnlineIndexingTest extends FDBRecordStoreTestBase { private static final Logger LOGGER = LoggerFactory.getLogger(LuceneOnlineIndexingTest.class); @@ -151,10 +154,7 @@ void luceneOnlineIndexingTestSimple() throws IOException { } try (final FDBRecordContext context = openContext()) { rebuildIndexMetaData(context, SIMPLE_DOC, index); - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) - .setIndex(index) - .build()) { + try (OnlineIndexer indexBuilder = newIndexer(index.getName())) { assertTrue(recordStore.isIndexDisabled(index)); indexBuilder.buildIndex(true); } @@ -205,8 +205,7 @@ void luceneOnlineIndexingTestWithRecordUpdates() throws IOException { try (final FDBRecordContext context = openContext(contextProps)) { rebuildIndexMetaData(context, COMPLEX_DOC, index); final RuntimeException stopBuildException = new RuntimeException("stop build"); - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) + try (OnlineIndexer indexBuilder = newIndexerBuilder() .setIndex(index) .setInitialLimit(1) .setConfigLoader(config -> { @@ -264,10 +263,7 @@ void luceneOnlineIndexingTestWithRecordUpdates() throws IOException { // finish the indexing process try (final FDBRecordContext context = openContext(contextProps)) { rebuildIndexMetaData(context, COMPLEX_DOC, index); - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) - .setIndex(index) - .build()) { + try (OnlineIndexer indexBuilder = newIndexer(index.getName())) { assertTrue(recordStore.isIndexWriteOnly(index)); indexBuilder.buildIndex(true); } @@ -361,8 +357,7 @@ void luceneOnlineIndexingTestWithAllRecordUpdates(long seed) { AtomicInteger counter = new AtomicInteger(0); try (final FDBRecordContext context = openContext(contextProps)) { rebuildIndexMetaData(context, COMPLEX_DOC, index); - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) + try (OnlineIndexer indexBuilder = newIndexerBuilder() .setIndex(index) .setInitialLimit(1) .setLimit(1) @@ -518,8 +513,7 @@ void luceneOnlineIndexingTestAny(Index index, String document, int numRecords, i // build the index .. try (final FDBRecordContext context = openContext()) { rebuildIndexMetaData(context, document, index); - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) + try (OnlineIndexer indexBuilder = newIndexerBuilder() .setIndex(index) .setLimit(transactionLimit) .setIndexingPolicy(OnlineIndexer.IndexingPolicy.newBuilder() @@ -608,8 +602,7 @@ void luceneOnlineIndexingTestMulti() throws IOException { // build the index .. try (final FDBRecordContext context = openContext()) { recordStore = LuceneIndexTestUtils.openRecordStore(context, path, hook); - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) + try (OnlineIndexer indexBuilder = newIndexerBuilder() .setTargetIndexes(indexes) .setLimit(transactionLimit) .build()) { @@ -689,8 +682,7 @@ void luceneOnlineIndexingTestGroupingKeys(int groupingCount) { // build the index .. try (final FDBRecordContext context = openContext()) { openRecordStore(context, hook); - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) + try (OnlineIndexer indexBuilder = newIndexerBuilder() .setIndex(index) .build()) { assertTrue(recordStore.isIndexDisabled(index)); @@ -746,10 +738,7 @@ void luceneOnlineIndexingTestGroupingKeysBackgroundMerge(int groupingCount) thro String[] allFiles = listFiles(index, tuple, groupingCount); int oldLength = allFiles.length; - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) - .setIndex(index) - .build()) { + try (OnlineIndexer indexBuilder = newIndexer(index.getName())) { indexBuilder.mergeIndex(); } @@ -831,10 +820,7 @@ void testRecordUpdateBackgroundMerge() throws IOException { String[] allFiles = listFiles(index); int oldLength = allFiles.length; - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) - .setIndex(index) - .build()) { + try (OnlineIndexer indexBuilder = newIndexer(index.getName())) { indexBuilder.mergeIndex(); } @@ -878,10 +864,7 @@ void testRecordUpdateBackgroundMerge2() throws IOException { String[] allFiles = listFiles(index); int oldLength = allFiles.length; - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) - .setIndex(index) - .build()) { + try (OnlineIndexer indexBuilder = newIndexer(index.getName())) { indexBuilder.mergeIndex(); } @@ -928,10 +911,7 @@ void testRecordUpdateReducedMerge() throws IOException { int loopCounter = 0; for (boolean allDone = false; !allDone; loopCounter++) { int oldLength = listFiles(index).length; - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) - .setIndex(index) - .build()) { + try (OnlineIndexer indexBuilder = newIndexer(index.getName())) { indexBuilder.mergeIndex(); } int newLength = listFiles(index).length; @@ -955,8 +935,7 @@ void luceneOnlineIndexingTestMergesLimit(int mergesLimit) throws IOException { int loopCounter = 0; for (boolean allDone = false; !allDone; loopCounter++) { int oldLength = listFiles(index).length; - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) + try (OnlineIndexer indexBuilder = newIndexerBuilder() .setIndex(index) .setIndexingPolicy(OnlineIndexer.IndexingPolicy.newBuilder() .setInitialMergesCountLimit(mergesLimit) @@ -1044,8 +1023,7 @@ void luceneOnlineIndexingTestMerger() { boolean needMerge = populateDataSplitSegments(index, 4, 1); assertTrue(needMerge); - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) + try (OnlineIndexer indexBuilder = newIndexerBuilder() .setIndex(index) .setMaxAttempts(1) .build()) { @@ -1110,8 +1088,7 @@ void luceneOnlineIndexingTestTerrible2Merger() { boolean needMerge = populateDataSplitSegments(index, 4, 1); assertTrue(needMerge); - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) + try (OnlineIndexer indexBuilder = newIndexerBuilder() .setIndex(index) .setMaxAttempts(1) .build()) { @@ -1143,8 +1120,7 @@ void testRecordUpdateReducedMergeForcingAgileSizeQuota(boolean disableAgilityCon FDBStoreTimer timer = new FDBStoreTimer(); try (FDBRecordContext context = openContext(insertProps)) { openRecordStore(context, hook); - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) + try (OnlineIndexer indexBuilder = newIndexerBuilder() .setIndex(index) .setTimer(timer) .build()) { @@ -1191,8 +1167,7 @@ void testRecordUpdateReducedMergeForcingAgileTimeQuota() throws IOException { FDBStoreTimer timer = new FDBStoreTimer(); try (FDBRecordContext context = openContext(insertProps)) { openRecordStore(context, hook); - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) + try (OnlineIndexer indexBuilder = newIndexerBuilder() .setIndex(index) .setTimer(timer) .build()) { @@ -1266,8 +1241,7 @@ void luceneOnlineIndexingTestTerribleRebalance() { boolean needMerge = populateDataSplitSegments(index, 4, 1); assertTrue(needMerge); - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) + try (OnlineIndexer indexBuilder = newIndexerBuilder() .setIndex(index) .setMaxAttempts(1) .build()) { @@ -1342,8 +1316,7 @@ void luceneOnlineIndexingTestTerribleRebalance2ndChance() { boolean needMerge = populateDataSplitSegments(index, 4, 1); assertTrue(needMerge); - try (OnlineIndexer indexBuilder = OnlineIndexer.newBuilder() - .setRecordStore(recordStore) + try (OnlineIndexer indexBuilder = newIndexerBuilder() .setIndex(index) .setMaxAttempts(1) .build()) { diff --git a/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/directory/AgilityContextTest.java b/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/directory/AgilityContextTest.java index b3051f7e4d..2714a0c5e3 100644 --- a/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/directory/AgilityContextTest.java +++ b/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/directory/AgilityContextTest.java @@ -30,8 +30,9 @@ import com.apple.foundationdb.record.provider.foundationdb.FDBRecordContextConfig; import com.apple.foundationdb.record.provider.foundationdb.FDBRecordStoreTestBase; import com.apple.foundationdb.record.provider.foundationdb.FDBTransactionPriority; +import com.apple.foundationdb.record.provider.foundationdb.keyspace.KeySpacePath; import com.apple.foundationdb.record.provider.foundationdb.properties.RecordLayerPropertyStorage; -import com.apple.foundationdb.record.util.RandomUtil; +import com.apple.foundationdb.record.test.TestKeySpace; import com.apple.foundationdb.subspace.Subspace; import com.apple.foundationdb.tuple.Tuple; import com.apple.foundationdb.tuple.TupleHelpers; @@ -51,7 +52,6 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.ExecutionException; -import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; @@ -71,7 +71,6 @@ class AgilityContextTest extends FDBRecordStoreTestBase { int loopCount = 20; int threadCount = 5; // if exceeds a certain size, may cause an execution pool deadlock - final String prefix = RandomUtil.randomByteString(ThreadLocalRandom.current(), 100).toString(); private AgilityContext getAgilityContextAgileProp(FDBRecordContext callerContext) { final long timeQuotaMillis = @@ -396,16 +395,18 @@ void napTime(int napTimeMilliseconds) { } } - @ParameterizedTest + @ParameterizedTest(name = "testAgilityContextAtomicAttribute[useAgile={0}]") @BooleanSource void testAgilityContextAtomicAttribute(boolean useAgile) { // assert that commits doesn't happen in he middle of an accept or apply call + final KeySpacePath rawDataPath = pathManager.createPath(TestKeySpace.RAW_DATA); for (int sizeQuota : new int[] {1, 21, 100, 10000}) { final RecordLayerPropertyStorage.Builder insertProps = RecordLayerPropertyStorage.newBuilder() .addProp(LuceneRecordContextProperties.LUCENE_AGILE_COMMIT_SIZE_QUOTA, sizeQuota); IntStream.rangeClosed(0, threadCount).parallel().forEach(threadNum -> { try (FDBRecordContext context = openContext(insertProps)) { + byte[] prefix = rawDataPath.toTuple(context).pack(); final AgilityContext agilityContext = getAgilityContext(context, useAgile); for (int i = 1700; i < 1900; i += 17) { final long iFinal = i; @@ -477,14 +478,15 @@ void testAgilityContextRecoveryPath() { @Test void testAgilityContextRecoveryPath2() { + final KeySpacePath rawDataPath = pathManager.createPath(TestKeySpace.RAW_DATA); final Tuple value = Tuple.from(800, "Green eggs and ham", 0); - final Tuple successTuple = Tuple.from(prefix, "yes"); - final Tuple abortedTuple = Tuple.from(prefix, "abort"); - final Tuple failTuple = Tuple.from(prefix, "no"); + final Tuple successTuple = Tuple.from("yes"); + final Tuple abortedTuple = Tuple.from("abort"); + final Tuple failTuple = Tuple.from("no"); byte[] packedValue = value.pack(); try (FDBRecordContext context = openContext()) { + final Subspace subspace = rawDataPath.toSubspace(context); final AgilityContext agilityContext = getAgilityContext(context, true); - final Subspace subspace = path.toSubspace(context); byte[] keyAborted = subspace.pack(abortedTuple); byte[] keySucceeds = subspace.pack(successTuple); byte[] keyFails = subspace.pack(failTuple); @@ -511,7 +513,7 @@ void testAgilityContextRecoveryPath2() { context.commit(); } try (FDBRecordContext context = openContext()) { - final Subspace subspace = path.toSubspace(context); + final Subspace subspace = rawDataPath.toSubspace(context); byte[] keyAborted = subspace.pack(abortedTuple); byte[] keySucceeds = subspace.pack(successTuple); byte[] keyFails = subspace.pack(failTuple); @@ -525,6 +527,7 @@ void testAgilityContextRecoveryPath2() { @BooleanSource void testAgilityContextAtomicAttributeMultiContext(boolean useAgile) { // assert that commits doesn't happen in he middle of an accept or apply call + final KeySpacePath rawDataPath = pathManager.createPath(TestKeySpace.RAW_DATA); IntStream.rangeClosed(0, threadCount).parallel().forEach(threadNum -> { for (int i = 1700; i < 1900; i += 17) { final long iFinal = i; @@ -532,11 +535,12 @@ void testAgilityContextAtomicAttributeMultiContext(boolean useAgile) { int numWriters = 1; // in this test, two writes may conflict each other if (threadNum < numWriters) { try (FDBRecordContext context = openContext()) { + final Tuple rawDataTuple = rawDataPath.toTuple(context); final AgilityContext agilityContext = getAgilityContext(context, useAgile); agilityContext.accept(aContext -> { for (int j = 0; j < 5; j++) { final Transaction tr = aContext.ensureActive(); - tr.set(Tuple.from(prefix, iFinal, j).pack(), + tr.set(rawDataTuple.add(iFinal).add(j).pack(), Tuple.from(iFinal).pack()); napTime(1); } @@ -549,10 +553,11 @@ void testAgilityContextAtomicAttributeMultiContext(boolean useAgile) { try (FDBRecordContext context = openContext()) { final AgilityContext agilityContext = getAgilityContext(context, useAgile); agilityContext.accept(aContext -> { + final Tuple rawDataTuple = rawDataPath.toTuple(context); long[] values = new long[5]; final Transaction tr = aContext.ensureActive(); for (int j = 4; j >= 0; j--) { - byte[] val = tr.get(Tuple.from(prefix, iFinal, j).pack()).join(); + byte[] val = tr.get(rawDataTuple.add(iFinal).add(j).pack()).join(); values[j] = val == null ? 0 : Tuple.fromBytes(val).getLong(0); } for (int j = 1; j < 5; j++) { @@ -570,7 +575,7 @@ void testAgilityContextAtomicAttributeMultiContext(boolean useAgile) { void testCloseOnCommitFailure() { final byte[] key; try (FDBRecordContext context = openContext()) { - key = this.path.toSubspace(context).pack(Tuple.from(prefix, "a").pack()); + key = this.path.toSubspace(context).pack(Tuple.from("a").pack()); context.ensureActive().set(key, Tuple.from(1).pack()); context.commit(); } @@ -601,7 +606,7 @@ void testCloseOnCommitFailure() { void testAutoCommitVersionStampOuterSleep() throws InterruptedException { final byte[] key; try (FDBRecordContext userContext = openContext()) { - key = this.path.toSubspace(userContext).pack(Tuple.from(prefix, "a").pack()); + key = this.path.toSubspace(userContext).pack(Tuple.from("a").pack()); final AgilityContext agilityContext = AgilityContext.agile(userContext, 2, 10000); AtomicReference firstOperation = new AtomicReference<>(); agilityContext.accept(context -> { @@ -626,7 +631,7 @@ void testAutoCommitVersionStampOuterSleep() throws InterruptedException { void testAutoCommitVersionStampOuterSleepUseApply() throws InterruptedException { final byte[] key; try (FDBRecordContext userContext = openContext()) { - key = this.path.toSubspace(userContext).pack(Tuple.from(prefix, "a").pack()); + key = this.path.toSubspace(userContext).pack(Tuple.from("a").pack()); final AgilityContext agilityContext = AgilityContext.agile(userContext, 2, 10000); AtomicReference firstOperation = new AtomicReference<>(); agilityContext.apply(context -> context.ensureActive() @@ -655,7 +660,7 @@ void testAutoCommitVersionStampOuterSleepUseApply() throws InterruptedException void testAutoCommitVersionStampInnerSleep() { final byte[] key; try (FDBRecordContext userContext = openContext()) { - key = this.path.toSubspace(userContext).pack(Tuple.from(prefix, "a").pack()); + key = this.path.toSubspace(userContext).pack(Tuple.from("a").pack()); final AgilityContext agilityContext = AgilityContext.agile(userContext, 2, 10000); AtomicReference firstOperation = new AtomicReference<>(); agilityContext.accept(context -> { @@ -682,7 +687,7 @@ void testAutoCommitVersionStampInnerSleep() { void testAutoCommitVersionStampInnerSleepUseApply() { final byte[] key; try (FDBRecordContext userContext = openContext()) { - key = this.path.toSubspace(userContext).pack(Tuple.from(prefix, "a").pack()); + key = this.path.toSubspace(userContext).pack(Tuple.from("a").pack()); final AgilityContext agilityContext = AgilityContext.agile(userContext, 2, 10000); AtomicReference firstOperation = new AtomicReference<>(); agilityContext.apply(context -> context.ensureActive() diff --git a/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/directory/FDBDirectoryBaseTest.java b/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/directory/FDBDirectoryBaseTest.java index 592c1fadd9..4ebd353005 100644 --- a/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/directory/FDBDirectoryBaseTest.java +++ b/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/directory/FDBDirectoryBaseTest.java @@ -34,6 +34,7 @@ import com.apple.foundationdb.subspace.Subspace; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.extension.RegisterExtension; import javax.annotation.Nonnull; @@ -46,8 +47,10 @@ */ public abstract class FDBDirectoryBaseTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); protected FDBDatabase fdb; protected KeySpacePath path; diff --git a/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/directory/FDBDirectoryLockTest.java b/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/directory/FDBDirectoryLockTest.java index b06bd245b1..98f25709e4 100644 --- a/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/directory/FDBDirectoryLockTest.java +++ b/fdb-record-layer-lucene/src/test/java/com/apple/foundationdb/record/lucene/directory/FDBDirectoryLockTest.java @@ -34,6 +34,7 @@ import org.apache.lucene.store.Lock; import org.apache.lucene.store.LockObtainFailedException; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -53,8 +54,10 @@ @Tag(Tags.RequiresFDB) class FDBDirectoryLockTest { @RegisterExtension + @Order(0) final FDBDatabaseExtension dbExtension = new FDBDatabaseExtension(); @RegisterExtension + @Order(1) final TestKeySpacePathManagerExtension pathManager = new TestKeySpacePathManagerExtension(dbExtension); private FDBDatabase fdb; diff --git a/gradle.properties b/gradle.properties index c403d0a0a1..84550c3d90 100644 --- a/gradle.properties +++ b/gradle.properties @@ -35,5 +35,6 @@ apiVersion=710 mavenLocalEnabled=false org.gradle.daemon=true +testConcurrency=5 url = 'https://github.com/FoundationDB/fdb-record-layer/' diff --git a/gradle/testing.gradle b/gradle/testing.gradle index f82fb78b13..6900c24bae 100644 --- a/gradle/testing.gradle +++ b/gradle/testing.gradle @@ -222,10 +222,13 @@ tasks.withType(Test).configureEach { task -> } task.testFramework.options.excludeTags.add('Performance') - if (task.name == 'test') { - task.systemProperty('junit.jupiter.execution.parallel.enabled', 'false') - task.systemProperty('junit.jupiter.execution.parallel.mode.default', 'same_thread') + if (task.name == 'test' && project.name in ['fdb-extensions', 'fdb-record-layer-core', 'fdb-record-layer-lucene', 'fdb-record-layer-icu', 'fdb-record-layer-spatial']) { + task.systemProperty('junit.jupiter.execution.parallel.enabled', 'true') + task.systemProperty('junit.jupiter.execution.parallel.mode.default', 'concurrent') task.systemProperty('junit.jupiter.execution.parallel.mode.classes.default', 'concurrent') + task.systemProperty('junit.jupiter.execution.parallel.config.strategy', 'fixed') + task.systemProperty('junit.jupiter.execution.parallel.config.fixed.parallelism', "${testConcurrency}") + task.systemProperty('com.apple.foundationdb.test.concurrencyLimit', "${testConcurrency}") } } diff --git a/yaml-tests/src/test/java/JDBCExternalYamlIntegrationTests.java b/yaml-tests/src/test/java/JDBCExternalYamlIntegrationTests.java index 73145405e6..2888ca373d 100644 --- a/yaml-tests/src/test/java/JDBCExternalYamlIntegrationTests.java +++ b/yaml-tests/src/test/java/JDBCExternalYamlIntegrationTests.java @@ -20,7 +20,6 @@ import com.apple.foundationdb.relational.api.RelationalConnection; import com.apple.foundationdb.relational.yamltests.YamlRunner; - import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.Disabled; diff --git a/yaml-tests/src/test/java/JDBCInProcessYamlIntegrationTests.java b/yaml-tests/src/test/java/JDBCInProcessYamlIntegrationTests.java index 38e5457a09..23b34f4c4e 100644 --- a/yaml-tests/src/test/java/JDBCInProcessYamlIntegrationTests.java +++ b/yaml-tests/src/test/java/JDBCInProcessYamlIntegrationTests.java @@ -24,7 +24,6 @@ import com.apple.foundationdb.relational.jdbc.JDBCURI; import com.apple.foundationdb.relational.server.InProcessRelationalServer; import com.apple.foundationdb.relational.yamltests.YamlRunner; - import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.AfterAll;