diff --git a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java index d58a16682..d1a3ac3ae 100755 --- a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java +++ b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java @@ -1332,6 +1332,11 @@ public final class ChronicleMapBuilder implements Cloneable, (VanillaChronicleMap) xStream.fromXML(ois); map.headerSize = roundUpMapHeaderSize(fis.getChannel().position()); map.createMappedStoreAndSegments(file); + // This is needed to property initialize key and value serialization builders, + // which are later used in replication + // TODO don't use SerializationBuilders in replication, extract marshallers + // needed to transmit to stateless clients directly from map instance + preMapConstruction(singleHashReplication != null || channel != null); return establishReplication(map, singleHashReplication, channel); } } diff --git a/src/main/java/net/openhft/chronicle/map/Replicators.java b/src/main/java/net/openhft/chronicle/map/Replicators.java index eacc09952..c58dd9590 100644 --- a/src/main/java/net/openhft/chronicle/map/Replicators.java +++ b/src/main/java/net/openhft/chronicle/map/Replicators.java @@ -118,7 +118,8 @@ final class Replicators { TcpTransportAndNetworkConfig tcpConfig = replication.tcpTransportAndNetwork(); - TcpReplicator.StatelessClientParameters statelessClientParameters = new TcpReplicator.StatelessClientParameters( + TcpReplicator.StatelessClientParameters statelessClientParameters = + new TcpReplicator.StatelessClientParameters( (VanillaChronicleMap) chronicleMap, builder.keyBuilder, builder.valueBuilder); diff --git a/src/main/java/net/openhft/chronicle/map/TcpReplicator.java b/src/main/java/net/openhft/chronicle/map/TcpReplicator.java index 18e1c245c..01bfb80aa 100644 --- a/src/main/java/net/openhft/chronicle/map/TcpReplicator.java +++ b/src/main/java/net/openhft/chronicle/map/TcpReplicator.java @@ -1456,6 +1456,8 @@ class StatelessServerConnector { @NotNull private final VanillaChronicleMap map; + private final SerializationBuilder keySerializationBuilder; + private final SerializationBuilder valueSerializationBuilder; private final int tcpBufferSize; @@ -1466,6 +1468,8 @@ class StatelessServerConnector { final SerializationBuilder valueSerializationBuilder) { this.tcpBufferSize = tcpBufferSize; + this.keySerializationBuilder = keySerializationBuilder; + this.valueSerializationBuilder = valueSerializationBuilder; keyReaderWithSize = new ReaderWithSize<>(keySerializationBuilder); keyWriterWithSize = new WriterWithSize<>(keySerializationBuilder, bufferResizer); valueReaderWithSize = new ReaderWithSize<>(valueSerializationBuilder); @@ -1575,10 +1579,10 @@ class StatelessServerConnector { return putMapped(reader, writer, sizeLocation); case KEY_BUILDER: - return writeBuilder(writer, sizeLocation, map.keyBuilder); + return writeBuilder(writer, sizeLocation, keySerializationBuilder); case VALUE_BUILDER: - return writeBuilder(writer, sizeLocation, map.valueBuilder); + return writeBuilder(writer, sizeLocation, valueSerializationBuilder); default: throw new IllegalStateException("unsupported event=" + event); diff --git a/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java b/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java index f5118ab37..a4dc7b882 100755 --- a/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java +++ b/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java @@ -111,13 +111,10 @@ class VanillaChronicleMap, transient BytesStore ms; transient long headerSize; transient Set> entrySet; - transient final SerializationBuilder keyBuilder; - transient final SerializationBuilder valueBuilder; - public VanillaChronicleMap(ChronicleMapBuilder builder) throws IOException { - keyBuilder = builder.keyBuilder; + SerializationBuilder keyBuilder = builder.keyBuilder; kClass = keyBuilder.eClass; keySizeMarshaller = keyBuilder.sizeMarshaller(); originalKeyReader = keyBuilder.reader(); @@ -129,7 +126,7 @@ class VanillaChronicleMap, originalMetaKeyInterop = (MKI) keyBuilder.metaInterop(); metaKeyInteropProvider = (MetaProvider) keyBuilder.metaInteropProvider(); - valueBuilder = builder.valueBuilder; + SerializationBuilder valueBuilder = builder.valueBuilder; vClass = valueBuilder.eClass; if (vClass.getName().endsWith("$$Native")) { nativeValueClass = vClass; diff --git a/src/test/java/net/openhft/chronicle/map/ChronicleMapTest.java b/src/test/java/net/openhft/chronicle/map/ChronicleMapTest.java index f4591ad3f..04fb12c05 100755 --- a/src/test/java/net/openhft/chronicle/map/ChronicleMapTest.java +++ b/src/test/java/net/openhft/chronicle/map/ChronicleMapTest.java @@ -1695,7 +1695,6 @@ public class ChronicleMapTest { } - @Ignore("HCOLL-283 run it twice with the same filename it fails") @Test public void testByteArrayKeySizeBySample() throws IOException { TcpTransportAndNetworkConfig serverConfig = TcpTransportAndNetworkConfig.of(8877) @@ -1703,7 +1702,6 @@ public class ChronicleMapTest { File mapFile = getPersistenceFile(); - // this test only appear to fail when we reuse the mapFile for (int i = 0; i < 2; i++) { @@ -1712,7 +1710,8 @@ public class ChronicleMapTest { .constantKeySizeBySample(new byte[14]) .createPersistedTo(mapFile)) { - try (ChronicleMap map2 = ChronicleMapBuilder.of(byte[].class, byte[][].class) + try (ChronicleMap map2 = ChronicleMapBuilder + .of(byte[].class, byte[][].class) .constantKeySizeBySample(new byte[14]) .statelessClient(new InetSocketAddress("localhost", 8877)) .create()) {