Merge pull request #972 from adamretter/wb-threads
Threaded tests for WriteBatch
This commit is contained in:
commit
461cec4e8e
@ -99,6 +99,7 @@ JAVA_TESTS = org.rocksdb.BackupableDBOptionsTest\
|
|||||||
org.rocksdb.StatisticsCollectorTest\
|
org.rocksdb.StatisticsCollectorTest\
|
||||||
org.rocksdb.WriteBatchHandlerTest\
|
org.rocksdb.WriteBatchHandlerTest\
|
||||||
org.rocksdb.WriteBatchTest\
|
org.rocksdb.WriteBatchTest\
|
||||||
|
org.rocksdb.WriteBatchThreadedTest\
|
||||||
org.rocksdb.WriteOptionsTest\
|
org.rocksdb.WriteOptionsTest\
|
||||||
org.rocksdb.WriteBatchWithIndexTest
|
org.rocksdb.WriteBatchWithIndexTest
|
||||||
|
|
||||||
|
104
java/src/test/java/org/rocksdb/WriteBatchThreadedTest.java
Normal file
104
java/src/test/java/org/rocksdb/WriteBatchThreadedTest.java
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
// Copyright (c) 2016, Facebook, Inc. All rights reserved.
|
||||||
|
// This source code is licensed under the BSD-style license found in the
|
||||||
|
// LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
// of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
package org.rocksdb;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Rule;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.rules.TemporaryFolder;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.junit.runners.Parameterized;
|
||||||
|
import org.junit.runners.Parameterized.Parameter;
|
||||||
|
import org.junit.runners.Parameterized.Parameters;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.concurrent.*;
|
||||||
|
|
||||||
|
@RunWith(Parameterized.class)
|
||||||
|
public class WriteBatchThreadedTest {
|
||||||
|
|
||||||
|
@Parameters(name = "WriteBatchThreadedTest(threadCount={0})")
|
||||||
|
public static Iterable<Integer> data() {
|
||||||
|
return Arrays.asList(new Integer[]{1, 10, 50, 100});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Parameter
|
||||||
|
public int threadCount;
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public TemporaryFolder dbFolder = new TemporaryFolder();
|
||||||
|
|
||||||
|
RocksDB db;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
RocksDB.loadLibrary();
|
||||||
|
final Options options = new Options()
|
||||||
|
.setCreateIfMissing(true)
|
||||||
|
.setIncreaseParallelism(32);
|
||||||
|
db = RocksDB.open(options, dbFolder.getRoot().getAbsolutePath());
|
||||||
|
assert (db != null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() throws Exception {
|
||||||
|
if (db != null) {
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void threadedWrites() throws InterruptedException, ExecutionException {
|
||||||
|
final List<Callable<Void>> callables = new ArrayList<>();
|
||||||
|
for (int i = 0; i < 100; i++) {
|
||||||
|
final int offset = i * 100;
|
||||||
|
callables.add(new Callable<Void>() {
|
||||||
|
@Override
|
||||||
|
public Void call() throws RocksDBException {
|
||||||
|
final WriteBatch wb = new WriteBatch();
|
||||||
|
for (int i = offset; i < offset + 100; i++) {
|
||||||
|
wb.put(ByteBuffer.allocate(4).putInt(i).array(),
|
||||||
|
"parallel rocks test".getBytes());
|
||||||
|
}
|
||||||
|
db.write(new WriteOptions(), wb);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//submit the callables
|
||||||
|
final ExecutorService executorService =
|
||||||
|
Executors.newFixedThreadPool(threadCount);
|
||||||
|
try {
|
||||||
|
final ExecutorCompletionService<Void> completionService =
|
||||||
|
new ExecutorCompletionService<>(executorService);
|
||||||
|
final Set<Future<Void>> futures = new HashSet<>();
|
||||||
|
for (final Callable<Void> callable : callables) {
|
||||||
|
futures.add(completionService.submit(callable));
|
||||||
|
}
|
||||||
|
|
||||||
|
while (futures.size() > 0) {
|
||||||
|
final Future<Void> future = completionService.take();
|
||||||
|
futures.remove(future);
|
||||||
|
|
||||||
|
try {
|
||||||
|
future.get();
|
||||||
|
} catch (final ExecutionException e) {
|
||||||
|
for (final Future<Void> f : futures) {
|
||||||
|
f.cancel(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
executorService.shutdown();
|
||||||
|
executorService.awaitTermination(10, TimeUnit.SECONDS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user