You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2022/07/26 02:53:13 UTC

[iotdb] branch master updated: [IOTDB-3938] Avoid performance decline caused by fsync twice (#6769)

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

haonan 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 f4d1323f11 [IOTDB-3938] Avoid performance decline caused by fsync twice (#6769)
f4d1323f11 is described below

commit f4d1323f115cbcb474ad288398a6bf1044c85e46
Author: Alan Choo <43...@users.noreply.github.com>
AuthorDate: Tue Jul 26 10:53:08 2022 +0800

    [IOTDB-3938] Avoid performance decline caused by fsync twice (#6769)
---
 .../org/apache/iotdb/db/wal/buffer/WALBuffer.java  | 44 ++++++++++++----------
 1 file changed, 24 insertions(+), 20 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/wal/buffer/WALBuffer.java b/server/src/main/java/org/apache/iotdb/db/wal/buffer/WALBuffer.java
index 4d4d710eb2..df76bec878 100644
--- a/server/src/main/java/org/apache/iotdb/db/wal/buffer/WALBuffer.java
+++ b/server/src/main/java/org/apache/iotdb/db/wal/buffer/WALBuffer.java
@@ -424,31 +424,13 @@ public class WALBuffer extends AbstractWALBuffer {
         switchSyncingBufferToIdle();
       }
 
-      // force os cache to the storage device
-      if (forceFlag) {
-        try {
-          currentWALFileWriter.force();
-        } catch (IOException e) {
-          logger.error(
-              "Fail to fsync wal node-{}'s log writer, change system mode to read-only.",
-              identifier,
-              e);
-          for (WALFlushListener fsyncListener : info.fsyncListeners) {
-            fsyncListener.fail(e);
-          }
-          config.setReadOnly(true);
-        }
-        // notify all waiting listeners
-        for (WALFlushListener fsyncListener : info.fsyncListeners) {
-          fsyncListener.succeed();
-        }
-      }
-
+      boolean forceSuccess = false;
       // try to roll log writer
       if (info.rollWALFileWriterListener != null
           || (forceFlag && currentWALFileWriter.size() >= config.getWalFileSizeThresholdInByte())) {
         try {
           rollLogWriter(searchIndex, currentWALFileWriter.getWalFileStatus());
+          forceSuccess = true;
           if (info.rollWALFileWriterListener != null) {
             info.rollWALFileWriterListener.succeed();
           }
@@ -462,6 +444,28 @@ public class WALBuffer extends AbstractWALBuffer {
           }
           config.setReadOnly(true);
         }
+      } else if (forceFlag) { // force os cache to the storage device, avoid force twice by judging
+        // after rolling file
+        try {
+          currentWALFileWriter.force();
+          forceSuccess = true;
+        } catch (IOException e) {
+          logger.error(
+              "Fail to fsync wal node-{}'s log writer, change system mode to read-only.",
+              identifier,
+              e);
+          for (WALFlushListener fsyncListener : info.fsyncListeners) {
+            fsyncListener.fail(e);
+          }
+          config.setReadOnly(true);
+        }
+      }
+
+      // notify all waiting listeners
+      if (forceSuccess) {
+        for (WALFlushListener fsyncListener : info.fsyncListeners) {
+          fsyncListener.succeed();
+        }
       }
     }
   }