[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16160638#comment-16160638 ] ASF GitHub Bot commented on CASSANDRA-13652: Github user Fuud closed the pull request at: https://github.com/apache/cassandra/pull/129 > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > Fix For: 3.11.1, 4.0 > > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at > com.ringcentral.concurrent.executors.MonitoredThreadPoolExecutor$MdcAwareRunnable.run(MonitoredThreadPoolExecutor.java:114) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > "COMMIT-LOG-ALLOCATOR:1" id=80 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager$1.runMayThrow(AbstractCommitLogSegmentManager.java:128) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > {code} > Solution is to use Semaphore instead of low-level LockSupport. -- This message was sent by Atlassian JIRA (v6.4.14#64029) - To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail:
[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16160637#comment-16160637 ] ASF GitHub Bot commented on CASSANDRA-13652: Github user Fuud commented on the issue: https://github.com/apache/cassandra/pull/129 eb717f1 has been merged and CASSANDRA-13652 is closed. > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > Fix For: 3.11.1, 4.0 > > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at > com.ringcentral.concurrent.executors.MonitoredThreadPoolExecutor$MdcAwareRunnable.run(MonitoredThreadPoolExecutor.java:114) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > "COMMIT-LOG-ALLOCATOR:1" id=80 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager$1.runMayThrow(AbstractCommitLogSegmentManager.java:128) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > {code} > Solution is to use Semaphore instead of low-level LockSupport. -- This message was sent by Atlassian JIRA (v6.4.14#64029) - To unsubscribe, e-mail:
[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16148413#comment-16148413 ] ASF GitHub Bot commented on CASSANDRA-13652: Github user Fuud commented on the issue: https://github.com/apache/cassandra/pull/127 @jeffjirsa Sorry, my fault. > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > Fix For: 3.11.1, 4.0 > > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at > com.ringcentral.concurrent.executors.MonitoredThreadPoolExecutor$MdcAwareRunnable.run(MonitoredThreadPoolExecutor.java:114) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > "COMMIT-LOG-ALLOCATOR:1" id=80 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager$1.runMayThrow(AbstractCommitLogSegmentManager.java:128) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > {code} > Solution is to use Semaphore instead of low-level LockSupport. -- This message was sent by Atlassian JIRA (v6.4.14#64029) - To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For
[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16148414#comment-16148414 ] ASF GitHub Bot commented on CASSANDRA-13652: Github user Fuud closed the pull request at: https://github.com/apache/cassandra/pull/127 > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > Fix For: 3.11.1, 4.0 > > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at > com.ringcentral.concurrent.executors.MonitoredThreadPoolExecutor$MdcAwareRunnable.run(MonitoredThreadPoolExecutor.java:114) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > "COMMIT-LOG-ALLOCATOR:1" id=80 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager$1.runMayThrow(AbstractCommitLogSegmentManager.java:128) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > {code} > Solution is to use Semaphore instead of low-level LockSupport. -- This message was sent by Atlassian JIRA (v6.4.14#64029) - To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail:
[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16146653#comment-16146653 ] ASF GitHub Bot commented on CASSANDRA-13652: Github user jeffjirsa commented on the issue: https://github.com/apache/cassandra/pull/127 Hi @Fuud - eb717f154bd24453273d7175006fdef75e5724c2 has been merged and CASSANDRA-13652 is closed. Is this PR still needed? If not, can you close it (the committers are unable to close it on your behalf)? > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > Fix For: 3.11.1, 4.0 > > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at > com.ringcentral.concurrent.executors.MonitoredThreadPoolExecutor$MdcAwareRunnable.run(MonitoredThreadPoolExecutor.java:114) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > "COMMIT-LOG-ALLOCATOR:1" id=80 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager$1.runMayThrow(AbstractCommitLogSegmentManager.java:128) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > {code} > Solution is to use Semaphore instead of low-level LockSupport. -- This
[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16089481#comment-16089481 ] Branimir Lambov commented on CASSANDRA-13652: - This looks good to me. > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at > com.ringcentral.concurrent.executors.MonitoredThreadPoolExecutor$MdcAwareRunnable.run(MonitoredThreadPoolExecutor.java:114) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > "COMMIT-LOG-ALLOCATOR:1" id=80 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager$1.runMayThrow(AbstractCommitLogSegmentManager.java:128) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > {code} > Solution is to use Semaphore instead of low-level LockSupport. -- This message was sent by Atlassian JIRA (v6.4.14#64029) - To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org
[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16087047#comment-16087047 ] Fuud commented on CASSANDRA-13652: -- Yes. Seems good. > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at > com.ringcentral.concurrent.executors.MonitoredThreadPoolExecutor$MdcAwareRunnable.run(MonitoredThreadPoolExecutor.java:114) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > "COMMIT-LOG-ALLOCATOR:1" id=80 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager$1.runMayThrow(AbstractCommitLogSegmentManager.java:128) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > {code} > Solution is to use Semaphore instead of low-level LockSupport. -- This message was sent by Atlassian JIRA (v6.4.14#64029) - To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org
[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16086190#comment-16086190 ] Ariel Weisberg commented on CASSANDRA-13652: OK, how about this? [3.11 code|https://github.com/apache/cassandra/compare/trunk...aweisberg:13652-3.11?expand=1], [utests|https://circleci.com/gh/aweisberg/cassandra/335], [dtests|https://builds.apache.org/view/A-D/view/Cassandra/job/Cassandra-devbranch-dtest/124/] [~Fuud] are you ok with me rewriting your patch this way? > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at > com.ringcentral.concurrent.executors.MonitoredThreadPoolExecutor$MdcAwareRunnable.run(MonitoredThreadPoolExecutor.java:114) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > "COMMIT-LOG-ALLOCATOR:1" id=80 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager$1.runMayThrow(AbstractCommitLogSegmentManager.java:128) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > {code} > Solution is to use Semaphore instead of low-level LockSupport. -- This message was sent by
[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16084526#comment-16084526 ] Ariel Weisberg commented on CASSANDRA-13652: WaitQueue seems even more obtuse? It's just a condition variable we are looking for so why not ReentrantLock and Condition or synchronized and wait/notify? I mean I am fine with it. People working on Cassandra need to learn how WaitQueue works at some point. It just seems like a performance optimization to avoid locking. > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at > com.ringcentral.concurrent.executors.MonitoredThreadPoolExecutor$MdcAwareRunnable.run(MonitoredThreadPoolExecutor.java:114) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > "COMMIT-LOG-ALLOCATOR:1" id=80 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager$1.runMayThrow(AbstractCommitLogSegmentManager.java:128) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > {code} > Solution is to use Semaphore instead of low-level LockSupport. -- This message was sent by
[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16083849#comment-16083849 ] Branimir Lambov commented on CASSANDRA-13652: - The reason to prefer {{park}} for me is understandability of the code. This is a loop that does some work and pauses when there's no need to do any, a perfect candidate for park/unpark. {{Semaphore}}, although applicable, implies something else. Our {{WaitQueue}} is a better alternative for this kind of application. > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at > com.ringcentral.concurrent.executors.MonitoredThreadPoolExecutor$MdcAwareRunnable.run(MonitoredThreadPoolExecutor.java:114) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > "COMMIT-LOG-ALLOCATOR:1" id=80 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager$1.runMayThrow(AbstractCommitLogSegmentManager.java:128) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > {code} > Solution is to use Semaphore instead of low-level LockSupport. -- This message was sent by Atlassian
[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16083702#comment-16083702 ] Branimir Lambov commented on CASSANDRA-13652: - bq. Yes. But such other useages will eat permit and Manager Thread will be blocked in our code. This is only relevant if the eating happens before checking we need to park and actually calling {{LockSupport.park()}}. This is indeed possible for the line 130 call, which is why it should be removed and the control allowed to continue to the checked park on line 146. > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at > com.ringcentral.concurrent.executors.MonitoredThreadPoolExecutor$MdcAwareRunnable.run(MonitoredThreadPoolExecutor.java:114) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > "COMMIT-LOG-ALLOCATOR:1" id=80 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager$1.runMayThrow(AbstractCommitLogSegmentManager.java:128) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > {code} > Solution is to use Semaphore instead of low-level
[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16083705#comment-16083705 ] Ariel Weisberg commented on CASSANDRA-13652: Most usages of LockSupport don't introduce (as many) spurious unparks because they check to see of the thread is blocked on the specific condition not just any condition. I want to use a Semaphore so we don't introduce spurious unparks and trigger bugs in other usages of LockSupport.park. I don't see a huge advantage to working with LockSupport directly. Yes either way blocking without checking the condition at line 130 has to go. > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at > com.ringcentral.concurrent.executors.MonitoredThreadPoolExecutor$MdcAwareRunnable.run(MonitoredThreadPoolExecutor.java:114) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > "COMMIT-LOG-ALLOCATOR:1" id=80 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager$1.runMayThrow(AbstractCommitLogSegmentManager.java:128) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745)
[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16083616#comment-16083616 ] Fuud commented on CASSANDRA-13652: -- [~aweisberg] >>It's technically ok if other usages of park are woken because spurious >>wakeups are part of the specification so other usages should handle it. Yes. But such other useages will eat permit and Manager Thread will be blocked in our code. > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at > com.ringcentral.concurrent.executors.MonitoredThreadPoolExecutor$MdcAwareRunnable.run(MonitoredThreadPoolExecutor.java:114) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > "COMMIT-LOG-ALLOCATOR:1" id=80 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager$1.runMayThrow(AbstractCommitLogSegmentManager.java:128) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > {code} > Solution is to use Semaphore instead of low-level LockSupport. -- This message was sent by Atlassian JIRA (v6.4.14#64029)
[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16082776#comment-16082776 ] Ariel Weisberg commented on CASSANDRA-13652: Although TBH thinking on it why tempt fate with LockSupport.unpark without checking the thread is actually blocked on what we think it is? Let's go with the semaphore and drop the wait at line 130. > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at > com.ringcentral.concurrent.executors.MonitoredThreadPoolExecutor$MdcAwareRunnable.run(MonitoredThreadPoolExecutor.java:114) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > "COMMIT-LOG-ALLOCATOR:1" id=80 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager$1.runMayThrow(AbstractCommitLogSegmentManager.java:128) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > {code} > Solution is to use Semaphore instead of low-level LockSupport. -- This message was sent by Atlassian JIRA (v6.4.14#64029) - To unsubscribe, e-mail:
[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16082752#comment-16082752 ] Ariel Weisberg commented on CASSANDRA-13652: Ah you are right it's the lack of the condition check that causes the problem. I think LockSupport park/unpark is fine it's just a thread specific semaphore bounded to a single permit. It's technically ok if other usages of park are woken because spurious wakeups are part of the specification so other usages should handle it. > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at > com.ringcentral.concurrent.executors.MonitoredThreadPoolExecutor$MdcAwareRunnable.run(MonitoredThreadPoolExecutor.java:114) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > "COMMIT-LOG-ALLOCATOR:1" id=80 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager$1.runMayThrow(AbstractCommitLogSegmentManager.java:128) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > {code} > Solution is to use Semaphore instead of low-level LockSupport. -- This message was sent by
[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16082713#comment-16082713 ] Branimir Lambov commented on CASSANDRA-13652: - The {{park}} call at [line 130|https://github.com/apache/cassandra/pull/127/files#diff-85e13493c70723764c539dd222455979L130] is indeed suspect, as it does not check there's no action to perform before parking. I would solve the problem by dropping that call, which would make the usage of park/unpark conform to the specifications. > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at > com.ringcentral.concurrent.executors.MonitoredThreadPoolExecutor$MdcAwareRunnable.run(MonitoredThreadPoolExecutor.java:114) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > "COMMIT-LOG-ALLOCATOR:1" id=80 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager$1.runMayThrow(AbstractCommitLogSegmentManager.java:128) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > {code} > Solution is to use Semaphore instead of low-level LockSupport. -- This message was sent
[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16081873#comment-16081873 ] Fuud commented on CASSANDRA-13652: -- Just to keep all things together, copy from mailing list http://www.mail-archive.com/dev@cassandra.apache.org/msg11313.html - Hello, I found possible deadlock in AbstractCommitLogSegmentManager. The root cause is incorrect use of LockSupport.park/unpark pair. Unpark should be invoked only if caller is sure that thread was parked in appropriate place. Otherwice permission given by calling unpark can be consumed by other structures (for example - inside ReadWriteLock). Jira: https://issues.apache.org/jira/browse/CASSANDRA-13652 I suggest simplest solution: change LockSupport to Semaphore. PR: https://github.com/apache/cassandra/pull/127 Also I suggest another solution with SynchronousQueue-like structure to move available segment from Manager Thread to consumers. With theese changes code became more clear and straightforward. PR https://github.com/apache/cassandra/pull/129 We can not use j.u.c.SynchronousQueue because we need to support shutdown and there is only way to terminate SynchronousQueue.put is to call Thread.interrupt(). But C* uses nio and it does not expect ClosedByInterruptException during IO operations. Thus we can not interrupt Manager Thread. I implemented o.a.c.u.c.Transferer that supports shutdown and restart (needed for tests). https://github.com/Fuud/cassandra/blob/e1a695874dc24e532ae21ef627e852bf999a75f3/src/java/org/apache/cassandra/utils/concurrent/Transferer.java Also I modified o.a.c.d.c.SimpleCachedBufferPool to support waiting for free space. Please feel free to ask any questions. Thank you. Feodor Bobin fuudtorrent...@gmail.com > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at >
[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16080726#comment-16080726 ] Ariel Weisberg commented on CASSANDRA-13652: I thought that LockSupport was kind of low level when I first saw that, but I didn't want to bike shed. TIL. It was using a semaphore before, and I don't remember why we switched. I approve of the change I just want to make sure [~blambov] didn't have a specific reason for making the switch. > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at > com.ringcentral.concurrent.executors.MonitoredThreadPoolExecutor$MdcAwareRunnable.run(MonitoredThreadPoolExecutor.java:114) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > "COMMIT-LOG-ALLOCATOR:1" id=80 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager$1.runMayThrow(AbstractCommitLogSegmentManager.java:128) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > {code} > Solution is to use Semaphore instead of low-level LockSupport. -- This message was sent by Atlassian JIRA (v6.4.14#64029)
[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16080611#comment-16080611 ] Jeff Jirsa commented on CASSANDRA-13652: Anyone familiar with this code ( git history suggests maybe [~aweisberg] or [~blambov] ) interested in reviewing? > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at > com.ringcentral.concurrent.executors.MonitoredThreadPoolExecutor$MdcAwareRunnable.run(MonitoredThreadPoolExecutor.java:114) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > "COMMIT-LOG-ALLOCATOR:1" id=80 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager$1.runMayThrow(AbstractCommitLogSegmentManager.java:128) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > {code} > Solution is to use Semaphore instead of low-level LockSupport. -- This message was sent by Atlassian JIRA (v6.4.14#64029) - To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail:
[jira] [Commented] (CASSANDRA-13652) Deadlock in AbstractCommitLogSegmentManager
[ https://issues.apache.org/jira/browse/CASSANDRA-13652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=16077630#comment-16077630 ] ASF GitHub Bot commented on CASSANDRA-13652: GitHub user Fuud opened a pull request: https://github.com/apache/cassandra/pull/129 CASSANDRA-13652: Deadlock in AbstractCompactionManager PR with same result as #127. Instead of small fix in #127 this PR contains refactoring to make AbstractCommitLogSegmentManager code more clear. You can merge this pull request into a Git repository by running: $ git pull https://github.com/Fuud/cassandra commitlog_deadlock_v2 Alternatively you can review and apply these changes as the patch at: https://github.com/apache/cassandra/pull/129.patch To close this pull request, make a commit to your master/trunk branch with (at least) the following in the commit message: This closes #129 commit e1a695874dc24e532ae21ef627e852bf999a75f3 Author: Fedor BobinDate: 2017-07-07T05:37:22Z CASSANDRA-13652: Deadlock in AbstractCompactionManager > Deadlock in AbstractCommitLogSegmentManager > --- > > Key: CASSANDRA-13652 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13652 > Project: Cassandra > Issue Type: Bug > Components: Core >Reporter: Fuud > > AbstractCommitLogManager uses LockSupport.(un)park incorreclty. It invokes > unpark without checking if manager thread was parked in approriate place. > For example, logging frameworks uses queues and queues uses ReadWriteLock's > that uses LockSupport. Therefore AbstractCommitLogManager.wakeManager can > wake thread inside Lock and manager thread will sleep forever at park() > method (because unpark permit was already consumed inside lock). > For examle stack traces: > {code} > "MigrationStage:1" id=412 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at > org.apache.cassandra.utils.concurrent.WaitQueue$AbstractSignal.awaitUninterruptibly(WaitQueue.java:279) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.awaitAvailableSegment(AbstractCommitLogSegmentManager.java:263) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.advanceAllocatingFrom(AbstractCommitLogSegmentManager.java:237) > at > org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.forceRecycleAll(AbstractCommitLogSegmentManager.java:279) > at > org.apache.cassandra.db.commitlog.CommitLog.forceRecycleAllSegments(CommitLog.java:210) > at org.apache.cassandra.config.Schema.dropView(Schema.java:708) > at > org.apache.cassandra.schema.SchemaKeyspace.lambda$updateKeyspace$23(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace$$Lambda$382/1123232162.accept(Unknown > Source) > at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) > at > java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) > at > org.apache.cassandra.schema.SchemaKeyspace.updateKeyspace(SchemaKeyspace.java:1361) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchema(SchemaKeyspace.java:1332) > at > org.apache.cassandra.schema.SchemaKeyspace.mergeSchemaAndAnnounceVersion(SchemaKeyspace.java:1282) > - locked java.lang.Class@cc38904 > at > org.apache.cassandra.db.DefinitionsUpdateVerbHandler$1.runMayThrow(DefinitionsUpdateVerbHandler.java:51) > at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor$LocalSessionWrapper.run(DebuggableThreadPoolExecutor.java:322) > at > com.ringcentral.concurrent.executors.MonitoredRunnable.run(MonitoredRunnable.java:36) > at MON_R_MigrationStage.run(NamedRunnableFactory.java:67) > at > com.ringcentral.concurrent.executors.MonitoredThreadPoolExecutor$MdcAwareRunnable.run(MonitoredThreadPoolExecutor.java:114) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:79) > at > org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$61/179045.run(Unknown > Source) > at java.lang.Thread.run(Thread.java:745) > "COMMIT-LOG-ALLOCATOR:1" id=80 state=WAITING > at sun.misc.Unsafe.park(Native Method) > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) > at >