Don't free blocks of removed entries in ReplicatedChronicleMap

This commit is contained in:
leventov
2014-12-02 14:56:46 +07:00
parent a5631953d6
commit 622a62f206
2 changed files with 5 additions and 19 deletions
@@ -2031,10 +2031,6 @@ class VanillaChronicleMap<K, KI, MKI extends MetaBytesInterop<K, ? super KI>,
return ret;
}
private void setBlocks(long pos, int blocks) {
freeList.set(pos, pos + blocks);
}
private void updateNextPosToSearchFrom(long allocated, int blocks) {
if ((nextPosToSearchFrom = allocated + blocks) >= entriesPerSegment)
nextPosToSearchFrom = 0L;
@@ -2165,12 +2161,12 @@ class VanillaChronicleMap<K, KI, MKI extends MetaBytesInterop<K, ? super KI>,
// update segment state
if (removeFromMultiMap) {
hashLookup.removePrevPos();
long entrySizeInBytes = entry.positionAddr() + valueSize - entry.startAddr();
free(pos, inBlocks(entrySizeInBytes));
} else {
hashLookup.removePosition(pos);
}
decrementSize();
long entrySizeInBytes = entry.positionAddr() + valueSize - entry.startAddr();
free(pos, inBlocks(entrySizeInBytes));
// remove callbacks
if (!remote)
@@ -2383,9 +2379,6 @@ class VanillaChronicleMap<K, KI, MKI extends MetaBytesInterop<K, ? super KI>,
// But if these blocks will be taken by that time,
// this entry will need to be relocated.
}
} else {
// todo investivate when we are able to avoid this assignment
setBlocks(pos, oldSizeInBlocks);
}
// Common code for all cases
entry.position(valueSizePos);
@@ -2595,11 +2588,11 @@ class VanillaChronicleMap<K, KI, MKI extends MetaBytesInterop<K, ? super KI>,
final long entryEndAddr = entry.positionAddr() + valueSize;
if (removeFromMultiMap) {
segment.hashLookup().remove(segmentHash, pos);
segment.free(pos, segment.inBlocks(entryEndAddr - entry.address()));
} else {
segment.hashLookup().removePosition(pos);
}
segment.decrementSize();
segment.free(pos, segment.inBlocks(entryEndAddr - entry.address()));
// remove callbacks
onRemove(segment, pos);
@@ -1,15 +1,11 @@
package net.openhft.chronicle.map;
import junit.framework.Assert;
import net.openhft.chronicle.hash.replication.TcpTransportAndNetworkConfig;
import net.openhft.lang.io.ByteBufferBytes;
import net.openhft.lang.model.Byteable;
import net.openhft.lang.model.DataValueClasses;
import net.openhft.lang.values.IntValue;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.*;
import java.io.Closeable;
import java.io.IOException;
@@ -92,11 +88,8 @@ public class TcpReplicationSoakTest {
// TODO test this with larger sizes.
@Test(timeout = 20000)
@Ignore("Doesn't work, maps need to check equality.")
public void testSoakTestWithRandomData() throws IOException, InterruptedException {
System.out.print("SoakTesting ");
for (int j = 1; j < 2 * Builder.SIZE; j++) {
if (j % 100 == 0)
@@ -116,7 +109,7 @@ public class TcpReplicationSoakTest {
System.out.println("\nwaiting till equal");
waitTillEqual(1000);
waitTillEqual(10000);
Assert.assertEquals(map1, map2);