HCOLL-283 HCOLL-276 Fixed a bug in with underinitialized key/value serialization builders when the server map is deserialized from file

This commit is contained in:
leventov
2014-12-31 02:01:25 +07:00
parent 0a464731f6
commit 52b8ad86d5
5 changed files with 17 additions and 11 deletions
@@ -1332,6 +1332,11 @@ public final class ChronicleMapBuilder<K, V> implements Cloneable,
(VanillaChronicleMap<K, ?, ?, V, ?, ?>) 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);
}
}
@@ -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);
@@ -1456,6 +1456,8 @@ class StatelessServerConnector<K, V> {
@NotNull
private final VanillaChronicleMap<K, ?, ?, V, ?, ?> map;
private final SerializationBuilder<K> keySerializationBuilder;
private final SerializationBuilder<V> valueSerializationBuilder;
private final int tcpBufferSize;
@@ -1466,6 +1468,8 @@ class StatelessServerConnector<K, V> {
final SerializationBuilder<V> 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<K, V> {
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);
@@ -111,13 +111,10 @@ class VanillaChronicleMap<K, KI, MKI extends MetaBytesInterop<K, ? super KI>,
transient BytesStore ms;
transient long headerSize;
transient Set<Map.Entry<K, V>> entrySet;
transient final SerializationBuilder<K> keyBuilder;
transient final SerializationBuilder<V> valueBuilder;
public VanillaChronicleMap(ChronicleMapBuilder<K, V> builder) throws IOException {
keyBuilder = builder.keyBuilder;
SerializationBuilder<K> keyBuilder = builder.keyBuilder;
kClass = keyBuilder.eClass;
keySizeMarshaller = keyBuilder.sizeMarshaller();
originalKeyReader = keyBuilder.reader();
@@ -129,7 +126,7 @@ class VanillaChronicleMap<K, KI, MKI extends MetaBytesInterop<K, ? super KI>,
originalMetaKeyInterop = (MKI) keyBuilder.metaInterop();
metaKeyInteropProvider = (MetaProvider<K, KI, MKI>) keyBuilder.metaInteropProvider();
valueBuilder = builder.valueBuilder;
SerializationBuilder<V> valueBuilder = builder.valueBuilder;
vClass = valueBuilder.eClass;
if (vClass.getName().endsWith("$$Native")) {
nativeValueClass = vClass;