You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2021/01/10 07:47:12 UTC

[iotdb] 01/01: change the HeapByteBuffer to DirectByteBuffer in wal

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 <Ja...@foxmail.com>
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();
     }
   }