This is an automated email from the ASF dual-hosted git repository.

rong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new ba25d64aec9 Pipe: fix deadlock caused by 
PipeResourceManagerHolder.<clinit> and PipePeriodicalJobExecutor (#12245)
ba25d64aec9 is described below

commit ba25d64aec97e92b291a0fc7b6af24b1d57ccf93
Author: Steve Yurong Su <[email protected]>
AuthorDate: Wed Mar 27 22:39:51 2024 +0800

    Pipe: fix deadlock caused by PipeResourceManagerHolder.<clinit> and 
PipePeriodicalJobExecutor (#12245)
    
    jstack:
    
    ```
    "pool-69-IoTDB-IoTConsensusRPC-Processor-3" #932 prio=5 os_prio=0 
tid=0x00007faa3000e000 nid=0x1459a9 waiting for monitor entry 
[0x00007faa8c26c000]
       java.lang.Thread.State: BLOCKED (on object monitor)
            at 
org.apache.iotdb.db.pipe.agent.runtime.PipePeriodicalJobExecutor.register(PipePeriodicalJobExecutor.java:63)
            - waiting to lock <0x00000001c0154100> (a 
org.apache.iotdb.db.pipe.agent.runtime.PipePeriodicalJobExecutor)
            at 
org.apache.iotdb.db.pipe.agent.runtime.PipeDataNodeRuntimeAgent.registerPeriodicalJob(PipeDataNodeRuntimeAgent.java:199)
            at 
org.apache.iotdb.db.pipe.resource.memory.PipeMemoryManager.<init>(PipeMemoryManager.java:70)
            at 
org.apache.iotdb.db.pipe.resource.PipeResourceManager.<init>(PipeResourceManager.java:78)
            at 
org.apache.iotdb.db.pipe.resource.PipeResourceManager.<init>(PipeResourceManager.java:34)
            at 
org.apache.iotdb.db.pipe.resource.PipeResourceManager$PipeResourceManagerHolder.<clinit>(PipeResourceManager.java:83)
            at 
org.apache.iotdb.db.pipe.resource.PipeResourceManager.memory(PipeResourceManager.java:65)
            at 
org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALInsertNodeCache.<init>(WALInsertNodeCache.java:81)
            at 
org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALInsertNodeCache.<init>(WALInsertNodeCache.java:57)
            at 
org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALInsertNodeCache$InstanceHolder.lambda$getOrCreateInstance$0(WALInsertNodeCache.java:321)
            at 
org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALInsertNodeCache$InstanceHolder$$Lambda$1533/1966987578.apply(Unknown
 Source)
            at 
java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
            - locked <0x000000022d60c6d8> (a 
java.util.concurrent.ConcurrentHashMap$ReservationNode)
            at 
org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALInsertNodeCache$InstanceHolder.getOrCreateInstance(WALInsertNodeCache.java:321)
            at 
org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALInsertNodeCache.getInstance(WALInsertNodeCache.java:313)
            at 
org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALEntryPosition.setWalNode(WALEntryPosition.java:157)
            at 
org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALEntryHandler.setWalNode(WALEntryHandler.java:185)
            at 
org.apache.iotdb.db.storageengine.dataregion.wal.node.WALNode.log(WALNode.java:150)
            at 
org.apache.iotdb.db.storageengine.dataregion.wal.node.WALNode.log(WALNode.java:130)
            at 
org.apache.iotdb.db.storageengine.dataregion.memtable.TsFileProcessor.insert(TsFileProcessor.java:272)
            at 
org.apache.iotdb.db.storageengine.dataregion.DataRegion.insertToTsFileProcessors(DataRegion.java:1251)
            at 
org.apache.iotdb.db.storageengine.dataregion.DataRegion.insert(DataRegion.java:3295)
            at 
org.apache.iotdb.db.consensus.statemachine.dataregion.DataExecutionVisitor.visitInsertRows(DataExecutionVisitor.java:114)
            at 
org.apache.iotdb.db.consensus.statemachine.dataregion.DataExecutionVisitor.visitInsertRows(DataExecutionVisitor.java:50)
            at 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertRowsNode.accept(InsertRowsNode.java:255)
            at 
org.apache.iotdb.db.consensus.statemachine.dataregion.DataRegionStateMachine.write(DataRegionStateMachine.java:249)
            at 
org.apache.iotdb.db.consensus.statemachine.dataregion.IoTConsensusDataRegionStateMachine.write(IoTConsensusDataRegionStateMachine.java:63)
            at 
org.apache.iotdb.consensus.iot.IoTConsensusServerImpl$SyncLogCacheQueue.cacheAndInsertLatestNode(IoTConsensusServerImpl.java:951)
            at 
org.apache.iotdb.consensus.iot.IoTConsensusServerImpl$SyncLogCacheQueue.access$000(IoTConsensusServerImpl.java:861)
            at 
org.apache.iotdb.consensus.iot.IoTConsensusServerImpl.syncLog(IoTConsensusServerImpl.java:835)
            at 
org.apache.iotdb.consensus.iot.service.IoTConsensusRPCServiceProcessor.syncLogEntries(IoTConsensusRPCServiceProcessor.java:125)
            at 
org.apache.iotdb.consensus.iot.thrift.IoTConsensusIService$AsyncProcessor$syncLogEntries.start(IoTConsensusIService.java:922)
            at 
org.apache.iotdb.consensus.iot.thrift.IoTConsensusIService$AsyncProcessor$syncLogEntries.start(IoTConsensusIService.java:865)
            at 
org.apache.thrift.TBaseAsyncProcessor.process(TBaseAsyncProcessor.java:103)
            at 
org.apache.thrift.server.AbstractNonblockingServer$AsyncFrameBuffer.invoke(AbstractNonblockingServer.java:603)
            at org.apache.thrift.server.Invocation.run(Invocation.java:18)
            at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
            at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
            at java.lang.Thread.run(Thread.java:750)
    
       Locked ownable synchronizers:
            - <0x00000001c283b3e8> (a 
java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync)
            - <0x000000022d389828> (a 
java.util.concurrent.ThreadPoolExecutor$Worker)
            - <0x000000022d38aa28> (a 
java.util.concurrent.locks.ReentrantLock$NonfairSync)
    
    
    
    "pool-2-IoTDB-Pipe-Runtime-Periodical-Job-Executor-1" #131 prio=5 os_prio=0 
tid=0x00007fab0cf33b70 nid=0x14566e in Object.wait() [0x00007fa9eea57000]
       java.lang.Thread.State: RUNNABLE
            at 
org.apache.iotdb.db.pipe.resource.PipeResourceManager.log(PipeResourceManager.java:69)
            at 
org.apache.iotdb.db.pipe.resource.tsfile.PipeTsFileResourceManager.ttlCheck(PipeTsFileResourceManager.java:85)
            at 
org.apache.iotdb.db.pipe.resource.tsfile.PipeTsFileResourceManager.tryTtlCheck(PipeTsFileResourceManager.java:68)
            at 
org.apache.iotdb.db.pipe.resource.tsfile.PipeTsFileResourceManager$$Lambda$1542/1640386138.run(Unknown
 Source)
            at 
org.apache.iotdb.db.pipe.agent.runtime.PipePeriodicalJobExecutor$1.runMayThrow(PipePeriodicalJobExecutor.java:69)
            at 
org.apache.iotdb.commons.concurrent.WrappedRunnable.run(WrappedRunnable.java:30)
            at 
org.apache.iotdb.db.pipe.agent.runtime.PipePeriodicalJobExecutor.execute(PipePeriodicalJobExecutor.java:102)
            - locked <0x00000001c0154100> (a 
org.apache.iotdb.db.pipe.agent.runtime.PipePeriodicalJobExecutor)
            at 
org.apache.iotdb.db.pipe.agent.runtime.PipePeriodicalJobExecutor$$Lambda$454/380394805.run(Unknown
 Source)
            at 
org.apache.iotdb.commons.concurrent.threadpool.ScheduledExecutorUtil.lambda$scheduleWithFixedDelay$1(ScheduledExecutorUtil.java:177)
            at 
org.apache.iotdb.commons.concurrent.threadpool.ScheduledExecutorUtil$$Lambda$314/766681183.run(Unknown
 Source)
            at 
org.apache.iotdb.commons.concurrent.WrappedRunnable$1.runMayThrow(WrappedRunnable.java:45)
            at 
org.apache.iotdb.commons.concurrent.WrappedRunnable.run(WrappedRunnable.java:30)
            at 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
            at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
            at 
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
            at 
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
            at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
            at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
            at java.lang.Thread.run(Thread.java:750)
    
       Locked ownable synchronizers:
            - <0x00000001cb8b51c0> (a 
java.util.concurrent.ThreadPoolExecutor$Worker)
            - <0x000000022d719c18> (a 
java.util.concurrent.locks.ReentrantLock$NonfairSync)
    ```
---
 .../iotdb/db/pipe/agent/runtime/PipePeriodicalJobExecutor.java   | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/agent/runtime/PipePeriodicalJobExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/agent/runtime/PipePeriodicalJobExecutor.java
index f97fb709f7a..725c301d702 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/agent/runtime/PipePeriodicalJobExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/agent/runtime/PipePeriodicalJobExecutor.java
@@ -56,10 +56,9 @@ public class PipePeriodicalJobExecutor {
   private Future<?> executorFuture;
 
   // <Periodical job, Interval in rounds>
-  private static final List<Pair<WrappedRunnable, Long>> periodicalJobs =
-      new CopyOnWriteArrayList<>();
+  private final List<Pair<WrappedRunnable, Long>> periodicalJobs = new 
CopyOnWriteArrayList<>();
 
-  public synchronized void register(String id, Runnable periodicalJob, long 
intervalInSeconds) {
+  public void register(String id, Runnable periodicalJob, long 
intervalInSeconds) {
     periodicalJobs.add(
         new Pair<>(
             new WrappedRunnable() {
@@ -94,7 +93,7 @@ public class PipePeriodicalJobExecutor {
     }
   }
 
-  private synchronized void execute() {
+  private void execute() {
     ++rounds;
 
     for (final Pair<WrappedRunnable, Long> periodicalJob : periodicalJobs) {
@@ -113,7 +112,7 @@ public class PipePeriodicalJobExecutor {
   }
 
   @TestOnly
-  public synchronized void clear() {
+  public void clear() {
     periodicalJobs.clear();
     LOGGER.info("All pipe periodical jobs are cleared successfully.");
   }

Reply via email to