avoid allocating direct memory too frequently
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/io/LogWriter.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/io/LogWriter.java index ec0b3c7..8553e8f 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/io/LogWriter.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/io/LogWriter.java
@@ -48,11 +48,21 @@ protected final FileChannel logChannel; protected long size; private final ByteBuffer headerBuffer = ByteBuffer.allocate(Integer.BYTES * 2 + 1); + private final ICompressor compressor = ICompressor.getCompressor(CompressionType.LZ4); + private final ByteBuffer compressedByteBuffer; protected LogWriter(File logFile) throws FileNotFoundException { this.logFile = logFile; this.logStream = new FileOutputStream(logFile, true); this.logChannel = this.logStream.getChannel(); + if (IoTDBDescriptor.getInstance().getConfig().isEnableWALCompression()) { + compressedByteBuffer = + ByteBuffer.allocate( + compressor.getMaxBytesForCompression( + IoTDBDescriptor.getInstance().getConfig().getWalBufferSize())); + } else { + compressedByteBuffer = null; + } } @Override @@ -63,11 +73,9 @@ int uncompressedSize = bufferSize; if (IoTDBDescriptor.getInstance().getConfig().isEnableWALCompression() && bufferSize > 1024 * 512 /* Do not compress buffer that is less than 512KB */) { - ICompressor compressor = ICompressor.getCompressor(CompressionType.LZ4); - ByteBuffer compressedBuffer = - ByteBuffer.allocateDirect(compressor.getMaxBytesForCompression(buffer.limit())); - compressor.compress(buffer, compressedBuffer); - buffer = compressedBuffer; + compressedByteBuffer.clear(); + compressor.compress(buffer, compressedByteBuffer); + buffer = compressedByteBuffer; bufferSize = buffer.position(); buffer.flip(); compressed = true;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/io/WALInputStream.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/io/WALInputStream.java index e6a235c..c622e21 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/io/WALInputStream.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/io/WALInputStream.java
@@ -18,6 +18,7 @@ */ package org.apache.iotdb.db.storageengine.dataregion.wal.io; +import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.tsfile.compress.IUnCompressor; import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType; @@ -37,7 +38,8 @@ private final FileChannel channel; private final ByteBuffer headerBuffer = ByteBuffer.allocate(Integer.BYTES + 1); private final ByteBuffer compressedHeader = ByteBuffer.allocate(Integer.BYTES); - private ByteBuffer dataBuffer = null; + private ByteBuffer dataBuffer = + ByteBuffer.allocate(IoTDBDescriptor.getInstance().getConfig().getWalBufferSize()); public WALInputStream(File logFile) throws IOException { channel = FileChannel.open(logFile.toPath()); @@ -72,13 +74,17 @@ } compressedHeader.flip(); int uncompressedSize = compressedHeader.getInt(); - dataBuffer = ByteBuffer.allocateDirect(uncompressedSize); + if (uncompressedSize > dataBuffer.capacity()) { + // enlarge buffer + dataBuffer = ByteBuffer.allocateDirect(uncompressedSize); + } ByteBuffer compressedData = ByteBuffer.allocateDirect(dataSize); if (channel.read(compressedData) != dataSize) { throw new IOException("Unexpected end of file"); } compressedData.flip(); IUnCompressor unCompressor = IUnCompressor.getUnCompressor(CompressionType.LZ4); + dataBuffer.clear(); unCompressor.uncompress(compressedData, dataBuffer); } else { dataBuffer = ByteBuffer.allocateDirect(dataSize);