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

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

commit dbb7eac511dfca2e72ffd236c3a659ecefbe8426
Author: JackieTien97 <[email protected]>
AuthorDate: Sun Jan 10 15:46:37 2021 +0800

    change the HeapByteBuffer to DirectByteBuffer in wal
---
 .../org/apache/iotdb/db/writelog/io/LogWriter.java | 38 ++++++++++++++--------
 .../db/writelog/node/ExclusiveWriteLogNode.java    | 12 +++++--
 2 files changed, 34 insertions(+), 16 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/writelog/io/LogWriter.java 
b/server/src/main/java/org/apache/iotdb/db/writelog/io/LogWriter.java
index 16ae427..1b21dfe 100644
--- a/server/src/main/java/org/apache/iotdb/db/writelog/io/LogWriter.java
+++ b/server/src/main/java/org/apache/iotdb/db/writelog/io/LogWriter.java
@@ -18,11 +18,6 @@
  */
 package org.apache.iotdb.db.writelog.io;
 
-import org.apache.iotdb.db.engine.fileSystem.SystemFileFactory;
-import org.apache.iotdb.db.utils.TestOnly;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
@@ -31,6 +26,11 @@ import java.nio.ByteBuffer;
 import java.nio.channels.ClosedChannelException;
 import java.nio.channels.FileChannel;
 import java.util.zip.CRC32;
+import org.apache.iotdb.db.engine.fileSystem.SystemFileFactory;
+import org.apache.iotdb.db.utils.TestOnly;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import sun.nio.ch.DirectBuffer;
 
 /**
  * LogWriter writes the binary logs into a file using FileChannel together 
with check sums of
@@ -43,8 +43,8 @@ public class LogWriter implements ILogWriter {
   private FileOutputStream fileOutputStream;
   private FileChannel channel;
   private final CRC32 checkSummer = new CRC32();
-  private final ByteBuffer lengthBuffer = ByteBuffer.allocate(4);
-  private final ByteBuffer checkSumBuffer = ByteBuffer.allocate(8);
+  private final ByteBuffer lengthBuffer = ByteBuffer.allocateDirect(4);
+  private final ByteBuffer checkSumBuffer = ByteBuffer.allocateDirect(8);
   private final boolean forceEachWrite;
 
   /**
@@ -114,15 +114,25 @@ public class LogWriter implements ILogWriter {
 
   @Override
   public void close() throws IOException {
-    if (channel != null) {
-      if (channel.isOpen()) {
-        channel.force(true);
+    try {
+      if (channel != null) {
+        if (channel.isOpen()) {
+          channel.force(true);
+        }
+        fileOutputStream.close();
+        fileOutputStream = null;
+        channel.close();
+        channel = null;
+      }
+    } finally {
+      if (lengthBuffer.isDirect()) {
+        ((DirectBuffer) lengthBuffer).cleaner().clean();
+      }
+      if (checkSumBuffer.isDirect()) {
+        ((DirectBuffer) checkSumBuffer).cleaner().clean();
       }
-      fileOutputStream.close();
-      fileOutputStream = null;
-      channel.close();
-      channel = null;
     }
+
   }
 
   @Override
diff --git 
a/server/src/main/java/org/apache/iotdb/db/writelog/node/ExclusiveWriteLogNode.java
 
b/server/src/main/java/org/apache/iotdb/db/writelog/node/ExclusiveWriteLogNode.java
index f241db5..de41479 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/writelog/node/ExclusiveWriteLogNode.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/writelog/node/ExclusiveWriteLogNode.java
@@ -42,6 +42,7 @@ import org.apache.iotdb.db.writelog.io.LogWriter;
 import org.apache.iotdb.db.writelog.io.MultiFileLogReader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import sun.nio.ch.DirectBuffer;
 
 /**
  * This WriteLogNode is used to manage insert ahead logs of a TsFile.
@@ -60,9 +61,9 @@ public class ExclusiveWriteLogNode implements WriteLogNode, 
Comparable<Exclusive
   private IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
 
   private ByteBuffer logBufferWorking = ByteBuffer
-      .allocate(IoTDBDescriptor.getInstance().getConfig().getWalBufferSize() / 
2);
+      
.allocateDirect(IoTDBDescriptor.getInstance().getConfig().getWalBufferSize() / 
2);
   private ByteBuffer logBufferIdle = ByteBuffer
-      .allocate(IoTDBDescriptor.getInstance().getConfig().getWalBufferSize() / 
2);
+      
.allocateDirect(IoTDBDescriptor.getInstance().getConfig().getWalBufferSize() / 
2);
   private ByteBuffer logBufferFlushing;
 
   private final Object switchBufferCondition = new Object();
@@ -149,6 +150,13 @@ public class ExclusiveWriteLogNode implements 
WriteLogNode, Comparable<Exclusive
       Thread.currentThread().interrupt();
       logger.warn("Waiting for current buffer being flushed interrupted");
     } finally {
+      logBufferFlushing = null;
+      if (logBufferWorking.isDirect()) {
+        ((DirectBuffer) logBufferWorking).cleaner().clean();
+      }
+      if (logBufferIdle.isDirect()) {
+        ((DirectBuffer) logBufferIdle).cleaner().clean();
+      }
       lock.unlock();
     }
   }

Reply via email to