IGNITE-1816: Bug fixing.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/bd42b0ec Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/bd42b0ec Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/bd42b0ec Branch: refs/heads/ignite-1816 Commit: bd42b0eccfab58d24f31bca7e8f1cc5499ee2db0 Parents: 6b965c5 Author: vozerov-gridgain <[email protected]> Authored: Thu Nov 12 15:31:49 2015 +0300 Committer: vozerov-gridgain <[email protected]> Committed: Thu Nov 12 15:31:49 2015 +0300 ---------------------------------------------------------------------- .../internal/portable/BinaryWriterExImpl.java | 7 +++ .../portable/PortableClassDescriptor.java | 63 ++++++++++++-------- .../internal/portable/PortableContext.java | 25 -------- .../builder/BinaryObjectBuilderImpl.java | 46 +++++++------- .../GridBinaryObjectBuilderSelfTest.java | 6 +- 5 files changed, 73 insertions(+), 74 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/bd42b0ec/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriterExImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriterExImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriterExImpl.java index 8149355..2a80992 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriterExImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriterExImpl.java @@ -1750,6 +1750,13 @@ public class BinaryWriterExImpl implements BinaryWriter, BinaryRawWriterEx, Obje } /** + * @return Current schema ID. + */ + public int schemaId() { + return schemaId; + } + + /** * @return Current writer's schema. */ public PortableSchema currentSchema() { http://git-wip-us.apache.org/repos/asf/ignite/blob/bd42b0ec/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java index c6c8d34..d2b5327 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java @@ -96,10 +96,13 @@ public class PortableClassDescriptor { private final Method readResolveMtd; /** */ - private final Map<String, Integer> fieldsMeta; + private final Map<String, Integer> stableFieldsMeta; /** Object schemas. Initialized only for serializable classes and contains only 1 entry. */ - private final Collection<PortableSchema> schemas; + private final Collection<PortableSchema> stableSchemas; + + /** Schema registry. */ + private final PortableSchemaRegistry schemaReg; /** */ private final boolean keepDeserialized; @@ -148,8 +151,8 @@ public class PortableClassDescriptor { this.ctx = ctx; this.cls = cls; - this.userType = userType; this.typeId = typeId; + this.userType = userType; this.typeName = typeName; this.affKeyFieldName = affKeyFieldName; this.serializer = serializer; @@ -157,6 +160,8 @@ public class PortableClassDescriptor { this.keepDeserialized = keepDeserialized; this.registered = registered; + schemaReg = ctx.schemaRegistry(typeId); + excluded = MarshallerExclusions.isExcluded(cls); useOptMarshaller = !predefined && initUseOptimizedMarshallerFlag(); @@ -204,8 +209,8 @@ public class PortableClassDescriptor { case EXCLUSION: ctor = null; fields = null; - fieldsMeta = null; - schemas = null; + stableFieldsMeta = null; + stableSchemas = null; break; @@ -213,15 +218,15 @@ public class PortableClassDescriptor { case EXTERNALIZABLE: ctor = constructor(cls); fields = null; - fieldsMeta = null; - schemas = null; + stableFieldsMeta = null; + stableSchemas = null; break; case OBJECT: ctor = constructor(cls); fields = new ArrayList<>(); - fieldsMeta = metaDataEnabled ? new HashMap<String, Integer>() : null; + stableFieldsMeta = metaDataEnabled ? new HashMap<String, Integer>() : null; PortableSchema.Builder schemaBuilder = PortableSchema.Builder.newBuilder(); @@ -252,12 +257,12 @@ public class PortableClassDescriptor { schemaBuilder.addField(fieldId); if (metaDataEnabled) - fieldsMeta.put(name, fieldInfo.fieldMode().typeId()); + stableFieldsMeta.put(name, fieldInfo.fieldMode().typeId()); } } } - schemas = Collections.singleton(schemaBuilder.build()); + stableSchemas = Collections.singleton(schemaBuilder.build()); break; @@ -301,14 +306,14 @@ public class PortableClassDescriptor { * @return Fields meta data. */ Map<String, Integer> fieldsMeta() { - return fieldsMeta; + return stableFieldsMeta; } /** * @return Schemas. */ Collection<PortableSchema> schemas() { - return schemas; + return stableSchemas; } /** @@ -563,24 +568,30 @@ public class PortableClassDescriptor { ((Binarylizable)obj).writeBinary(writer); writer.postWrite(userType); - } - finally { - writer.popSchema(); - } - if (obj.getClass() != BinaryMetadata.class - && ctx.isMetaDataChanged(typeId, writer.metaDataHashSum())) { - BinaryMetadataCollector collector = new BinaryMetadataCollector(typeId, typeName, idMapper); + // Check whether we need to update metadata. + if (obj.getClass() != BinaryMetadata.class) { + int schemaId = writer.schemaId(); - if (serializer != null) - serializer.writeBinary(obj, collector); - else - ((Binarylizable)obj).writeBinary(collector); + if (schemaReg.schema(schemaId) == null) { + // This is new schema, let's update metadata. + BinaryMetadataCollector collector = + new BinaryMetadataCollector(typeId, typeName, idMapper); - BinaryMetadata meta = new BinaryMetadata(typeId, typeName, collector.meta(), affKeyFieldName, - collector.schemas()); + if (serializer != null) + serializer.writeBinary(obj, collector); + else + ((Binarylizable)obj).writeBinary(collector); - ctx.updateMetadata(typeId, meta); + BinaryMetadata meta = new BinaryMetadata(typeId, typeName, collector.meta(), + affKeyFieldName, collector.schemas()); + + ctx.updateMetadata(typeId, meta); + } + } + } + finally { + writer.popSchema(); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/bd42b0ec/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java index 89c8339..18509f4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java @@ -61,7 +61,6 @@ import org.apache.ignite.binary.BinarySerializer; import org.apache.ignite.internal.IgniteKernal; import org.apache.ignite.internal.IgnitionEx; import org.apache.ignite.internal.processors.cache.portable.CacheObjectBinaryProcessorImpl; -import org.apache.ignite.internal.util.GridConcurrentHashSet; import org.apache.ignite.internal.util.IgniteUtils; import org.apache.ignite.internal.util.lang.GridMapEntry; import org.apache.ignite.internal.util.typedef.F; @@ -107,9 +106,6 @@ public class PortableContext implements Externalizable { } /** */ - private final ConcurrentMap<Integer, Collection<Integer>> metaDataCache = new ConcurrentHashMap8<>(); - - /** */ private final ConcurrentMap<Class<?>, PortableClassDescriptor> descByCls = new ConcurrentHashMap8<>(); /** Holds classes loaded by default class loader only. */ @@ -831,27 +827,6 @@ public class PortableContext implements Externalizable { /** * @param typeId Type ID. - * @param metaHashSum Meta data hash sum. - * @return Whether meta is changed. - */ - boolean isMetaDataChanged(int typeId, @Nullable Integer metaHashSum) { - if (metaHashSum == null) - return false; - - Collection<Integer> hist = metaDataCache.get(typeId); - - if (hist == null) { - Collection<Integer> old = metaDataCache.putIfAbsent(typeId, hist = new GridConcurrentHashSet<>()); - - if (old != null) - hist = old; - } - - return hist.add(metaHashSum); - } - - /** - * @param typeId Type ID. * @param meta Meta data. * @throws BinaryObjectException In case of error. */ http://git-wip-us.apache.org/repos/asf/ignite/blob/bd42b0ec/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/BinaryObjectBuilderImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/BinaryObjectBuilderImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/BinaryObjectBuilderImpl.java index 330235a..eeafe3b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/BinaryObjectBuilderImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/BinaryObjectBuilderImpl.java @@ -289,11 +289,11 @@ public class BinaryObjectBuilderImpl implements BinaryObjectBuilder { } } - if (assignedVals != null && (remainsFlds == null || !remainsFlds.isEmpty())) { - BinaryType metadata = ctx.metaData(typeId); + BinaryType meta = ctx.metaData(typeId); - Map<String, Integer> newFldsMetadata = null; + Map<String, Integer> fieldsMeta = null; + if (assignedVals != null && (remainsFlds == null || !remainsFlds.isEmpty())) { for (Map.Entry<String, Object> entry : assignedVals.entrySet()) { Object val = entry.getValue(); @@ -311,7 +311,7 @@ public class BinaryObjectBuilderImpl implements BinaryObjectBuilder { serializer.writeValue(writer, val); - String oldFldTypeName = metadata == null ? null : metadata.fieldTypeName(name); + String oldFldTypeName = meta == null ? null : meta.fieldTypeName(name); int newFldTypeId; @@ -324,11 +324,10 @@ public class BinaryObjectBuilderImpl implements BinaryObjectBuilder { if (oldFldTypeName == null) { // It's a new field, we have to add it to metadata. + if (fieldsMeta == null) + fieldsMeta = new HashMap<>(); - if (newFldsMetadata == null) - newFldsMetadata = new HashMap<>(); - - newFldsMetadata.put(name, PortableUtils.fieldTypeId(newFldTypeName)); + fieldsMeta.put(name, PortableUtils.fieldTypeId(newFldTypeName)); } else { String objTypeName = PortableUtils.fieldTypeName(GridPortableMarshaller.OBJ); @@ -336,7 +335,7 @@ public class BinaryObjectBuilderImpl implements BinaryObjectBuilder { if (!objTypeName.equals(oldFldTypeName) && !oldFldTypeName.equals(newFldTypeName)) { throw new BinaryObjectException( "Wrong value has been set [" + - "typeName=" + (typeName == null ? metadata.typeName() : typeName) + + "typeName=" + (typeName == null ? meta.typeName() : typeName) + ", fieldName=" + name + ", fieldType=" + oldFldTypeName + ", assignedValueType=" + newFldTypeName + ']' @@ -344,19 +343,6 @@ public class BinaryObjectBuilderImpl implements BinaryObjectBuilder { } } } - - if (newFldsMetadata != null) { - String typeName = this.typeName; - - if (typeName == null) { - assert metadata != null; - - typeName = metadata.typeName(); - } - - ctx.updateMetadata(typeId, new BinaryMetadata(typeId, typeName, newFldsMetadata, - ctx.affinityKeyFieldName(typeId), Collections.singleton(writer.currentSchema()))); - } } if (reader != null) { @@ -375,6 +361,22 @@ public class BinaryObjectBuilderImpl implements BinaryObjectBuilder { } writer.postWrite(true); + + // Update metadata if needed. + int schemaId = writer.schemaId(); + + if (ctx.schemaRegistry(typeId).schema(schemaId) == null) { + String typeName = this.typeName; + + if (typeName == null) { + assert meta != null; + + typeName = meta.typeName(); + } + + ctx.updateMetadata(typeId, new BinaryMetadata(typeId, typeName, fieldsMeta, + ctx.affinityKeyFieldName(typeId), Collections.singleton(writer.currentSchema()))); + } } finally { writer.popSchema(); http://git-wip-us.apache.org/repos/asf/ignite/blob/bd42b0ec/modules/core/src/test/java/org/apache/ignite/internal/portable/GridBinaryObjectBuilderSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/portable/GridBinaryObjectBuilderSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/portable/GridBinaryObjectBuilderSelfTest.java index a74315b..08bf905 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/portable/GridBinaryObjectBuilderSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/portable/GridBinaryObjectBuilderSelfTest.java @@ -914,7 +914,11 @@ public class GridBinaryObjectBuilderSelfTest extends GridCommonAbstractTest { builder.removeField("str"); - assertNull(builder.build().<TestObjectAllTypes>deserialize().str); + BinaryObject binary = builder.build(); + + TestObjectAllTypes deserialzied = binary.deserialize(); + + assertNull(deserialzied.str); } /**
