commit
461cec4e8e
@ -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