You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2015/11/12 14:40:39 UTC
[3/6] ignite git commit: IGNITE-1816: Bug fixing.
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 <vo...@gridgain.com>
Authored: Thu Nov 12 15:31:49 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
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);
}
/**