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

jackietien 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 655ed78c9b0 Add fsync for AuthorInfo, ClusterSchemaInfo, TriggerInfo 
and UDFInfo
655ed78c9b0 is described below

commit 655ed78c9b0d0aef3c058ee1e23c65c193ec22cd
Author: Jackie Tien <[email protected]>
AuthorDate: Thu Oct 26 21:39:30 2023 +0800

    Add fsync for AuthorInfo, ClusterSchemaInfo, TriggerInfo and UDFInfo
---
 .../iotdb/confignode/persistence/TriggerInfo.java  |  2 +
 .../iotdb/confignode/persistence/UDFInfo.java      |  3 +
 .../persistence/schema/ClusterSchemaInfo.java      |  9 ++-
 .../persistence/schema/TemplatePreSetTable.java    | 18 +++---
 .../persistence/schema/TemplateTable.java          | 19 ++++---
 .../commons/auth/role/LocalFileRoleAccessor.java   | 47 ++++++++--------
 .../commons/auth/user/LocalFileUserAccessor.java   | 65 +++++++++++-----------
 7 files changed, 94 insertions(+), 69 deletions(-)

diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/TriggerInfo.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/TriggerInfo.java
index 4ad86745de7..85014ba3f16 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/TriggerInfo.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/TriggerInfo.java
@@ -254,6 +254,8 @@ public class TriggerInfo implements SnapshotProcessor {
 
       triggerTable.serializeTriggerTable(fileOutputStream);
 
+      // fsync
+      fileOutputStream.getFD().sync();
       return true;
     } finally {
       releaseTriggerTableLock();
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/UDFInfo.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/UDFInfo.java
index bb121e71df1..5ab8172d742 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/UDFInfo.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/UDFInfo.java
@@ -201,6 +201,9 @@ public class UDFInfo implements SnapshotProcessor {
 
       udfTable.serializeUDFTable(fileOutputStream);
 
+      // fsync
+      fileOutputStream.getFD().sync();
+
       return true;
     } finally {
       releaseUDFTableLock();
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
index caff28f250a..83998bf78b0 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
@@ -609,11 +609,16 @@ public class ClusterSchemaInfo implements 
SnapshotProcessor {
 
     databaseReadWriteLock.readLock().lock();
     try {
-      try (FileOutputStream fileOutputStream = new FileOutputStream(tmpFile);
-          BufferedOutputStream outputStream = new 
BufferedOutputStream(fileOutputStream)) {
+      FileOutputStream fileOutputStream = new FileOutputStream(tmpFile);
+      BufferedOutputStream outputStream = new 
BufferedOutputStream(fileOutputStream);
+      try {
         // Take snapshot for MTree
         mTree.serialize(outputStream);
         outputStream.flush();
+      } finally {
+        outputStream.flush();
+        fileOutputStream.getFD().sync();
+        outputStream.close();
       }
 
       return tmpFile.renameTo(snapshotFile);
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/TemplatePreSetTable.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/TemplatePreSetTable.java
index 2c0a3754efa..ed1e0310572 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/TemplatePreSetTable.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/TemplatePreSetTable.java
@@ -114,13 +114,17 @@ public class TemplatePreSetTable {
       }
       File tmpFile = new File(snapshotFile.getAbsolutePath() + "-" + 
UUID.randomUUID());
 
-      try (FileOutputStream fileOutputStream = new FileOutputStream(tmpFile);
-          BufferedOutputStream outputStream = new 
BufferedOutputStream(fileOutputStream)) {
-        serialize(outputStream);
-        outputStream.flush();
-        fileOutputStream.flush();
-        outputStream.close();
-        fileOutputStream.close();
+      try {
+        FileOutputStream fileOutputStream = new FileOutputStream(tmpFile);
+        BufferedOutputStream outputStream = new 
BufferedOutputStream(fileOutputStream);
+        try {
+          serialize(outputStream);
+        } finally {
+          outputStream.flush();
+          fileOutputStream.getFD().sync();
+          outputStream.close();
+        }
+
         return tmpFile.renameTo(snapshotFile);
       } finally {
         for (int retry = 0; retry < 5; retry++) {
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/TemplateTable.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/TemplateTable.java
index ce6586eca17..0eb00fa3382 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/TemplateTable.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/TemplateTable.java
@@ -221,13 +221,18 @@ public class TemplateTable {
     }
     File tmpFile = new File(snapshotFile.getAbsolutePath() + "-" + 
UUID.randomUUID());
     templateReadWriteLock.writeLock().lock();
-    try (FileOutputStream fileOutputStream = new FileOutputStream(tmpFile);
-        BufferedOutputStream outputStream = new 
BufferedOutputStream(fileOutputStream)) {
-      serialize(outputStream);
-      outputStream.flush();
-      fileOutputStream.flush();
-      outputStream.close();
-      fileOutputStream.close();
+
+    try {
+      FileOutputStream fileOutputStream = new FileOutputStream(tmpFile);
+      BufferedOutputStream outputStream = new 
BufferedOutputStream(fileOutputStream);
+      try {
+        serialize(outputStream);
+      } finally {
+        outputStream.flush();
+        fileOutputStream.getFD().sync();
+        outputStream.close();
+      }
+
       return tmpFile.renameTo(snapshotFile);
     } finally {
       for (int retry = 0; retry < 5; retry++) {
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/role/LocalFileRoleAccessor.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/role/LocalFileRoleAccessor.java
index 930b8ef48e2..8f84e80ba78 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/role/LocalFileRoleAccessor.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/role/LocalFileRoleAccessor.java
@@ -36,6 +36,7 @@ import java.io.BufferedOutputStream;
 import java.io.DataInputStream;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.file.Files;
@@ -149,29 +150,29 @@ public class LocalFileRoleAccessor implements 
IRoleAccessor {
                 + IoTDBConstant.PROFILE_SUFFIX
                 + TEMP_SUFFIX);
     File roleDir = new File(roleDirPath);
-    if (!roleDir.exists()) {
-      if (!roleDir.mkdirs()) {
-        LOGGER.error("Failed to create role dir {}", roleDirPath);
-      }
+    if (!roleDir.exists() && !roleDir.mkdirs()) {
+      LOGGER.error("Failed to create role dir {}", roleDirPath);
     }
-    try (BufferedOutputStream outputStream =
-        new BufferedOutputStream(Files.newOutputStream(roleProfile.toPath()))) 
{
-      try {
-        byte[] strBuffer = role.getName().getBytes(STRING_ENCODING);
-        IOUtils.writeInt(outputStream, -1 * strBuffer.length, 
encodingBufferLocal);
-        outputStream.write(strBuffer);
-        IOUtils.writeInt(outputStream, role.getAllSysPrivileges(), 
encodingBufferLocal);
-        int privilegeNum = role.getPathPrivilegeList().size();
-        for (int i = 0; i < privilegeNum; i++) {
-          PathPrivilege pathPrivilege = role.getPathPrivilegeList().get(i);
-          IOUtils.writePathPrivilege(
-              outputStream, pathPrivilege, STRING_ENCODING, 
encodingBufferLocal);
-        }
-        outputStream.flush();
-      } catch (Exception e) {
-        throw new IOException(e);
+
+    FileOutputStream fileOutputStream = new FileOutputStream(roleProfile);
+    BufferedOutputStream outputStream = new 
BufferedOutputStream(fileOutputStream);
+    try {
+      byte[] strBuffer = role.getName().getBytes(STRING_ENCODING);
+      IOUtils.writeInt(outputStream, -1 * strBuffer.length, 
encodingBufferLocal);
+      outputStream.write(strBuffer);
+      IOUtils.writeInt(outputStream, role.getAllSysPrivileges(), 
encodingBufferLocal);
+      int privilegeNum = role.getPathPrivilegeList().size();
+      for (int i = 0; i < privilegeNum; i++) {
+        PathPrivilege pathPrivilege = role.getPathPrivilegeList().get(i);
+        IOUtils.writePathPrivilege(
+            outputStream, pathPrivilege, STRING_ENCODING, encodingBufferLocal);
       }
+    } catch (Exception e) {
+      throw new IOException(e);
     } finally {
+      outputStream.flush();
+      fileOutputStream.getFD().sync();
+      outputStream.close();
       encodingBufferLocal.remove();
     }
 
@@ -275,8 +276,10 @@ public class LocalFileRoleAccessor implements 
IRoleAccessor {
   @Override
   public void cleanRoleFolder() {
     File[] files = SystemFileFactory.INSTANCE.getFile(roleDirPath).listFiles();
-    for (File file : files) {
-      FileUtils.deleteFileIfExist(file);
+    if (files != null) {
+      for (File file : files) {
+        FileUtils.deleteFileIfExist(file);
+      }
     }
   }
 
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/user/LocalFileUserAccessor.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/user/LocalFileUserAccessor.java
index 3c4f1ee0a4b..acee3beeeb1 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/user/LocalFileUserAccessor.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/auth/user/LocalFileUserAccessor.java
@@ -37,6 +37,7 @@ import java.io.DataInputStream;
 import java.io.EOFException;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.file.Files;
@@ -215,28 +216,29 @@ public class LocalFileUserAccessor implements 
IUserAccessor {
                 + IoTDBConstant.PROFILE_SUFFIX
                 + TEMP_SUFFIX);
 
-    try (BufferedOutputStream outputStream =
-        new BufferedOutputStream(Files.newOutputStream(userProfile.toPath()))) 
{
-      try {
-        // for IOTDB 1.2, the username's length will be stored as a negative 
number.
-        byte[] strBuffer = user.getName().getBytes(STRING_ENCODING);
-        IOUtils.writeInt(outputStream, -1 * strBuffer.length, 
encodingBufferLocal);
-        outputStream.write(strBuffer);
-        IOUtils.writeString(outputStream, user.getPassword(), STRING_ENCODING, 
encodingBufferLocal);
-        IOUtils.writeInt(outputStream, user.getAllSysPrivileges(), 
encodingBufferLocal);
-
-        int privilegeNum = user.getPathPrivilegeList().size();
-        for (int i = 0; i < privilegeNum; i++) {
-          PathPrivilege pathPrivilege = user.getPathPrivilegeList().get(i);
-          IOUtils.writePathPrivilege(
-              outputStream, pathPrivilege, STRING_ENCODING, 
encodingBufferLocal);
-        }
-
-        outputStream.flush();
-      } catch (Exception e) {
-        throw new IOException(e);
+    FileOutputStream fileOutputStream = new FileOutputStream(userProfile);
+    BufferedOutputStream outputStream = new 
BufferedOutputStream(fileOutputStream);
+    try {
+      // for IOTDB 1.2, the username's length will be stored as a negative 
number.
+      byte[] strBuffer = user.getName().getBytes(STRING_ENCODING);
+      IOUtils.writeInt(outputStream, -1 * strBuffer.length, 
encodingBufferLocal);
+      outputStream.write(strBuffer);
+      IOUtils.writeString(outputStream, user.getPassword(), STRING_ENCODING, 
encodingBufferLocal);
+      IOUtils.writeInt(outputStream, user.getAllSysPrivileges(), 
encodingBufferLocal);
+
+      int privilegeNum = user.getPathPrivilegeList().size();
+      for (int i = 0; i < privilegeNum; i++) {
+        PathPrivilege pathPrivilege = user.getPathPrivilegeList().get(i);
+        IOUtils.writePathPrivilege(
+            outputStream, pathPrivilege, STRING_ENCODING, encodingBufferLocal);
       }
+
+    } catch (Exception e) {
+      throw new IOException(e);
     } finally {
+      outputStream.flush();
+      fileOutputStream.getFD().sync();
+      outputStream.close();
       encodingBufferLocal.remove();
     }
 
@@ -248,19 +250,20 @@ public class LocalFileUserAccessor implements 
IUserAccessor {
                 + ROLE_SUFFIX
                 + IoTDBConstant.PROFILE_SUFFIX
                 + TEMP_SUFFIX);
-    try (BufferedOutputStream roleOutputStream =
-        new BufferedOutputStream(Files.newOutputStream(roleProfile.toPath()))) 
{
-      try {
-        int userNum = user.getRoleList().size();
-        for (int i = 0; i < userNum; i++) {
-          IOUtils.writeString(
-              roleOutputStream, user.getRoleList().get(i), STRING_ENCODING, 
encodingBufferLocal);
-        }
-        roleOutputStream.flush();
-      } catch (Exception e) {
-        throw new IOException(e);
+    fileOutputStream = new FileOutputStream(roleProfile);
+    outputStream = new BufferedOutputStream(fileOutputStream);
+    try {
+      int userNum = user.getRoleList().size();
+      for (int i = 0; i < userNum; i++) {
+        IOUtils.writeString(
+            outputStream, user.getRoleList().get(i), STRING_ENCODING, 
encodingBufferLocal);
       }
+    } catch (Exception e) {
+      throw new IOException(e);
     } finally {
+      outputStream.flush();
+      fileOutputStream.getFD().sync();
+      outputStream.close();
       encodingBufferLocal.remove();
     }
 

Reply via email to