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(); } }
