From 7c4b0ed10be01778d5169b49ffc38c93ec985689 Mon Sep 17 00:00:00 2001 From: leventov Date: Sun, 11 Oct 2015 17:00:32 +0300 Subject: [PATCH] Remove tier bulk alignment (as actually not needed) --- .../hash/impl/VanillaChronicleHash.java | 156 +++++++++--------- .../chronicle/map/ChronicleMapBuilder.java | 2 +- .../chronicle/map/ReplicatedChronicleMap.java | 21 +-- 3 files changed, 90 insertions(+), 89 deletions(-) diff --git a/src/main/java/net/openhft/chronicle/hash/impl/VanillaChronicleHash.java b/src/main/java/net/openhft/chronicle/hash/impl/VanillaChronicleHash.java index 960ba8234..3780f0e3e 100644 --- a/src/main/java/net/openhft/chronicle/hash/impl/VanillaChronicleHash.java +++ b/src/main/java/net/openhft/chronicle/hash/impl/VanillaChronicleHash.java @@ -42,8 +42,6 @@ import java.io.ObjectInputStream; import java.io.Serializable; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; -import java.nio.file.OpenOption; -import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; @@ -52,7 +50,6 @@ import static java.lang.Long.numberOfTrailingZeros; import static java.lang.Math.max; import static net.openhft.chronicle.hash.impl.CompactOffHeapLinearHashTable.*; import static net.openhft.lang.MemoryUnit.*; -import static net.openhft.lang.io.NativeBytes.UNSAFE; public abstract class VanillaChronicleHash, C extends HashEntry, SC extends HashSegmentContext, @@ -120,8 +117,8 @@ public abstract class VanillaChronicleHash(); keyReaderProvider = Provider.of((Class) originalKeyReader.getClass()); keyInteropProvider = Provider.of((Class) originalKeyInterop.getClass()); if (segmentHashLookupEntrySize == 4) { @@ -329,18 +326,24 @@ public abstract class VanillaChronicleHash 0) { + appendBulkData(0, globalMutableState.getAllocatedExtraTierBulks() - 1, + ms, sizeInBytesWithoutTiers()); + } } - - initTierBulks(bytesStore.size()); } public final void createMappedStoreAndSegments(File file) throws IOException { // TODO this method had been moved -- not clear where //OS.warnOnWindows(sizeInBytesWithoutTiers()); + long mapSize = createdOrInMemory ? sizeInBytesWithoutTiers() : expectedFileSize(); createMappedStoreAndSegments(new MappedStore(file, FileChannel.MapMode.READ_WRITE, - // file.length() > sizeInBytesWithoutTiers() means there are some tiered segments - Math.max(sizeInBytesWithoutTiers(), file.length()), - BytesMarshallableSerializer.create())); + mapSize, BytesMarshallableSerializer.create())); + } + + private boolean persisted() { + return ms instanceof MappedStore; } /** @@ -378,23 +381,6 @@ public abstract class VanillaChronicleHash(); - long tierBulkOffset = OS.mapAlign(sizeInBytesWithoutTiers()); - if (byteStoreSize >= tierBulkOffset + tierBulkSizeInBytes) { - assert !createdOrInMemory : "Chronicle Map is allocated in-memory or created " + - "persisted without extra tier bulks"; - TierBulkData firstTierBulkData = new TierBulkData(ms, tierBulkOffset); - tierBulkOffsets.add(firstTierBulkData); - while (true) { - tierBulkOffset += tierBulkSizeInBytes; - if (byteStoreSize < tierBulkOffset + tierBulkSizeInBytes) - break; - tierBulkOffsets.add(new TierBulkData(firstTierBulkData, tierBulkOffset)); - } - } - } - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); initOwnTransients(); @@ -444,9 +430,7 @@ public abstract class VanillaChronicleHash 0) { @@ -620,12 +603,12 @@ public abstract class VanillaChronicleHash> log2NumberOfTiersInBulk); + int bulkIndex = (int) (extraTierIndex >> log2TiersInBulk); if (bulkIndex >= tierBulkOffsets.size()) - mapTiers(bulkIndex); + mapTierBulks(bulkIndex); return tierBulkOffsets.get(bulkIndex).offset + tierBulkInnerOffsetToTiers + - (extraTierIndex & (numberOfTiersInBulk - 1)) * segmentSize; + (extraTierIndex & (tiersInBulk - 1)) * segmentSize; } private TierBulkData tierBulkData(long tierIndexMinusOne) { long extraTierIndex = tierIndexMinusOne - actualSegments; - int bulkIndex = (int) (extraTierIndex >> log2NumberOfTiersInBulk); + int bulkIndex = (int) (extraTierIndex >> log2TiersInBulk); if (bulkIndex >= tierBulkOffsets.size()) - mapTiers(bulkIndex); + mapTierBulks(bulkIndex); return tierBulkOffsets.get(bulkIndex); } private long extraTierIndexToBaseAddr(long tierIndexMinusOne) { long extraTierIndex = tierIndexMinusOne - actualSegments; - int bulkIndex = (int) (extraTierIndex >> log2NumberOfTiersInBulk); + int bulkIndex = (int) (extraTierIndex >> log2TiersInBulk); if (bulkIndex >= tierBulkOffsets.size()) - mapTiers(bulkIndex); + mapTierBulks(bulkIndex); TierBulkData tierBulkData = tierBulkOffsets.get(bulkIndex); - long tierIndexOffsetWithinBulk = extraTierIndex & (numberOfTiersInBulk - 1); + long tierIndexOffsetWithinBulk = extraTierIndex & (tiersInBulk - 1); return tierAddr(tierBulkData, tierIndexOffsetWithinBulk); } @@ -689,45 +672,62 @@ public abstract class VanillaChronicleHash implements (VanillaChronicleMap) m; map.initTransientsFromBuilder(this); map.initBeforeMapping(fis.getChannel()); - map.createMappedStoreAndSegments(file); long expectedFileLength = map.expectedFileSize(); if (expectedFileLength != fileLength) { throw new IOException("The file " + file + " the map is serialized from " + "has unexpected length " + fileLength + ", probably corrupted. " + "Expected length is " + expectedFileLength); } + map.createMappedStoreAndSegments(file); // This is needed to property initialize key and value serialization builders, // which are later used in replication preMapConstruction(); diff --git a/src/main/java/net/openhft/chronicle/map/ReplicatedChronicleMap.java b/src/main/java/net/openhft/chronicle/map/ReplicatedChronicleMap.java index b147d00c6..7d7d7cccc 100644 --- a/src/main/java/net/openhft/chronicle/map/ReplicatedChronicleMap.java +++ b/src/main/java/net/openhft/chronicle/map/ReplicatedChronicleMap.java @@ -172,7 +172,7 @@ public class ReplicatedChronicleMap> log2NumberOfTiersInBulk; + long bulkIndex = tierIndex >> log2TiersInBulk; TierBulkData tierBulkData = tierBulkOffsets.get((int) bulkIndex); long bitSetAddr = tierBulkData.langBytes.address() + tierBulkData.offset + offsetToBitSetWithinATierBulk; @@ -632,7 +633,7 @@ public class ReplicatedChronicleMap> log2NumberOfTiersInBulk; + long bulkIndex = tierIndex >> log2TiersInBulk; TierBulkData tierBulkData = tierBulkOffsets.get((int) bulkIndex); long bitSetAddr = tierBulkData.langBytes.address() + tierBulkData.offset + offsetToBitSetWithinATierBulk; @@ -651,8 +652,8 @@ public class ReplicatedChronicleMap> log2NumberOfTiersInBulk; + long extraTierIndex = tierIndex - actualSegments - 1; + long bulkIndex = extraTierIndex >> log2TiersInBulk; TierBulkData tierBulkData = tierBulkOffsets.get((int) bulkIndex); long bitSetAddr = tierBulkData.langBytes.address() + tierBulkData.offset + offsetToBitSetWithinATierBulk; @@ -746,7 +747,7 @@ public class ReplicatedChronicleMap