diff --git a/cluster2/src/main/java/io/scalecube/cluster2/payload/PayloadStore.java b/cluster2/src/main/java/io/scalecube/cluster2/payload/PayloadStore.java index 50c7b4ad..d086c382 100644 --- a/cluster2/src/main/java/io/scalecube/cluster2/payload/PayloadStore.java +++ b/cluster2/src/main/java/io/scalecube/cluster2/payload/PayloadStore.java @@ -6,13 +6,14 @@ import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.util.UUID; +import org.agrona.CloseHelper; import org.agrona.DirectBuffer; import org.agrona.collections.Object2ObjectHashMap; -public class PayloadStore { +public class PayloadStore implements AutoCloseable { - private FileChannel storeChannel; - private RandomAccessFile storeFile; + private final RandomAccessFile storeFile; + private final FileChannel storeChannel; private final ByteBuffer dstBuffer = ByteBuffer.allocateDirect(64 * 1024); private final Object2ObjectHashMap payloadIndex = new Object2ObjectHashMap<>(); @@ -40,10 +41,6 @@ public void removeGeneration(UUID memberId) { payloadIndex.remove(memberId); } - public int size() { - return payloadIndex.size(); - } - public boolean putPayload( UUID memberId, int payloadOffset, DirectBuffer chunk, int chunkOffset, int chunkLength) throws IOException { @@ -92,4 +89,13 @@ public ByteBuffer readPayload(UUID memberId) throws IOException { //noinspection RedundantCast return (ByteBuffer) readBuffer.flip(); } + + public int size() { + return payloadIndex.size(); + } + + @Override + public void close() { + CloseHelper.quietCloseAll(storeFile, storeChannel); + } } diff --git a/cluster2/src/test/java/io/scalecube/cluster2/payload/PayloadStoreTest.java b/cluster2/src/test/java/io/scalecube/cluster2/payload/PayloadStoreTest.java index c9dd3126..a0257679 100644 --- a/cluster2/src/test/java/io/scalecube/cluster2/payload/PayloadStoreTest.java +++ b/cluster2/src/test/java/io/scalecube/cluster2/payload/PayloadStoreTest.java @@ -9,18 +9,32 @@ import java.nio.file.Path; import java.util.Random; import java.util.UUID; +import org.agrona.CloseHelper; import org.agrona.concurrent.UnsafeBuffer; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; class PayloadStoreTest { @TempDir private Path tempDir; + private PayloadStore payloadStore; + private File storeFile; + + @BeforeEach + void beforeEach() { + storeFile = tempDir.resolve("" + System.currentTimeMillis()).toFile(); + payloadStore = new PayloadStore(storeFile); + } + + @AfterEach + void afterEach() { + CloseHelper.quietClose(payloadStore); + } @Test void testAddGeneration() throws IOException { - final File storeFile = tempDir.resolve("" + System.currentTimeMillis()).toFile(); - final PayloadStore payloadStore = new PayloadStore(storeFile); final int n = 100; final int payloadLength = 128; @@ -33,8 +47,6 @@ void testAddGeneration() throws IOException { @Test void testRemoveGeneration() throws IOException { - final File storeFile = tempDir.resolve("" + System.currentTimeMillis()).toFile(); - final PayloadStore payloadStore = new PayloadStore(storeFile); final int n = 100; final int payloadLength = 128; @@ -52,9 +64,6 @@ void testRemoveGeneration() throws IOException { @Test void testReadPayload() throws IOException { - final File storeFile = tempDir.resolve("" + System.currentTimeMillis()).toFile(); - final PayloadStore payloadStore = new PayloadStore(storeFile); - final UUID memberId = UUID.randomUUID(); final int payloadLength = 1032; @@ -81,9 +90,6 @@ void testReadPayload() throws IOException { @Test void testPutPayloadPayloadNotFound() throws IOException { - final File storeFile = tempDir.resolve("" + System.currentTimeMillis()).toFile(); - final PayloadStore payloadStore = new PayloadStore(storeFile); - final UUID memberId = UUID.randomUUID(); final int payloadLength = 1032; @@ -101,9 +107,6 @@ void testPutPayloadPayloadNotFound() throws IOException { @Test void testPutPayloadInvalidPayloadOffset() throws IOException { - final File storeFile = tempDir.resolve("" + System.currentTimeMillis()).toFile(); - final PayloadStore payloadStore = new PayloadStore(storeFile); - final UUID memberId = UUID.randomUUID(); final int payloadLength = 1032; @@ -121,9 +124,6 @@ void testPutPayloadInvalidPayloadOffset() throws IOException { @Test void testPutPayloadInvalidChunk() throws IOException { - final File storeFile = tempDir.resolve("" + System.currentTimeMillis()).toFile(); - final PayloadStore payloadStore = new PayloadStore(storeFile); - final UUID memberId = UUID.randomUUID(); final int payloadLength = 1032;