I’ve followed the Java SDK 2.0 documentation at http://docs.couchbase.com/developer/java-2.0/managing-connections.html. It says it’s possible to open more than one bucket at the same time with a Cluster. But, when I tried the following code snippet, java.util.ConcurrentModificationException is thrown.
Bucket bucket1 = cluster.openBucket(“bucket1”, “password”);
Bucket bucket2 = cluster.openBucket(“bucket2”, “password”);
I had to create a cluster per a bucket and share the CouchbaseEnvironment among the cluster instances to open multiple buckets. It will be helpful if someone can verify whether the documentation has typos or the SDK has a bug.
I’ve just tried this example, and it works
public class Hello {
public static void main(String[] args) {
Cluster cluster = CouchbaseCluster.create();
Bucket bucket1 = cluster.openBucket("bucket1", "password");
Bucket bucket2 = cluster.openBucket("bucket2", "password");
bucket1.upsert(JsonDocument.create("foo", JsonObject.create().put("foo", "bar")));
bucket2.upsert(JsonDocument.create("bar", JsonObject.create().put("foo", "bar")));
}
}
Hi,
you’ve probably hit a bug. Can you share your logs here (exceptions,…) and/or open a ticket here? http://www.couchbase.com/issues/browse/JCBC This is expected to work. Thanks!
Thank you for the quick response. I think the exception is thrown when cluster.disconnect()
is called with open buckets.
The following code runs flawlessly:
public static void main(String[] args) {
Cluster cluster = CouchbaseCluster.create();
Bucket bucket1 = cluster.openBucket("default");
Bucket bucket2 = cluster.openBucket("beer-sample");
bucket1.close();
bucket2.close();
cluster.disconnect();
}
The following code throws the exception:
public static void main(String[] args) {
Cluster cluster = CouchbaseCluster.create();
Bucket bucket1 = cluster.openBucket("default");
Bucket bucket2 = cluster.openBucket("beer-sample");
cluster.disconnect();
}
Here is the log when the exception is thrown.
OS: Mac OS X 10.9.5
JVM: 1.8.0_0
[error] (run-main-6) java.util.ConcurrentModificationException
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1429)
at java.util.HashMap$KeyIterator.next(HashMap.java:1453)
at rx.internal.operators.OnSubscribeFromIterable$IterableProducer.request(OnSubscribeFromIterable.java:96)
at rx.internal.operators.OperatorSubscribeOn$1$1$1$1.request(OperatorSubscribeOn.java:88)
at rx.Subscriber.setProducer(Subscriber.java:143)
at rx.Subscriber.setProducer(Subscriber.java:137)
at rx.internal.operators.OperatorSubscribeOn$1$1$1.setProducer(OperatorSubscribeOn.java:81)
at rx.internal.operators.OnSubscribeFromIterable.call(OnSubscribeFromIterable.java:47)
at rx.internal.operators.OnSubscribeFromIterable.call(OnSubscribeFromIterable.java:33)
at rx.Observable.unsafeSubscribe(Observable.java:7658)
at rx.internal.operators.OperatorSubscribeOn$1$1.call(OperatorSubscribeOn.java:62)
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:43)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
[debug] Thread run-main-6 exited.
[debug] Interrupting remaining threads (should be all daemons).
[debug] Interrupting thread cb-io-1-5
[debug] Interrupted cb-io-1-5
[debug] Interrupting thread RxComputationThreadPool-7
[debug] Interrupted RxComputationThreadPool-7
[debug] Interrupting thread cb-computations-8
[debug] Interrupted cb-computations-8
[debug] Interrupting thread RxComputationThreadPool-1
[debug] Interrupted RxComputationThreadPool-1
[debug] Interrupting thread RxComputationThreadPool-2
[debug] Interrupted RxComputationThreadPool-2
[debug] Interrupting thread cb-io-1-1
[debug] Interrupted cb-io-1-1
[debug] Interrupting thread cb-core-3-1
[debug] Interrupted cb-core-3-1
[debug] Interrupting thread cb-io-1-4
[debug] Interrupted cb-io-1-4
[debug] Interrupting thread RxComputationThreadPool-5
[debug] Interrupted RxComputationThreadPool-5
[debug] Interrupting thread cb-computations-3
[debug] Interrupted cb-computations-3
[debug] Interrupting thread RxComputationThreadPool-4
[debug] Interrupted RxComputationThreadPool-4
[debug] Interrupting thread RxComputationThreadPool-8
[debug] Interrupted RxComputationThreadPool-8
[debug] Interrupting thread cb-computations-1
[debug] Interrupted cb-computations-1
[debug] Interrupting thread RxComputationThreadPool-3
[debug] Interrupted RxComputationThreadPool-3
[debug] Interrupting thread cb-computations-2
[debug] Interrupted cb-computations-2
[debug] Interrupting thread cb-io-1-6
[debug] Interrupted cb-io-1-6
[debug] Interrupting thread cb-computations-7
[debug] Interrupted cb-computations-7
[debug] Interrupting thread cb-io-1-3
[debug] Interrupted cb-io-1-3
[debug] Interrupting thread cb-computations-5
[debug] Interrupted cb-computations-5
[debug] Interrupting thread cb-io-1-2
[debug] Interrupted cb-io-1-2
[debug] Interrupting thread threadDeathWatcher-4-1
[debug] Interrupted threadDeathWatcher-4-1
[debug] Interrupting thread RxComputationThreadPool-6
[debug] Interrupted RxComputationThreadPool-6
[debug] Interrupting thread cb-computations-4
[debug] Interrupted cb-computations-4
[debug] Interrupting thread cb-core-3-2
[debug] Interrupted cb-core-3-2
[debug] Interrupting thread cb-io-1-8
[debug] Interrupted cb-io-1-8
[debug] Interrupting thread cb-io-1-7
[debug] Interrupted cb-io-1-7
[debug] Interrupting thread cb-computations-6
[debug] Interrupted cb-computations-6
[debug] Sandboxed run complete..
[error] (cb-core-3-2) java.lang.RuntimeException: java.lang.InterruptedException
java.lang.RuntimeException: java.lang.InterruptedException
at com.couchbase.client.deps.com.lmax.disruptor.FatalExceptionHandler.handleEventException(FatalExceptionHandler.java:45)
at com.couchbase.client.deps.com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:147)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at com.couchbase.client.deps.io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.InterruptedException
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.reportInterruptAfterWait(AbstractQueuedSynchronizer.java:2014)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2048)
at com.couchbase.client.deps.com.lmax.disruptor.BlockingWaitStrategy.waitFor(BlockingWaitStrategy.java:45)
at com.couchbase.client.deps.com.lmax.disruptor.ProcessingSequenceBarrier.waitFor(ProcessingSequenceBarrier.java:55)
at com.couchbase.client.deps.com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:123)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at com.couchbase.client.deps.io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
at java.lang.Thread.run(Thread.java:745)
java.lang.RuntimeException: Nonzero exit code: 1
at scala.sys.package$.error(package.scala:27)
at sbt.BuildCommon$$anonfun$toError$1.apply(Defaults.scala:1708)
at sbt.BuildCommon$$anonfun$toError$1.apply(Defaults.scala:1708)
at scala.Option.foreach(Option.scala:236)
at sbt.BuildCommon$class.toError(Defaults.scala:1708)
at sbt.Defaults$.toError(Defaults.scala:35)
at sbt.Defaults$$anonfun$runTask$1$$anonfun$apply$36$$anonfun$apply$37.apply(Defaults.scala:688)
at sbt.Defaults$$anonfun$runTask$1$$anonfun$apply$36$$anonfun$apply$37.apply(Defaults.scala:686)
at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:42)
at sbt.std.Transform$$anon$4.work(System.scala:64)
at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
at sbt.Execute.work(Execute.scala:244)
at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:160)
at sbt.CompletionService$$anon$2.call(CompletionService.scala:30)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
[error] (compile:run) Nonzero exit code: 1
Thanks! And to get more context:
- Does it happen all the time?
- Do you have any code after the two bucket openings (can you share the full code?)
I just updated the previous post with new findings. Thank you again.
Thank you, I guess I could reproduce it as well. If you want to follow the ticket -> http://www.couchbase.com/issues/browse/JVMCBC-43
Can you try this 2.0.1-pre version and see if it works for you?
https://dl.dropboxusercontent.com/u/10007675/Couchbase-Java-Client-2.0.1-SNAPSHOT-b0921ce.zip
It works. The multiple buckets are closed without problems now.
Thank you very much.
Great that it works for you! Please don’t forget to upgrade once we ship 2.0.1