[JAVA-1148] Race condition at com.mongodb.MultiServerCluster Created: 17/Mar/14  Updated: 01/Apr/16  Resolved: 18/Mar/14

Status: Closed
Project: Java Driver
Component/s: Cluster Management
Affects Version/s: 2.12.0
Fix Version/s: 2.12.0, 3.0.0

Type: Bug Priority: Blocker - P1
Reporter: Tiago Albineli Motta Assignee: Unassigned
Resolution: Done Votes: 0
Labels: rc
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified


 Description   

"cluster-1-thread-2" - Thread t@66
java.lang.Thread.State: BLOCKED
at com.mongodb.DefaultServer$DefaultServerStateListener.stateChanged(DefaultServer.java:112)

  • waiting to lock <772e7c67> (a com.mongodb.DefaultServer$DefaultServerStateListener) owned by "cluster-1-thread-1" t@65
    at com.mongodb.DefaultServer.invalidate(DefaultServer.java:87)
    at com.mongodb.MultiServerCluster.invalidateOldPrimaries(MultiServerCluster.java:215)
    at com.mongodb.MultiServerCluster.handleReplicaSetMemberChanged(MultiServerCluster.java:176)
    at com.mongodb.MultiServerCluster.onChange(MultiServerCluster.java:130)
  • locked <ce98b52> (a com.mongodb.MultiServerCluster)
    at com.mongodb.MultiServerCluster.access$100(MultiServerCluster.java:39)
    at com.mongodb.MultiServerCluster$DefaultServerStateListener.stateChanged(MultiServerCluster.java:104)
    at com.mongodb.DefaultServer$DefaultServerStateListener.stateChanged(DefaultServer.java:114)
  • locked <38b9bb1d> (a com.mongodb.DefaultServer$DefaultServerStateListener)
    at com.mongodb.ServerStateNotifier.run(ServerStateNotifier.java:106)
  • locked <5238b42d> (a com.mongodb.ServerStateNotifier)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:204)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

Locked ownable synchronizers:

  • locked <8bd2087> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)

"cluster-1-thread-1" - Thread t@65
java.lang.Thread.State: BLOCKED
at com.mongodb.MultiServerCluster.onChange(MultiServerCluster.java:114)

  • waiting to lock <ce98b52> (a com.mongodb.MultiServerCluster) owned by "cluster-1-thread-2" t@66
    at com.mongodb.MultiServerCluster.access$100(MultiServerCluster.java:39)
    at com.mongodb.MultiServerCluster$DefaultServerStateListener.stateChanged(MultiServerCluster.java:104)
    at com.mongodb.DefaultServer$DefaultServerStateListener.stateChanged(DefaultServer.java:114)
  • locked <772e7c67> (a com.mongodb.DefaultServer$DefaultServerStateListener)
    at com.mongodb.ServerStateNotifier.run(ServerStateNotifier.java:106)
  • locked <38a2838c> (a com.mongodb.ServerStateNotifier)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:204)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

Locked ownable synchronizers:

  • locked <356a7960> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)


 Comments   
Comment by Jeffrey Yemin [ 19/Mar/14 ]

Tiago,

OK, and thanks again for the bug report.

Jeff

Comment by Tiago Albineli Motta [ 19/Mar/14 ]

Jeff

I cannot reproduce the problem anymore because we are not using it anymore. It was happen on production environment, so we had to emergencily change our mongodb driver and now we are using reactivemongo (since our project is in scala).

Tiago

Comment by Jeffrey Yemin [ 18/Mar/14 ]

Hi Tiago,

A fix for this has been pushed. Would you be able to test it out?

Comment by Githook User [ 18/Mar/14 ]

Author:

{u'username': u'jyemin', u'name': u'Jeff Yemin', u'email': u'jeff.yemin@10gen.com'}

Message: JAVA-1148: Fixed deadlock between DefaultServer and MultiServerCluster by removing unnecessary synchronization in DefaultServer
Branch: 3.0.x
https://github.com/mongodb/mongo-java-driver/commit/4d0e325439e8857c63134c3dcf9ce1c3df96184b

Comment by Githook User [ 18/Mar/14 ]

Author:

{u'username': u'jyemin', u'name': u'Jeff Yemin', u'email': u'jeff.yemin@10gen.com'}

Message: JAVA-1148: Fixed deadlock between DefaultServer and MultiServerCluster by removing unnecessary synchronization in DefaultServer
Branch: master
https://github.com/mongodb/mongo-java-driver/commit/9abd39b737c1fe1f21cd78fc59616fba4b5befe2

Comment by Jeffrey Yemin [ 17/Mar/14 ]

Thanks for the report. Are you able to reproduce this consistently?

Generated at Thu Feb 08 08:53:53 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.