diff --git a/src/main/java/net/openhft/chronicle/hash/ChronicleHashBuilder.java b/src/main/java/net/openhft/chronicle/hash/ChronicleHashBuilder.java index 0467f423f..34d92bad1 100755 --- a/src/main/java/net/openhft/chronicle/hash/ChronicleHashBuilder.java +++ b/src/main/java/net/openhft/chronicle/hash/ChronicleHashBuilder.java @@ -326,6 +326,18 @@ public interface ChronicleHashBuilder, */ B removedEntryCleanupTimeout(long removedEntryCleanupTimeout, TimeUnit unit); + /** + * Configures if replicated Chronicle Hashes, constructed by this builder, should + * completely erase entries, removed some time ago. See {@link #removedEntryCleanupTimeout( + * long, TimeUnit)} for more details on this mechanism. + * + *

Default value is {@code true} -- old removed entries are erased with 1 second timeout. + * + * @param cleanupRemovedEntries if stale removed entries should be purged from Chronicle Hash + * @return this builder back + */ + B cleanupRemovedEntries(boolean cleanupRemovedEntries); + /** * Configures a {@link BytesMarshallerFactory} to be used with {@link * BytesMarshallableSerializer}, which is a default {@link #objectSerializer ObjectSerializer}, diff --git a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java index 4cd219c55..dcc181616 100755 --- a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java +++ b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java @@ -164,6 +164,7 @@ public final class ChronicleMapBuilder implements // replication private TimeProvider timeProvider = TimeProvider.SYSTEM; long cleanupTimeout = 1; + private boolean cleanupRemovedEntries = true; TimeUnit cleanupTimeoutUnit = TimeUnit.SECONDS; private BytesMarshallerFactory bytesMarshallerFactory; @@ -1075,6 +1076,12 @@ public final class ChronicleMapBuilder implements return this; } + @Override + public ChronicleMapBuilder cleanupRemovedEntries(boolean cleanupRemovedEntries) { + this.cleanupRemovedEntries = cleanupRemovedEntries; + return this; + } + TimeProvider timeProvider() { return timeProvider; } @@ -1571,7 +1578,8 @@ public final class ChronicleMapBuilder implements throw new AssertionError("Only one non-null replication should be passed"); ReplicatedChronicleMap result = (ReplicatedChronicleMap) map; - establishCleanupThread(result); + if (cleanupRemovedEntries) + establishCleanupThread(result); List replicators = new ArrayList<>(2); if (singleHashReplication != null) { diff --git a/src/main/java/net/openhft/chronicle/set/ChronicleSetBuilder.java b/src/main/java/net/openhft/chronicle/set/ChronicleSetBuilder.java index c4a0622db..ea5c35708 100755 --- a/src/main/java/net/openhft/chronicle/set/ChronicleSetBuilder.java +++ b/src/main/java/net/openhft/chronicle/set/ChronicleSetBuilder.java @@ -197,6 +197,12 @@ public final class ChronicleSetBuilder return this; } + @Override + public ChronicleSetBuilder cleanupRemovedEntries(boolean cleanupRemovedEntries) { + chronicleMapBuilder.cleanupRemovedEntries(cleanupRemovedEntries); + return this; + } + @Override public ChronicleSetBuilder bytesMarshallerFactory( BytesMarshallerFactory bytesMarshallerFactory) { diff --git a/src/test/java/net/openhft/chronicle/map/TimeBasedReplicationTest.java b/src/test/java/net/openhft/chronicle/map/TimeBasedReplicationTest.java index eead7da2e..b29fae41d 100644 --- a/src/test/java/net/openhft/chronicle/map/TimeBasedReplicationTest.java +++ b/src/test/java/net/openhft/chronicle/map/TimeBasedReplicationTest.java @@ -62,12 +62,14 @@ public class TimeBasedReplicationTest extends JSR166TestCase { try (ChronicleMap map = ChronicleMapBuilder.of(CharSequence.class, CharSequence.class) .entries(10) + .cleanupRemovedEntries(false) .timeProvider(timeProvider) .replication((byte) 1, TcpTransportAndNetworkConfig.of(8086)) .create()) { try (ChronicleMap map2 = ChronicleMapBuilder.of(CharSequence.class, CharSequence.class) .entries(10) + .cleanupRemovedEntries(false) .timeProvider(timeProvider) .replication((byte) 2, TcpTransportAndNetworkConfig.of(8087, new InetSocketAddress("localhost", 8086))) @@ -109,6 +111,7 @@ public class TimeBasedReplicationTest extends JSR166TestCase { final TimeProvider timeProvider = Mockito.mock(TimeProvider.class); try (ChronicleMap map = ChronicleMapBuilder.of(CharSequence.class, CharSequence.class) .entries(10) + .cleanupRemovedEntries(false) .timeProvider(timeProvider) .replication((byte) 1) .create()) { @@ -181,12 +184,14 @@ public class TimeBasedReplicationTest extends JSR166TestCase { try (ChronicleMap map = ChronicleMapBuilder.of(CharSequence.class, CharSequence.class) .entries(10) + .cleanupRemovedEntries(false) .timeProvider(timeProvider) .replication((byte) 1, TcpTransportAndNetworkConfig.of(8086)) .create()) { try (ChronicleMap map2 = ChronicleMapBuilder.of(CharSequence.class, CharSequence.class) .entries(10) + .cleanupRemovedEntries(false) .timeProvider(timeProvider) .replication((byte) 2, TcpTransportAndNetworkConfig.of(8087, new InetSocketAddress("localhost", 8086)))