You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2016/09/07 09:25:34 UTC
[06/28] ignite git commit: IGNITE-3829: Optimized affinity key field
name handling.
IGNITE-3829: Optimized affinity key field name handling.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/e3c4868d
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/e3c4868d
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/e3c4868d
Branch: refs/heads/ignite-1.6.7-test
Commit: e3c4868d6737e5a0f0b90f99666242865add750c
Parents: 7bb961f
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Fri Sep 2 18:23:09 2016 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Fri Sep 2 18:23:09 2016 +0300
----------------------------------------------------------------------
.../binary/CacheObjectBinaryProcessorImpl.java | 35 ++++++++++++++++----
1 file changed, 28 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/e3c4868d/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java
index 0337874..ecd27f7 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java
@@ -40,6 +40,7 @@ import org.apache.ignite.IgniteBinary;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteException;
import org.apache.ignite.binary.BinaryBasicNameMapper;
+import org.apache.ignite.binary.BinaryField;
import org.apache.ignite.binary.BinaryObject;
import org.apache.ignite.binary.BinaryObjectBuilder;
import org.apache.ignite.binary.BinaryObjectException;
@@ -89,6 +90,7 @@ import org.apache.ignite.internal.util.lang.GridMapEntry;
import org.apache.ignite.internal.util.tostring.GridToStringExclude;
import org.apache.ignite.internal.util.typedef.C1;
import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.T1;
import org.apache.ignite.internal.util.typedef.T2;
import org.apache.ignite.internal.util.typedef.X;
import org.apache.ignite.internal.util.typedef.internal.CU;
@@ -159,6 +161,9 @@ public class CacheObjectBinaryProcessorImpl extends IgniteCacheObjectProcessorIm
/** Metadata updates collected before metadata cache is initialized. */
private final Map<Integer, BinaryMetadata> metaBuf = new ConcurrentHashMap<>();
+ /** Cached affinity key field names. */
+ private final ConcurrentHashMap<Integer, T1<BinaryField>> affKeyFields = new ConcurrentHashMap<>();
+
/**
* @param ctx Kernal context.
*/
@@ -684,22 +689,38 @@ public class CacheObjectBinaryProcessorImpl extends IgniteCacheObjectProcessorIm
* @return Affinity key.
*/
public Object affinityKey(BinaryObject po) {
+ // Fast path for already cached field.
+ if (po instanceof BinaryObjectEx) {
+ int typeId = ((BinaryObjectEx)po).typeId();
+
+ T1<BinaryField> fieldHolder = affKeyFields.get(typeId);
+
+ if (fieldHolder != null) {
+ BinaryField field = fieldHolder.get();
+
+ return field != null ? field.value(po) : po;
+ }
+ }
+
+ // Slow path if affinity field is not cached yet.
try {
BinaryType meta = po instanceof BinaryObjectEx ? ((BinaryObjectEx)po).rawType() : po.type();
if (meta != null) {
- String affKeyFieldName = meta.affinityKeyFieldName();
+ String name = meta.affinityKeyFieldName();
+
+ affKeyFields.putIfAbsent(meta.typeId(), new T1<>(meta.field(name)));
- if (affKeyFieldName != null)
- return po.field(affKeyFieldName);
+ if (name != null)
+ return po.field(name);
}
else if (po instanceof BinaryObjectEx) {
- int id = ((BinaryObjectEx)po).typeId();
+ int typeId = ((BinaryObjectEx)po).typeId();
- String affKeyFieldName = binaryCtx.affinityKeyFieldName(id);
+ String name = binaryCtx.affinityKeyFieldName(typeId);
- if (affKeyFieldName != null)
- return po.field(affKeyFieldName);
+ if (name != null)
+ return po.field(name);
}
}
catch (BinaryObjectException e) {