diff --git a/src/main/java/net/openhft/chronicle/hash/serialization/ListMarshaller.java b/src/main/java/net/openhft/chronicle/hash/serialization/ListMarshaller.java index 8c79b134f..10794059a 100644 --- a/src/main/java/net/openhft/chronicle/hash/serialization/ListMarshaller.java +++ b/src/main/java/net/openhft/chronicle/hash/serialization/ListMarshaller.java @@ -84,6 +84,9 @@ public final class ListMarshaller int size = in.readInt(); if (using == null) { using = new ArrayList<>(size); + for (int i = 0; i < size; i++) { + using.add(null); + } } else if (using.size() < size) { while (using.size() < size) { using.add(null); diff --git a/src/test/java/net/openhft/chronicle/map/Issue63Test.java b/src/test/java/net/openhft/chronicle/map/Issue63Test.java index 3e5712288..d151c483d 100644 --- a/src/test/java/net/openhft/chronicle/map/Issue63Test.java +++ b/src/test/java/net/openhft/chronicle/map/Issue63Test.java @@ -21,6 +21,7 @@ import net.openhft.chronicle.hash.serialization.ListMarshaller; import net.openhft.chronicle.hash.serialization.impl.CharSequenceBytesReader; import net.openhft.chronicle.hash.serialization.impl.CharSequenceBytesWriter; import net.openhft.chronicle.set.*; +import org.junit.Assert; import org.junit.Test; import java.io.File; @@ -34,6 +35,7 @@ import java.util.concurrent.ThreadLocalRandom; import static java.util.concurrent.TimeUnit.MINUTES; import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; public class Issue63Test { @@ -162,7 +164,7 @@ public class Issue63Test { for (int j = 0; j < random.nextInt(50, 150); j++) { items.add("average sized known item"); } - addKnownItems(id, items); + addKnownItems(knownItems, id, items); } } @@ -291,7 +293,8 @@ public class Issue63Test { } } - public void addKnownItems(String id, List items) { + public void addKnownItems(ChronicleMap> knownItems, + String id, List items) { try (ExternalMapQueryContext, ?> c = knownItems.queryContext(id)) { if (c.writeLock().tryLock(1, MINUTES)) { @@ -303,4 +306,48 @@ public class Issue63Test { throw new RuntimeException(e); } } + + @Test + public void testKnownItems() throws Exception { + + ArrayList averageKnownItems = new ArrayList<>(); + for (int i = 0; i < 100; i++) { + averageKnownItems.add("average sized known item"); + } + Path knownItemsPath = Paths.get(System.getProperty("java.io.tmpdir") + "/test-vectors.dat"); + Files.deleteIfExists(knownItemsPath); + ChronicleMap> knownItems; + ChronicleMapBuilder> knownItemsBuilder = ChronicleMap + .of(CharSequence.class, (Class>) ((Class) List.class)) + .averageKey("2B6EC73CD63ACA5D93F4D5A710AD9CFE") + .averageValue(averageKnownItems) + .valueMarshaller(new ListMarshaller<>( + CharSequenceBytesReader.INSTANCE, CharSequenceBytesWriter.INSTANCE)) + .entries(20) + .maxBloatFactor(5.0) + .putReturnsNull(true); + + File mapFile = knownItemsPath.toFile(); + mapFile.deleteOnExit(); + knownItems = knownItemsBuilder.createPersistedTo(mapFile); + ArrayList ids = new ArrayList<>(); + for (int i = 0; i < 5; i++) { + String id = UUID.randomUUID().toString(); + ids.add(id); + addKnownItems(knownItems, id, averageKnownItems); + } + knownItems.close(); + + final ChronicleMap> knownItems2 = + knownItemsBuilder.recoverPersistedTo(mapFile, true); + + assertEquals(5, knownItems2.size()); + /* ids.forEach((id) -> { + System.out.println(knownItems2.get(id.subSequence(0, id.length()))); + });*/ + knownItems2.forEach((id, list) -> { + System.out.println(id + " : " + String.join(",", list)); + }); + + } }