You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by xi...@apache.org on 2022/04/25 08:57:22 UTC

[iotdb] 01/01: fix the issue that FragmentInstance's status cannot be updated to FINISHED in some scenario

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

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

commit c05a6cc536061ddf944dc4af913bda0209f07b2c
Author: Jinrui.Zhang <xi...@gmail.com>
AuthorDate: Mon Apr 25 16:57:08 2022 +0800

    fix the issue that FragmentInstance's status cannot be updated to FINISHED in some scenario
---
 .../main/java/org/apache/iotdb/db/mpp/buffer/SinkHandle.java  | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/buffer/SinkHandle.java b/server/src/main/java/org/apache/iotdb/db/mpp/buffer/SinkHandle.java
index c540103126..3c582efb07 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/buffer/SinkHandle.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/buffer/SinkHandle.java
@@ -202,7 +202,8 @@ public class SinkHandle implements ISinkHandle {
     }
     synchronized (this) {
       closed = true;
-      noMoreTsBlocks = true;
+      // synchronized is reentrant lock, wo we can invoke setNoMoreTsBlocks() here.
+      setNoMoreTsBlocks();
     }
     sinkHandleListener.onClosed(this);
     logger.info("Sink handle {} is closed.", this);
@@ -231,6 +232,14 @@ public class SinkHandle implements ISinkHandle {
   @Override
   public synchronized void setNoMoreTsBlocks() {
     noMoreTsBlocks = true;
+    // In current implementation, the onFinish() is only invoked when receiving the
+    // acknowledge event from SourceHandle. If the acknowledge event happens before
+    // the close(), the onFinish() won't be invoked and the instance's status will
+    // always be FLUSHING. We cannot ensure the sequence of `acknowledge event` and
+    // `close` so we need to do following check every time `noMoreTsBlocks` is updated.
+    if (isFinished()) {
+      sinkHandleListener.onFinish(this);
+    }
   }
 
   @Override