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