Fix a bug in ListMarshaller

This commit is contained in:
leventov
2016-01-12 11:20:44 +03:00
parent 9a0c182612
commit 98be95a4a0
2 changed files with 52 additions and 2 deletions
@@ -84,6 +84,9 @@ public final class ListMarshaller<T>
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);
@@ -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<CharSequence> items) {
public void addKnownItems(ChronicleMap<CharSequence, List<CharSequence>> knownItems,
String id, List<CharSequence> items) {
try (ExternalMapQueryContext<CharSequence, List<CharSequence>, ?> 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<CharSequence> 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<CharSequence, List<CharSequence>> knownItems;
ChronicleMapBuilder<CharSequence, List<CharSequence>> knownItemsBuilder = ChronicleMap
.of(CharSequence.class, (Class<List<CharSequence>>) ((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<CharSequence> 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<CharSequence, List<CharSequence>> 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));
});
}
}