You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by nt...@apache.org on 2017/04/18 10:00:51 UTC
[02/19] 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/4dc624fc
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/4dc624fc
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/4dc624fc
Branch: refs/heads/master
Commit: 4dc624fc9a8852f77f1fe7db4dc06a474b34c2eb
Parents: 8c56e45
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:26:03 2016 +0300
----------------------------------------------------------------------
.../binary/CacheObjectBinaryProcessorImpl.java | 35 ++++++++++++++++----
1 file changed, 28 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/4dc624fc/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) {