From 2b6f416bb83e9391ede189ab3ebd4542b120522c Mon Sep 17 00:00:00 2001 From: Rob Austin Date: Wed, 25 Mar 2020 15:08:04 +0000 Subject: [PATCH] fixed https://github.com/OpenHFT/Chronicle-Map/issues/212 --- .../chronicle/map/ChronicleMapBuilder.java | 6 ++- .../chronicle/map/VanillaChronicleMap.java | 7 +-- .../chronicle/map/BloatFactorTest.java | 48 +++++++++++++++++++ 3 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 src/test/java/net/openhft/chronicle/map/BloatFactorTest.java diff --git a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java index 98b3d004a..e7e7d81b8 100755 --- a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java +++ b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java @@ -204,7 +204,7 @@ public final class ChronicleMapBuilder implements private int maxChunksPerEntry = -1; private int alignment = UNDEFINED_ALIGNMENT_CONFIG; private long entries = -1L; - double maxBloatFactor = 1.0; + private double maxBloatFactor = 1.0; private boolean allowSegmentTiering = true; private double nonTieredSegmentsPercentile = 0.99999; private boolean aligned64BitMemoryOperationsAtomic = OS.is64Bit(); @@ -1338,6 +1338,10 @@ public final class ChronicleMapBuilder implements return this; } + public double maxBloatFactor() { + return maxBloatFactor; + } + @Override public ChronicleMapBuilder allowSegmentTiering(boolean allowSegmentTiering) { this.allowSegmentTiering = allowSegmentTiering; diff --git a/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java b/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java index 1bd4fdfa9..1c33ded38 100755 --- a/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java +++ b/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java @@ -58,7 +58,7 @@ public class VanillaChronicleMap ExternalMapQueryContext> implements AbstractChronicleMap { - private final double maxBloatFactor; + private double maxBloatFactor; public SizeMarshaller valueSizeMarshaller; public SizedReader valueReader; @@ -102,7 +102,7 @@ public class VanillaChronicleMap valueSizeMarshaller = valueBuilder.sizeMarshaller(); valueReader = valueBuilder.reader(); valueDataAccess = valueBuilder.dataAccess(); - maxBloatFactor = builder.maxBloatFactor; + maxBloatFactor = builder.maxBloatFactor(); constantlySizedEntry = builder.constantlySizedEntries(); @@ -131,6 +131,7 @@ public class VanillaChronicleMap alignment = wireIn.read(() -> "alignment").int32(); worstAlignment = wireIn.read(() -> "worstAlignment").int32(); + maxBloatFactor = wireIn.read(() -> "maxBloatFactor").float64(); } @Override @@ -146,13 +147,13 @@ public class VanillaChronicleMap wireOut.write(() -> "alignment").int32(alignment); wireOut.write(() -> "worstAlignment").int32(worstAlignment); + wireOut.write(() -> "maxBloatFactor").float64(maxBloatFactor); } void initTransientsFromBuilder(ChronicleMapBuilder builder) { name = builder.name(); putReturnsNull = builder.putReturnsNull(); removeReturnsNull = builder.removeReturnsNull(); - entryOperations = (MapEntryOperations) builder.entryOperations; methods = (MapMethods) builder.methods; defaultEntryOperationsAndMethods = entryOperations == DefaultSpi.mapEntryOperations() && diff --git a/src/test/java/net/openhft/chronicle/map/BloatFactorTest.java b/src/test/java/net/openhft/chronicle/map/BloatFactorTest.java new file mode 100644 index 000000000..2b434e01b --- /dev/null +++ b/src/test/java/net/openhft/chronicle/map/BloatFactorTest.java @@ -0,0 +1,48 @@ +package net.openhft.chronicle.map; + +import net.openhft.chronicle.core.Jvm; +import net.openhft.chronicle.map.example.StringArrayExample; +import org.junit.Assert; +import org.junit.Test; + +import java.io.File; +import java.io.IOException; + +public class BloatFactorTest { + + private static final int EXPECTED_MAX_BLOAT_FACTOR = 100; + + /** + * test that the bloat factor set, remains after a restart + * + * @throws IOException IOException + */ + @Test + public void bloatFactorTest() throws IOException { + + File cmap = File.createTempFile("chron", "cmap"); + + try (ChronicleMap map = ChronicleMapBuilder + .of(Integer.class, StringArrayExample.CharSequenceArray.class) + .entries(100).maxBloatFactor(EXPECTED_MAX_BLOAT_FACTOR) + .createOrRecoverPersistedTo(cmap)) { + + double maxBloatFactor = Jvm.getValue(map, "maxBloatFactor"); + Assert.assertEquals(EXPECTED_MAX_BLOAT_FACTOR, maxBloatFactor, 0.0); + + } + + // if the file already exists it will reuse the existing settings, set above + + try (ChronicleMap map = ChronicleMapBuilder + .of(Integer.class, StringArrayExample.CharSequenceArray.class) + .createOrRecoverPersistedTo(cmap)) { + + double maxBloatFactor = Jvm.getValue(map, "maxBloatFactor"); + Assert.assertEquals(EXPECTED_MAX_BLOAT_FACTOR, maxBloatFactor,0.0); + + } + + } + +}