From d52223aaa212f42fdccbba5262d3925715bd445d Mon Sep 17 00:00:00 2001 From: devozerov Date: Thu, 8 Jun 2017 14:51:40 +0300 Subject: [PATCH 01/26] WIP. --- .../ignite/internal/binary/BinaryContext.java | 42 +++---------------- .../CacheObjectBinaryProcessorImpl.java | 18 +++++++- 2 files changed, 22 insertions(+), 38 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java index be02ba1152e78..8f7720d9e43f5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java @@ -225,9 +225,6 @@ public class BinaryContext { /** Maps typeId to mappers. */ private final ConcurrentMap typeId2Mapper = new ConcurrentHashMap8<>(0); - /** Affinity key field names. */ - private final ConcurrentMap affKeyFieldNames = new ConcurrentHashMap8<>(0); - /** Maps className to mapper */ private final ConcurrentMap cls2Mappers = new ConcurrentHashMap8<>(0); @@ -325,6 +322,8 @@ public BinaryContext(BinaryMetadataHandler metaHnd, IgniteConfiguration igniteCf // Classes with overriden default serialization flag. registerPredefinedType(AffinityKey.class, 0, affinityFieldName(AffinityKey.class), false); + registerPredefinedType(CollocatedSetItemKey.class, 0, affinityFieldName(CollocatedSetItemKey.class), false); + registerPredefinedType(CollocatedQueueItemKey.class, 0, affinityFieldName(CollocatedQueueItemKey.class), false); registerPredefinedType(GridMapEntry.class, 60); registerPredefinedType(IgniteBiTuple.class, 61); @@ -472,19 +471,7 @@ private void configure( registerUserType(desc.clsName, desc.mapper, desc.serializer, desc.identity, desc.affKeyFieldName, desc.isEnum, desc.enumMap); - BinaryInternalMapper globalMapper = resolveMapper(globalNameMapper, globalIdMapper); - - // Put affinity field names for unconfigured types. - for (Map.Entry entry : affFields.entrySet()) { - String typeName = entry.getKey(); - - int typeId = globalMapper.typeId(typeName); - - affKeyFieldNames.putIfAbsent(typeId, entry.getValue()); - } - - addSystemClassAffinityKey(CollocatedSetItemKey.class); - addSystemClassAffinityKey(CollocatedQueueItemKey.class); + // TODO: Register rest classes from "affFields". } /** @@ -533,17 +520,6 @@ public static BinaryNameMapper defaultNameMapper() { return DFLT_MAPPER.nameMapper(); } - /** - * @param cls Class. - */ - private void addSystemClassAffinityKey(Class cls) { - String fieldName = affinityFieldName(cls); - - assert fieldName != null : cls; - - affKeyFieldNames.putIfAbsent(cls.getName().hashCode(), affinityFieldName(cls)); - } - /** * @param pkgName Package name. * @return Class names. @@ -1082,9 +1058,6 @@ public BinaryClassDescriptor registerPredefinedType(Class cls, int id, String descByCls.put(cls, desc); - if (affFieldName != null) - affKeyFieldNames.putIfAbsent(id, affFieldName); - return desc; } @@ -1133,11 +1106,6 @@ public void registerUserType(String clsName, throw duplicateTypeIdException(clsName, id); } - if (affKeyFieldName != null) { - if (affKeyFieldNames.put(id, affKeyFieldName) != null) - throw duplicateTypeIdException(clsName, id); - } - cls2Mappers.put(clsName, mapper); Map fieldsMeta = null; @@ -1248,7 +1216,9 @@ public BinaryType metadata(int typeId, int schemaId) throws BinaryObjectExceptio * @return Affinity key field name. */ public String affinityKeyFieldName(int typeId) { - return affKeyFieldNames.get(typeId); + BinaryMetadata meta = metaHnd.metadata0(typeId); + + return meta != null ? meta.affinityKeyFieldName() : null; } /** 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 a2d319f32573f..9dd3c6a33fa34 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 @@ -393,7 +393,21 @@ public GridBinaryMarshaller marshaller() { if (binaryCtx == null) return null; - return binaryCtx.affinityKeyFieldName(typeId(keyType)); + int typeId = typeId(keyType); + + return affinityField(typeId); + } + + /** + * Get affinity field. + * + * @param typeId Type ID. + * @return Affinity field. + */ + @Nullable private String affinityField(int typeId) { + BinaryMetadata meta = metadata0(typeId); + + return meta != null ? meta.affinityKeyFieldName() : null; } /** {@inheritDoc} */ @@ -673,7 +687,7 @@ public Object affinityKey(BinaryObject po) { else if (po instanceof BinaryObjectEx) { int typeId = ((BinaryObjectEx)po).typeId(); - String name = binaryCtx.affinityKeyFieldName(typeId); + String name = affinityField(typeId); if (name != null) return po.field(name); From 4269eee2a43674b4a24b81ee3b09210b9c0eb202 Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 10:28:34 +0300 Subject: [PATCH 02/26] WIP. --- .../org/apache/ignite/internal/binary/BinaryContext.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java index 8f7720d9e43f5..72a387163c88e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java @@ -321,9 +321,9 @@ public BinaryContext(BinaryMetadataHandler metaHnd, IgniteConfiguration igniteCf registerPredefinedType(LinkedHashMap.class, 0); // Classes with overriden default serialization flag. - registerPredefinedType(AffinityKey.class, 0, affinityFieldName(AffinityKey.class), false); - registerPredefinedType(CollocatedSetItemKey.class, 0, affinityFieldName(CollocatedSetItemKey.class), false); - registerPredefinedType(CollocatedQueueItemKey.class, 0, affinityFieldName(CollocatedQueueItemKey.class), false); + registerPredefinedType(AffinityKey.class, 0, affinityFieldName(AffinityKey.class), true); + registerPredefinedType(CollocatedSetItemKey.class, 0, affinityFieldName(CollocatedSetItemKey.class), true); + registerPredefinedType(CollocatedQueueItemKey.class, 0, affinityFieldName(CollocatedQueueItemKey.class), true); registerPredefinedType(GridMapEntry.class, 60); registerPredefinedType(IgniteBiTuple.class, 61); From 54afab2b9b934e9dae96c5eb095ab4a344633b34 Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 10:35:48 +0300 Subject: [PATCH 03/26] Returning old mappings. --- .../ignite/internal/binary/BinaryContext.java | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java index 72a387163c88e..4659f22c2c407 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java @@ -225,6 +225,9 @@ public class BinaryContext { /** Maps typeId to mappers. */ private final ConcurrentMap typeId2Mapper = new ConcurrentHashMap8<>(0); + /** Affinity key field names. */ + private final ConcurrentMap affKeyFieldNames = new ConcurrentHashMap8<>(0); + /** Maps className to mapper */ private final ConcurrentMap cls2Mappers = new ConcurrentHashMap8<>(0); @@ -457,13 +460,19 @@ private void configure( if (clsName.endsWith(".*")) { String pkgName = clsName.substring(0, clsName.length() - 2); - for (String clsName0 : classesInPackage(pkgName)) - descs.add(clsName0, mapper, serializer, identity, affFields.get(clsName0), + for (String clsName0 : classesInPackage(pkgName)) { + String affField = affFields.remove(clsName0); + + descs.add(clsName0, mapper, serializer, identity, affField, typeCfg.isEnum(), typeCfg.getEnumValues(), true); + } } - else + else { + String affField = affFields.remove(clsName); + descs.add(clsName, mapper, serializer, identity, affFields.get(clsName), typeCfg.isEnum(), typeCfg.getEnumValues(), false); + } } } @@ -471,7 +480,16 @@ private void configure( registerUserType(desc.clsName, desc.mapper, desc.serializer, desc.identity, desc.affKeyFieldName, desc.isEnum, desc.enumMap); - // TODO: Register rest classes from "affFields". + BinaryInternalMapper globalMapper = resolveMapper(globalNameMapper, globalIdMapper); + + // Put affinity field names for unconfigured types. + for (Map.Entry entry : affFields.entrySet()) { + String typeName = entry.getKey(); + + int typeId = globalMapper.typeId(typeName); + + affKeyFieldNames.putIfAbsent(typeId, entry.getValue()); + } } /** From 78276a21878559e14b8cf9d0407cda62aebf1bb0 Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 10:38:54 +0300 Subject: [PATCH 04/26] WIP. --- .../apache/ignite/internal/binary/BinaryContext.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java index 4659f22c2c407..ec769a063158a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java @@ -470,7 +470,7 @@ private void configure( else { String affField = affFields.remove(clsName); - descs.add(clsName, mapper, serializer, identity, affFields.get(clsName), + descs.add(clsName, mapper, serializer, identity, affField, typeCfg.isEnum(), typeCfg.getEnumValues(), false); } } @@ -1076,6 +1076,9 @@ public BinaryClassDescriptor registerPredefinedType(Class cls, int id, String descByCls.put(cls, desc); + if (affFieldName != null) + affKeyFieldNames.putIfAbsent(id, affFieldName); + return desc; } @@ -1124,6 +1127,11 @@ public void registerUserType(String clsName, throw duplicateTypeIdException(clsName, id); } + if (affKeyFieldName != null) { + if (affKeyFieldNames.put(id, affKeyFieldName) != null) + throw duplicateTypeIdException(clsName, id); + } + cls2Mappers.put(clsName, mapper); Map fieldsMeta = null; From bc4a4c7774a1d1be2a2437fcfb241b5d6c966cd9 Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 10:40:39 +0300 Subject: [PATCH 05/26] WIP. --- .../ignite/internal/binary/BinaryContext.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java index ec769a063158a..76c5a5059cd5a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java @@ -1238,13 +1238,22 @@ public BinaryType metadata(int typeId, int schemaId) throws BinaryObjectExceptio } /** + * Get affinity key field name for type. First consult to predefined configuration, then delegate to metadata. + * * @param typeId Type ID. * @return Affinity key field name. */ public String affinityKeyFieldName(int typeId) { - BinaryMetadata meta = metaHnd.metadata0(typeId); + String res = affKeyFieldNames.get(typeId); + + if (res == null) { + BinaryMetadata meta = metaHnd.metadata0(typeId); + + if (meta != null) + res = meta.affinityKeyFieldName(); + } - return meta != null ? meta.affinityKeyFieldName() : null; + return res; } /** From 53011359a1ccc85825ff09fbb28be2e57e6c78d6 Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 10:42:04 +0300 Subject: [PATCH 06/26] WIP. --- .../cache/binary/CacheObjectBinaryProcessorImpl.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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 9dd3c6a33fa34..ed3ece5d6707a 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 @@ -405,9 +405,7 @@ public GridBinaryMarshaller marshaller() { * @return Affinity field. */ @Nullable private String affinityField(int typeId) { - BinaryMetadata meta = metadata0(typeId); - - return meta != null ? meta.affinityKeyFieldName() : null; + return binaryCtx.affinityKeyFieldName(typeId); } /** {@inheritDoc} */ From 4c7e3653eb3d7abef843b2f9bab1da9519660d72 Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 10:59:42 +0300 Subject: [PATCH 07/26] WIP. --- .../internal/processors/cache/GridCacheContext.java | 11 +++++++++++ .../ignite/internal/processors/query/QueryUtils.java | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java index 839ddbd9cdc52..d2cb4158ad013 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java @@ -2063,6 +2063,17 @@ else if (type == EVT_CACHE_REBALANCE_STOPPED) { return true; } + /** + * Get affinity field name for type. + * + * @param typeName Type name. + * @return Affinity field name. + */ + @Nullable public String affinityField(String typeName) { + // TODO: Consult to config first. + return ctx.cacheObjects().affinityField(typeName); + } + /** {@inheritDoc} */ @Override public void writeExternal(ObjectOutput out) throws IOException { U.writeString(out, igniteInstanceName()); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java index e0815fd0b54bb..01e06a35b2e84 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java @@ -431,7 +431,7 @@ public static QueryTypeCandidate typeForQueryEntity(String cacheName, GridCacheC // Need to setup affinity key for distributed joins. if (!cctx.customAffinityMapper() && qryEntity.findKeyType() != null) - affField = ctx.cacheObjects().affinityField(qryEntity.findKeyType()); + affField = cctx.affinityField(qryEntity.findKeyType()); else if (cctx.config().getAffinityMapper() instanceof DynamicTableAffinityKeyMapper) affField = ((DynamicTableAffinityKeyMapper)cctx.config().getAffinityMapper()).fieldName(); From bc952483e626c6599faad41f2b3bb30162f407bb Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 12:30:40 +0300 Subject: [PATCH 08/26] WIP. --- .../CacheDefaultBinaryAffinityKeyMapper.java | 77 ++++++++++++++++++- .../processors/cache/GridCacheContext.java | 11 --- .../CacheDefaultBinaryAffinityKeyMapper.java | 51 ------------ .../binary/CacheObjectBinaryContext.java | 10 ++- .../CacheObjectBinaryProcessorImpl.java | 77 ++++++------------- .../IgniteCacheObjectProcessor.java | 6 -- .../internal/processors/query/QueryUtils.java | 6 +- .../resources/META-INF/classnames.properties | 1 - 8 files changed, 110 insertions(+), 129 deletions(-) delete mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheDefaultBinaryAffinityKeyMapper.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheDefaultBinaryAffinityKeyMapper.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheDefaultBinaryAffinityKeyMapper.java index 9b3dd159d2494..ae43386a491da 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheDefaultBinaryAffinityKeyMapper.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheDefaultBinaryAffinityKeyMapper.java @@ -19,10 +19,18 @@ import org.apache.ignite.Ignite; import org.apache.ignite.IgniteException; +import org.apache.ignite.binary.BinaryField; import org.apache.ignite.binary.BinaryObject; +import org.apache.ignite.cache.CacheKeyConfiguration; import org.apache.ignite.internal.IgniteKernal; +import org.apache.ignite.internal.binary.BinaryObjectEx; import org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl; +import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.U; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; /** * @@ -34,6 +42,24 @@ public class CacheDefaultBinaryAffinityKeyMapper extends GridCacheDefaultAffinit /** */ private CacheObjectBinaryProcessorImpl proc; + /** Mapping from type name to affinity field name. */ + private Map typeNameAffFields = new HashMap<>(); + + /** Mapping from type ID to affinity field name. */ + private volatile transient Map typeIdAffFields; + + /** + * Constructor. + * + * @param cacheKeyCfgs Cache key configurations. + */ + public CacheDefaultBinaryAffinityKeyMapper(@Nullable CacheKeyConfiguration[] cacheKeyCfgs) { + if (!F.isEmpty(cacheKeyCfgs)) { + for (CacheKeyConfiguration cacheKeyCfg : cacheKeyCfgs) + typeNameAffFields.put(cacheKeyCfg.getTypeName(), cacheKeyCfg.getAffinityKeyFieldName()); + } + } + /** {@inheritDoc} */ @Override public Object affinityKey(Object key) { try { @@ -43,12 +69,59 @@ public class CacheDefaultBinaryAffinityKeyMapper extends GridCacheDefaultAffinit U.error(log, "Failed to marshal key to binary: " + key, e); } - if (key instanceof BinaryObject) - return proc.affinityKey((BinaryObject)key); + if (key instanceof BinaryObject) { + assert key instanceof BinaryObjectEx : "All BinaryObject implementations must implement " + + BinaryObjectEx.class.getName() + ": " + key.getClass().getName(); + + BinaryObjectEx key0 = (BinaryObjectEx)key; + + BinaryField affField = affinityKeyField(key0.typeId()); + + if (affField == null) + affField = proc.affinityKeyField(key0); + + if (affField != null) { + Object res = affField.value(key0); + + if (res != null) + return res; + } + + return key; + } else return super.affinityKey(key); } + /** + * Get affinity field override for type. + * + * @param typeId Type ID. + * @return Affinity field override if any. + */ + @Nullable private BinaryField affinityKeyField(int typeId) { + Map typeIdAffFields0 = typeIdAffFields; + + if (typeIdAffFields0 == null) { + typeIdAffFields0 = new HashMap<>(); + + for (Map.Entry entry : typeNameAffFields.entrySet()) { + String typeName = entry.getKey(); + String affFieldName = entry.getValue(); + + int curTypeId = proc.typeId(typeName); + + BinaryField field = proc.binaryContext().createField(curTypeId, affFieldName); + + typeIdAffFields0.put(curTypeId, field); + } + + typeIdAffFields = typeIdAffFields0; + } + + return typeIdAffFields0.get(typeId); + } + /** {@inheritDoc} */ @Override public void ignite(Ignite ignite) { super.ignite(ignite); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java index d2cb4158ad013..839ddbd9cdc52 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java @@ -2063,17 +2063,6 @@ else if (type == EVT_CACHE_REBALANCE_STOPPED) { return true; } - /** - * Get affinity field name for type. - * - * @param typeName Type name. - * @return Affinity field name. - */ - @Nullable public String affinityField(String typeName) { - // TODO: Consult to config first. - return ctx.cacheObjects().affinityField(typeName); - } - /** {@inheritDoc} */ @Override public void writeExternal(ObjectOutput out) throws IOException { U.writeString(out, igniteInstanceName()); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheDefaultBinaryAffinityKeyMapper.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheDefaultBinaryAffinityKeyMapper.java deleted file mode 100644 index 0ca06e3b2bc84..0000000000000 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheDefaultBinaryAffinityKeyMapper.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.internal.processors.cache.binary; - -import org.apache.ignite.IgniteException; -import org.apache.ignite.internal.IgniteKernal; -import org.apache.ignite.internal.processors.cache.GridCacheDefaultAffinityKeyMapper; -import org.apache.ignite.internal.util.typedef.internal.U; -import org.apache.ignite.binary.BinaryObject; - -/** - * - */ -public class CacheDefaultBinaryAffinityKeyMapper extends GridCacheDefaultAffinityKeyMapper { - /** */ - private static final long serialVersionUID = 0L; - - /** {@inheritDoc} */ - @Override public Object affinityKey(Object key) { - IgniteKernal kernal = (IgniteKernal)ignite; - - CacheObjectBinaryProcessorImpl proc = (CacheObjectBinaryProcessorImpl)kernal.context().cacheObjects(); - - try { - key = proc.toBinary(key); - } - catch (IgniteException e) { - U.error(log, "Failed to marshal key to binary: " + key, e); - } - - if (key instanceof BinaryObject) - return proc.affinityKey((BinaryObject)key); - else - return super.affinityKey(key); - } -} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryContext.java index 3b3cf678d65d6..72f610e28fa3b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryContext.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.processors.cache.binary; +import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.processors.cache.CacheDefaultBinaryAffinityKeyMapper; import org.apache.ignite.internal.processors.cache.CacheObjectContext; @@ -31,21 +32,22 @@ public class CacheObjectBinaryContext extends CacheObjectContext { /** * @param kernalCtx Kernal context. - * @param cacheName Cache name. + * @param ccfg Cache configuration. * @param binaryEnabled Binary enabled flag. * @param cpyOnGet Copy on get flag. * @param storeVal {@code True} if should store unmarshalled value in cache. * @param depEnabled {@code true} if deployment is enabled for the given cache. */ public CacheObjectBinaryContext(GridKernalContext kernalCtx, - String cacheName, + CacheConfiguration ccfg, boolean cpyOnGet, boolean storeVal, boolean binaryEnabled, boolean depEnabled) { super(kernalCtx, - cacheName, - binaryEnabled ? new CacheDefaultBinaryAffinityKeyMapper() : new GridCacheDefaultAffinityKeyMapper(), + ccfg.getName(), + binaryEnabled ? new CacheDefaultBinaryAffinityKeyMapper(ccfg.getCacheKeyConfiguration()) : + new GridCacheDefaultAffinityKeyMapper(), cpyOnGet, storeVal, depEnabled); 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 ed3ece5d6707a..6751c665727e2 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 @@ -388,26 +388,6 @@ public GridBinaryMarshaller marshaller() { return binaryMarsh; } - /** {@inheritDoc} */ - @Override public String affinityField(String keyType) { - if (binaryCtx == null) - return null; - - int typeId = typeId(keyType); - - return affinityField(typeId); - } - - /** - * Get affinity field. - * - * @param typeId Type ID. - * @return Affinity field. - */ - @Nullable private String affinityField(int typeId) { - return binaryCtx.affinityKeyFieldName(typeId); - } - /** {@inheritDoc} */ @Override public BinaryObjectBuilder builder(String clsName) { return new BinaryObjectBuilderImpl(binaryCtx, clsName); @@ -648,54 +628,47 @@ public GridBinaryMarshaller marshaller() { } /** + * Get affinity key field. + * * @param po Binary object. * @return Affinity key. */ - public Object affinityKey(BinaryObject po) { + // TODO: Take in count aff key fields. + public BinaryField affinityKeyField(BinaryObjectEx po) { // Fast path for already cached field. - if (po instanceof BinaryObjectEx) { - int typeId = ((BinaryObjectEx)po).typeId(); - - T1 fieldHolder = affKeyFields.get(typeId); + int typeId = po.typeId(); - if (fieldHolder != null) { - BinaryField field = fieldHolder.get(); + T1 fieldHolder = affKeyFields.get(typeId); - return field != null ? field.value(po) : po; - } - } + if (fieldHolder != null) + return fieldHolder.get(); // Slow path if affinity field is not cached yet. - try { - BinaryType meta = po instanceof BinaryObjectEx ? ((BinaryObjectEx)po).rawType() : po.type(); + BinaryType meta = po.rawType(); - if (meta != null) { - String name = meta.affinityKeyFieldName(); + if (meta != null) { + String name = meta.affinityKeyFieldName(); - if (name != null) { - BinaryField field = meta.field(name); + if (name != null) { + BinaryField field = meta.field(name); - affKeyFields.putIfAbsent(meta.typeId(), new T1<>(field)); + affKeyFields.putIfAbsent(meta.typeId(), new T1<>(field)); - return field.value(po); - } - else - affKeyFields.putIfAbsent(meta.typeId(), new T1(null)); + return field; } - else if (po instanceof BinaryObjectEx) { - int typeId = ((BinaryObjectEx)po).typeId(); - - String name = affinityField(typeId); + else { + affKeyFields.putIfAbsent(meta.typeId(), new T1(null)); - if (name != null) - return po.field(name); + return null; } } - catch (BinaryObjectException e) { - U.error(log, "Failed to get affinity field from binary object: " + po, e); - } - return po; + String name = binaryCtx.affinityKeyFieldName(typeId); + + if (name != null) + return po.field(name); + + return null; } /** {@inheritDoc} */ @@ -736,7 +709,7 @@ public BinaryContext binaryContext() { CacheObjectContext ctx0 = super.contextForCache(cfg); CacheObjectContext res = new CacheObjectBinaryContext(ctx, - cfg.getName(), + cfg, ctx0.copyOnGet(), ctx0.storeValue(), binaryEnabled, diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessor.java index ee2d1f29e060f..ae6428ea5a97f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessor.java @@ -211,10 +211,4 @@ public IncompleteCacheObject toKeyCacheObject(CacheObjectContext ctx, ByteBuffer * @return Ignite binary interface. */ public IgniteBinary binary(); - - /** - * @param keyType Key type name. - * @return Affinity filed name or {@code null}. - */ - public String affinityField(String keyType); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java index 01e06a35b2e84..84ada4b48842d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java @@ -430,8 +430,10 @@ public static QueryTypeCandidate typeForQueryEntity(String cacheName, GridCacheC String affField = null; // Need to setup affinity key for distributed joins. - if (!cctx.customAffinityMapper() && qryEntity.findKeyType() != null) - affField = cctx.affinityField(qryEntity.findKeyType()); + if (!cctx.customAffinityMapper() && qryEntity.findKeyType() != null) { + // TODO: How to get affinity field here? + affField = null; + } else if (cctx.config().getAffinityMapper() instanceof DynamicTableAffinityKeyMapper) affField = ((DynamicTableAffinityKeyMapper)cctx.config().getAffinityMapper()).fieldName(); diff --git a/modules/core/src/main/resources/META-INF/classnames.properties b/modules/core/src/main/resources/META-INF/classnames.properties index 2218aade1dc37..55ed30a43274f 100644 --- a/modules/core/src/main/resources/META-INF/classnames.properties +++ b/modules/core/src/main/resources/META-INF/classnames.properties @@ -557,7 +557,6 @@ org.apache.ignite.internal.processors.cache.QueryCursorImpl$State org.apache.ignite.internal.processors.cache.affinity.GridCacheAffinityProxy org.apache.ignite.internal.processors.cache.binary.BinaryMetadataHolder org.apache.ignite.internal.processors.cache.binary.BinaryMetadataKey -org.apache.ignite.internal.processors.cache.binary.CacheDefaultBinaryAffinityKeyMapper org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl$3 org.apache.ignite.internal.processors.cache.binary.MetadataRequestMessage org.apache.ignite.internal.processors.cache.binary.MetadataResponseMessage From ae7bd7c1767fbd7018cd193a235aea8cabb8ee11 Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 12:44:14 +0300 Subject: [PATCH 09/26] WIP. --- .../CacheDefaultBinaryAffinityKeyMapper.java | 12 ++++++++++++ .../internal/processors/query/QueryUtils.java | 17 ++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheDefaultBinaryAffinityKeyMapper.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheDefaultBinaryAffinityKeyMapper.java index ae43386a491da..9078e49c6ef24 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheDefaultBinaryAffinityKeyMapper.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheDefaultBinaryAffinityKeyMapper.java @@ -93,6 +93,18 @@ public CacheDefaultBinaryAffinityKeyMapper(@Nullable CacheKeyConfiguration[] cac return super.affinityKey(key); } + /** + * Get affinity field override for type. + * + * @param typeName Type name. + * @return Affinity field override if any. + */ + @Nullable public BinaryField affinityKeyField(String typeName) { + int typeId = proc.typeId(typeName); + + return affinityKeyField(typeId); + } + /** * Get affinity field override for type. * diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java index 84ada4b48842d..ec8ebb1019640 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java @@ -32,6 +32,7 @@ import java.util.concurrent.TimeUnit; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; +import org.apache.ignite.binary.BinaryField; import org.apache.ignite.cache.QueryEntity; import org.apache.ignite.cache.QueryIndex; import org.apache.ignite.cache.QueryIndexType; @@ -39,6 +40,7 @@ import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.binary.BinaryMarshaller; +import org.apache.ignite.internal.processors.cache.CacheDefaultBinaryAffinityKeyMapper; import org.apache.ignite.internal.processors.cache.CacheObjectContext; import org.apache.ignite.internal.processors.cache.DynamicCacheDescriptor; import org.apache.ignite.internal.processors.cache.GridCacheContext; @@ -430,9 +432,18 @@ public static QueryTypeCandidate typeForQueryEntity(String cacheName, GridCacheC String affField = null; // Need to setup affinity key for distributed joins. - if (!cctx.customAffinityMapper() && qryEntity.findKeyType() != null) { - // TODO: How to get affinity field here? - affField = null; + String keyType = qryEntity.getKeyType(); + + if (!cctx.customAffinityMapper() && keyType != null) { + if (coCtx != null) { + CacheDefaultBinaryAffinityKeyMapper mapper = + (CacheDefaultBinaryAffinityKeyMapper)coCtx.defaultAffMapper(); + + BinaryField field = mapper.affinityKeyField(keyType); + + if (field != null) + affField = field.name(); + } } else if (cctx.config().getAffinityMapper() instanceof DynamicTableAffinityKeyMapper) affField = ((DynamicTableAffinityKeyMapper)cctx.config().getAffinityMapper()).fieldName(); From 36265d1dbf91b4a795b324626aa5ce94add6b7c7 Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 12:45:49 +0300 Subject: [PATCH 10/26] Property. --- .../configuration/CacheConfiguration.java | 25 +++++++++++++++++++ .../binary/CacheObjectBinaryContext.java | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java index 6e0836e82f281..9b3d48d618d84 100644 --- a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java @@ -47,6 +47,7 @@ import org.apache.ignite.cache.CacheAtomicityMode; import org.apache.ignite.cache.CacheEntryProcessor; import org.apache.ignite.cache.CacheInterceptor; +import org.apache.ignite.cache.CacheKeyConfiguration; import org.apache.ignite.cache.CacheMode; import org.apache.ignite.cache.CacheRebalanceMode; import org.apache.ignite.cache.CacheWriteSynchronizationMode; @@ -369,6 +370,9 @@ public class CacheConfiguration extends MutableConfiguration { /** */ private int qryParallelism = DFLT_QUERY_PARALLELISM; + /** Cache key configuration. */ + private CacheKeyConfiguration[] cacheKeyCfg; + /** Empty constructor (all values are initialized to their defaults). */ public CacheConfiguration() { /* No-op. */ @@ -402,6 +406,7 @@ public CacheConfiguration(CompleteConfiguration cfg) { affMapper = cc.getAffinityMapper(); atomicityMode = cc.getAtomicityMode(); backups = cc.getBackups(); + cacheKeyCfg = cc.getKeyConfiguration(); cacheLoaderFactory = cc.getCacheLoaderFactory(); cacheMode = cc.getCacheMode(); cacheWriterFactory = cc.getCacheWriterFactory(); @@ -2289,6 +2294,26 @@ private static void processAnnotation(boolean key, QuerySqlField sqlAnn, QueryTe return this; } + /** + * Gets cache key configuration. + * + * @return Cache key configuration. + */ + public CacheKeyConfiguration[] getKeyConfiguration() { + return cacheKeyCfg; + } + + /** + * Sets cache key configuration. + * + * @param cacheKeyCfg Cache key configuration. + */ + public CacheConfiguration setKeyConfiguration(CacheKeyConfiguration... cacheKeyCfg) { + this.cacheKeyCfg = cacheKeyCfg; + + return this; + } + /** {@inheritDoc} */ @Override public String toString() { return S.toString(CacheConfiguration.class, this); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryContext.java index 72f610e28fa3b..7f7e26e6b09f5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryContext.java @@ -46,7 +46,7 @@ public CacheObjectBinaryContext(GridKernalContext kernalCtx, boolean depEnabled) { super(kernalCtx, ccfg.getName(), - binaryEnabled ? new CacheDefaultBinaryAffinityKeyMapper(ccfg.getCacheKeyConfiguration()) : + binaryEnabled ? new CacheDefaultBinaryAffinityKeyMapper(ccfg.getKeyConfiguration()) : new GridCacheDefaultAffinityKeyMapper(), cpyOnGet, storeVal, From 5bb8fb008e7365d2b3b489bb5e047a1dc9be9038 Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 12:48:54 +0300 Subject: [PATCH 11/26] Removed affinitydynamic table affinity mapper. --- .../query/DynamicTableAffinityKeyMapper.java | 92 ------------------- .../processors/query/GridQueryProcessor.java | 8 +- .../internal/processors/query/QueryUtils.java | 2 - .../processors/query/h2/opt/GridH2Table.java | 5 +- 4 files changed, 4 insertions(+), 103 deletions(-) delete mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/query/DynamicTableAffinityKeyMapper.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/DynamicTableAffinityKeyMapper.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/DynamicTableAffinityKeyMapper.java deleted file mode 100644 index e49341ab87f16..0000000000000 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/DynamicTableAffinityKeyMapper.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.internal.processors.query; - -import org.apache.ignite.binary.BinaryObject; -import org.apache.ignite.binary.BinaryType; -import org.apache.ignite.cache.affinity.AffinityKeyMapper; -import org.apache.ignite.internal.binary.BinaryFieldEx; -import org.apache.ignite.internal.binary.BinaryObjectEx; -import org.apache.ignite.internal.util.typedef.F; - -/** - * Trivial mapper to take extract field value from binary object of specific type as affinity key. - */ -@SuppressWarnings("deprecation") -public class DynamicTableAffinityKeyMapper implements AffinityKeyMapper { - /** */ - private static final long serialVersionUID = 0L; - - /** Type name. */ - private final String typeName; - - /** Field name. */ - private final String fieldName; - - /** Type id for faster type checks. */ - private transient volatile BinaryFieldEx field; - - /** - * Constructor. - * - * @param typeName Type name. - * @param fieldName Field name. - */ - DynamicTableAffinityKeyMapper(String typeName, String fieldName) { - this.typeName = typeName; - this.fieldName = fieldName; - } - - /** - * @return Field name. - */ - public String fieldName() { - return fieldName; - } - - /** {@inheritDoc} */ - @Override public Object affinityKey(Object key) { - if (!(key instanceof BinaryObject)) - return key; - - assert key instanceof BinaryObjectEx; - - BinaryObjectEx key0 = (BinaryObjectEx)key; - - if (field == null) { - BinaryType type = key0.type(); - - if (!F.eq(type.typeName(), typeName)) - return key; - - field = (BinaryFieldEx)type.field(fieldName); - } - - if (!F.eq(key0.typeId(), field.typeId())) - return key; - - Object affKey = field.value(key0); - - return affKey != null ? affKey : key; - } - - /** {@inheritDoc} */ - @Override public void reset() { - // No-op. - } -} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java index dd07584d1ffb7..d88f062d43254 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java @@ -41,6 +41,7 @@ import org.apache.ignite.IgniteException; import org.apache.ignite.binary.Binarylizable; import org.apache.ignite.cache.CacheAtomicityMode; +import org.apache.ignite.cache.CacheKeyConfiguration; import org.apache.ignite.cache.CacheMode; import org.apache.ignite.cache.QueryEntity; import org.apache.ignite.cache.QueryIndex; @@ -1321,11 +1322,8 @@ else if (QueryUtils.TEMPLATE_REPLICÄTED.equalsIgnoreCase(templateName)) ccfg.setSqlEscapeAll(true); ccfg.setQueryEntities(Collections.singleton(entity)); - if (affinityKey != null) { - assert entity.getFields().containsKey(affinityKey) && entity.getKeyFields().contains(affinityKey); - - ccfg.setAffinityMapper(new DynamicTableAffinityKeyMapper(entity.getKeyType(), affinityKey)); - } + if (affinityKey != null) + ccfg.setKeyConfiguration(new CacheKeyConfiguration(entity.getValueType(), affinityKey)); boolean res; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java index ec8ebb1019640..cb9a1e1e9f6dc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java @@ -445,8 +445,6 @@ public static QueryTypeCandidate typeForQueryEntity(String cacheName, GridCacheC affField = field.name(); } } - else if (cctx.config().getAffinityMapper() instanceof DynamicTableAffinityKeyMapper) - affField = ((DynamicTableAffinityKeyMapper)cctx.config().getAffinityMapper()).fieldName(); if (affField != null) { if (!escape) diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java index 4f3ef01c44ac3..d656cc3194ee4 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java @@ -34,7 +34,6 @@ import org.apache.ignite.internal.processors.cache.KeyCacheObject; import org.apache.ignite.internal.processors.cache.query.QueryTable; import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; -import org.apache.ignite.internal.processors.query.DynamicTableAffinityKeyMapper; import org.apache.ignite.internal.processors.query.h2.database.H2RowFactory; import org.apache.ignite.internal.processors.query.h2.database.H2TreeIndex; import org.apache.ignite.internal.util.offheap.unsafe.GridUnsafeMemory; @@ -131,9 +130,7 @@ public GridH2Table(CreateTableData createTblData, @Nullable GridH2RowDescriptor this.desc = desc; this.cctx = cctx; - if (desc != null && desc.context() != null && - (!desc.context().customAffinityMapper() || - desc.context().config().getAffinityMapper() instanceof DynamicTableAffinityKeyMapper)) { + if (desc != null && desc.context() != null && !desc.context().customAffinityMapper()) { boolean affinityColExists = true; String affKey = desc.type().affinityKey(); From 38597d1910a2ddaaf65c81e71d7e86609e20a8b2 Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 12:50:40 +0300 Subject: [PATCH 12/26] MInors. --- .../ignite/configuration/CacheConfiguration.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java index 9b3d48d618d84..9c9361fd29ca4 100644 --- a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java @@ -371,7 +371,7 @@ public class CacheConfiguration extends MutableConfiguration { private int qryParallelism = DFLT_QUERY_PARALLELISM; /** Cache key configuration. */ - private CacheKeyConfiguration[] cacheKeyCfg; + private CacheKeyConfiguration[] keyCfg; /** Empty constructor (all values are initialized to their defaults). */ public CacheConfiguration() { @@ -406,7 +406,6 @@ public CacheConfiguration(CompleteConfiguration cfg) { affMapper = cc.getAffinityMapper(); atomicityMode = cc.getAtomicityMode(); backups = cc.getBackups(); - cacheKeyCfg = cc.getKeyConfiguration(); cacheLoaderFactory = cc.getCacheLoaderFactory(); cacheMode = cc.getCacheMode(); cacheWriterFactory = cc.getCacheWriterFactory(); @@ -421,23 +420,22 @@ public CacheConfiguration(CompleteConfiguration cfg) { interceptor = cc.getInterceptor(); invalidate = cc.isInvalidate(); isReadThrough = cc.isReadThrough(); - qryParallelism = cc.getQueryParallelism(); isWriteThrough = cc.isWriteThrough(); - storeKeepBinary = cc.isStoreKeepBinary() != null ? cc.isStoreKeepBinary() : DFLT_STORE_KEEP_BINARY; + keyCfg = cc.getKeyConfiguration(); listenerConfigurations = cc.listenerConfigurations; loadPrevVal = cc.isLoadPreviousValue(); longQryWarnTimeout = cc.getLongQueryWarningTimeout(); maxConcurrentAsyncOps = cc.getMaxConcurrentAsyncOperations(); memPlcName = cc.getMemoryPolicyName(); - sqlIdxMaxInlineSize = cc.getSqlIndexMaxInlineSize(); name = cc.getName(); nearCfg = cc.getNearConfiguration(); nodeFilter = cc.getNodeFilter(); onheapCache = cc.isOnheapCacheEnabled(); partLossPlc = cc.getPartitionLossPolicy(); pluginCfgs = cc.getPluginConfigurations(); - qryEntities = cc.getQueryEntities() == Collections.emptyList() ? null : cc.getQueryEntities(); qryDetailMetricsSz = cc.getQueryDetailMetricsSize(); + qryEntities = cc.getQueryEntities() == Collections.emptyList() ? null : cc.getQueryEntities(); + qryParallelism = cc.getQueryParallelism(); readFromBackup = cc.isReadFromBackup(); rebalanceBatchSize = cc.getRebalanceBatchSize(); rebalanceBatchesPrefetchCnt = cc.getRebalanceBatchesPrefetchCount(); @@ -450,7 +448,9 @@ public CacheConfiguration(CompleteConfiguration cfg) { sqlSchema = cc.getSqlSchema(); sqlEscapeAll = cc.isSqlEscapeAll(); sqlFuncCls = cc.getSqlFunctionClasses(); + sqlIdxMaxInlineSize = cc.getSqlIndexMaxInlineSize(); storeFactory = cc.getCacheStoreFactory(); + storeKeepBinary = cc.isStoreKeepBinary() != null ? cc.isStoreKeepBinary() : DFLT_STORE_KEEP_BINARY; storeSesLsnrs = cc.getCacheStoreSessionListenerFactories(); tmLookupClsName = cc.getTransactionManagerLookupClassName(); topValidator = cc.getTopologyValidator(); @@ -2300,7 +2300,7 @@ private static void processAnnotation(boolean key, QuerySqlField sqlAnn, QueryTe * @return Cache key configuration. */ public CacheKeyConfiguration[] getKeyConfiguration() { - return cacheKeyCfg; + return keyCfg; } /** @@ -2309,7 +2309,7 @@ public CacheKeyConfiguration[] getKeyConfiguration() { * @param cacheKeyCfg Cache key configuration. */ public CacheConfiguration setKeyConfiguration(CacheKeyConfiguration... cacheKeyCfg) { - this.cacheKeyCfg = cacheKeyCfg; + this.keyCfg = cacheKeyCfg; return this; } From 6cb550053e95d3529771bb16ccf648f3c0066720 Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 12:53:24 +0300 Subject: [PATCH 13/26] WIP. --- .../CacheObjectBinaryProcessorImpl.java | 30 ++++++------------- 1 file changed, 9 insertions(+), 21 deletions(-) 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 6751c665727e2..bf456c7a8d536 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 @@ -633,7 +633,6 @@ public GridBinaryMarshaller marshaller() { * @param po Binary object. * @return Affinity key. */ - // TODO: Take in count aff key fields. public BinaryField affinityKeyField(BinaryObjectEx po) { // Fast path for already cached field. int typeId = po.typeId(); @@ -644,31 +643,20 @@ public BinaryField affinityKeyField(BinaryObjectEx po) { return fieldHolder.get(); // Slow path if affinity field is not cached yet. - BinaryType meta = po.rawType(); - - if (meta != null) { - String name = meta.affinityKeyFieldName(); - - if (name != null) { - BinaryField field = meta.field(name); + String name = binaryCtx.affinityKeyFieldName(typeId); - affKeyFields.putIfAbsent(meta.typeId(), new T1<>(field)); + if (name != null) { + BinaryField field = binaryCtx.createField(typeId, name); - return field; - } - else { - affKeyFields.putIfAbsent(meta.typeId(), new T1(null)); + affKeyFields.putIfAbsent(typeId, new T1<>(field)); - return null; - } + return field; } + else { + affKeyFields.putIfAbsent(typeId, new T1(null)); - String name = binaryCtx.affinityKeyFieldName(typeId); - - if (name != null) - return po.field(name); - - return null; + return null; + } } /** {@inheritDoc} */ From 72dfc1d86bdef2e7e620967f1f025198fff16143 Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 13:22:43 +0300 Subject: [PATCH 14/26] WIP. --- .../ignite/internal/binary/builder/BinaryObjectBuilderImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java index d6cd5ca4de2af..60bd3190318c4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java @@ -349,6 +349,7 @@ else if (readCache == null) { BinarySchema curSchema = writer.currentSchema(); + // TODO: Put correct affinity key field name here. ctx.updateMetadata(typeId, new BinaryMetadata(typeId, typeName, fieldsMeta, ctx.affinityKeyFieldName(typeId), Collections.singleton(curSchema), false, null)); From 386f614170e42bf8089536d6f944098caae9eb68 Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 13:33:54 +0300 Subject: [PATCH 15/26] Fixed affinity key field name resolution for DML. --- .../builder/BinaryObjectBuilderImpl.java | 22 +++++++++++++-- .../CacheDefaultBinaryAffinityKeyMapper.java | 2 +- .../processors/cache/GridCacheContext.java | 28 +++++++++++++++++++ .../query/h2/DmlStatementsProcessor.java | 6 ++-- .../query/h2/dml/UpdatePlanBuilder.java | 11 +++++++- 5 files changed, 61 insertions(+), 8 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java index 60bd3190318c4..26684dc44324b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java @@ -86,6 +86,9 @@ public class BinaryObjectBuilderImpl implements BinaryObjectBuilder { /** Context of BinaryObject reading process. Or {@code null} if object is not created from BinaryObject. */ private final BinaryBuilderReader reader; + /** Affinity key field name. */ + private String affFieldName; + /** * @param clsName Class name. * @param ctx Binary context. @@ -349,9 +352,13 @@ else if (readCache == null) { BinarySchema curSchema = writer.currentSchema(); - // TODO: Put correct affinity key field name here. - ctx.updateMetadata(typeId, new BinaryMetadata(typeId, typeName, fieldsMeta, - ctx.affinityKeyFieldName(typeId), Collections.singleton(curSchema), false, null)); + String affFieldName0 = affFieldName; + + if (affFieldName0 == null) + ctx.affinityKeyFieldName(typeId); + + ctx.updateMetadata(typeId, new BinaryMetadata(typeId, typeName, fieldsMeta, affFieldName0, + Collections.singleton(curSchema), false, null)); schemaReg.addSchema(curSchema.schemaId(), curSchema); } @@ -619,4 +626,13 @@ int start() { public int typeId() { return typeId; } + + /** + * Set known affinity key field name. + * + * @param affFieldName Affinity key field name. + */ + public void affinityFieldName(String affFieldName) { + this.affFieldName = affFieldName; + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheDefaultBinaryAffinityKeyMapper.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheDefaultBinaryAffinityKeyMapper.java index 9078e49c6ef24..b7264332a4925 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheDefaultBinaryAffinityKeyMapper.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheDefaultBinaryAffinityKeyMapper.java @@ -111,7 +111,7 @@ public CacheDefaultBinaryAffinityKeyMapper(@Nullable CacheKeyConfiguration[] cac * @param typeId Type ID. * @return Affinity field override if any. */ - @Nullable private BinaryField affinityKeyField(int typeId) { + @Nullable public BinaryField affinityKeyField(int typeId) { Map typeIdAffFields0 = typeIdAffFields; if (typeIdAffFields0 == null) { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java index 839ddbd9cdc52..b007574db1fbc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java @@ -39,6 +39,8 @@ import javax.cache.processor.EntryProcessorResult; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteLogger; +import org.apache.ignite.binary.BinaryField; +import org.apache.ignite.binary.BinaryObjectBuilder; import org.apache.ignite.cache.CacheInterceptor; import org.apache.ignite.cache.CacheMode; import org.apache.ignite.cache.affinity.AffinityKeyMapper; @@ -51,6 +53,7 @@ import org.apache.ignite.internal.IgniteKernal; import org.apache.ignite.internal.IgnitionEx; import org.apache.ignite.internal.binary.BinaryMarshaller; +import org.apache.ignite.internal.binary.builder.BinaryObjectBuilderImpl; import org.apache.ignite.internal.managers.communication.GridIoManager; import org.apache.ignite.internal.managers.deployment.GridDeploymentManager; import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager; @@ -2063,6 +2066,31 @@ else if (type == EVT_CACHE_REBALANCE_STOPPED) { return true; } + /** + * Prepare affinity field for builder (if possible). + * + * @param buider Builder. + */ + public void prepareAffinityField(BinaryObjectBuilder buider) { + assert binaryMarshaller(); + assert buider instanceof BinaryObjectBuilderImpl; + + BinaryObjectBuilderImpl builder0 = (BinaryObjectBuilderImpl)buider; + + if (!customAffinityMapper()) { + CacheDefaultBinaryAffinityKeyMapper mapper = + (CacheDefaultBinaryAffinityKeyMapper)cacheObjCtx.defaultAffMapper(); + + BinaryField field = mapper.affinityKeyField(builder0.typeId()); + + if (field != null) { + String fieldName = field.name(); + + builder0.affinityFieldName(fieldName); + } + } + } + /** {@inheritDoc} */ @Override public void writeExternal(ObjectOutput out) throws IOException { U.writeString(out, igniteInstanceName()); diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java index 98d123f4f9dec..40ff38b8c671a 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java @@ -633,7 +633,7 @@ private UpdateResult doUpdate(UpdatePlan plan, Iterable> cursor, int pag if (bin && hasProps) { assert newVal instanceof BinaryObjectBuilder; - newVal = ((BinaryObjectBuilder) newVal).build(); + newVal = ((BinaryObjectBuilder)newVal).build(); } Object srcVal = e.get(1); @@ -1005,10 +1005,10 @@ private static PageProcessingResult processPage(GridCacheContext cctx, if (cctx.binaryMarshaller()) { if (key instanceof BinaryObjectBuilder) - key = ((BinaryObjectBuilder) key).build(); + key = ((BinaryObjectBuilder)key).build(); if (val instanceof BinaryObjectBuilder) - val = ((BinaryObjectBuilder) val).build(); + val = ((BinaryObjectBuilder)val).build(); } return new IgniteBiTuple<>(key, val); diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java index 22c3e3357cd8d..44a38647002d6 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java @@ -24,6 +24,7 @@ import javax.cache.CacheException; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.binary.BinaryObject; +import org.apache.ignite.binary.BinaryObjectBuilder; import org.apache.ignite.internal.processors.cache.GridCacheContext; import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode; import org.apache.ignite.internal.processors.query.GridQueryProperty; @@ -343,7 +344,11 @@ else if (isSqlType) BinaryObject bin = cctx.grid().binary().toBinary(obj); - return cctx.grid().binary().builder(bin); + BinaryObjectBuilder builder = cctx.grid().binary().builder(bin); + + cctx.prepareAffinityField(builder); + + return builder; } }; } @@ -352,6 +357,10 @@ else if (isSqlType) return new KeyValueSupplier() { /** {@inheritDoc} */ @Override public Object apply(List arg) throws IgniteCheckedException { + BinaryObjectBuilder builder = cctx.grid().binary().builder(typeName); + + cctx.prepareAffinityField(builder); + return cctx.grid().binary().builder(typeName); } }; From a491d1d607560ffa25f4e4021ba731adbccc482a Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 14:06:05 +0300 Subject: [PATCH 16/26] WIP. --- .../internal/binary/builder/BinaryObjectBuilderImpl.java | 2 +- .../cacheobject/IgniteCacheObjectProcessorImpl.java | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java index 26684dc44324b..fa9f1c3e54dea 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java @@ -355,7 +355,7 @@ else if (readCache == null) { String affFieldName0 = affFieldName; if (affFieldName0 == null) - ctx.affinityKeyFieldName(typeId); + affFieldName0 = ctx.affinityKeyFieldName(typeId); ctx.updateMetadata(typeId, new BinaryMetadata(typeId, typeName, fieldsMeta, affFieldName0, Collections.singleton(curSchema), false, null)); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java index de9256c9b1419..67e14dc084d81 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java @@ -81,11 +81,6 @@ public IgniteCacheObjectProcessorImpl(GridKernalContext ctx) { super(ctx); } - /** {@inheritDoc} */ - @Override public String affinityField(String keyType) { - return null; - } - /** {@inheritDoc} */ @Override public IgniteBinary binary() { return noOpBinary; From 5665fe2c0e7583f0cc80f3d1a63af7d9011f5e27 Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 14:10:12 +0300 Subject: [PATCH 17/26] Appears to work somehow. --- .../internal/processors/query/h2/dml/UpdatePlanBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java index 44a38647002d6..b304109993ca9 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java @@ -361,7 +361,7 @@ else if (isSqlType) cctx.prepareAffinityField(builder); - return cctx.grid().binary().builder(typeName); + return builder; } }; } From ec175880c753f8f70fb66e7c9428c6bcad364ad6 Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 14:16:29 +0300 Subject: [PATCH 18/26] Fixes. --- .../ignite/internal/processors/query/GridQueryProcessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java index d88f062d43254..01f745d9de4d6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java @@ -1323,7 +1323,7 @@ else if (QueryUtils.TEMPLATE_REPLICÄTED.equalsIgnoreCase(templateName)) ccfg.setQueryEntities(Collections.singleton(entity)); if (affinityKey != null) - ccfg.setKeyConfiguration(new CacheKeyConfiguration(entity.getValueType(), affinityKey)); + ccfg.setKeyConfiguration(new CacheKeyConfiguration(entity.getKeyType(), affinityKey)); boolean res; From 4d50bc5d9020135e06a7c9d3b9dde6337eec4b9c Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 14:26:57 +0300 Subject: [PATCH 19/26] Fixing tests. --- .../internal/processors/query/IgniteSqlRoutingTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlRoutingTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlRoutingTest.java index fddd3f4b78c21..ffd6318612b13 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlRoutingTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlRoutingTest.java @@ -69,6 +69,7 @@ public class IgniteSqlRoutingTest extends GridCommonAbstractTest { private static String FINAL_QRY_PARAM = "Abracadabra"; /** {@inheritDoc} */ + @SuppressWarnings("ConstantConditions") @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception { IgniteConfiguration c = super.getConfiguration(gridName); @@ -88,15 +89,13 @@ public class IgniteSqlRoutingTest extends GridCommonAbstractTest { ccfgs.add(ccfg); ccfgs.add(buildCacheConfiguration(CACHE_PERSON)); - ccfgs.add(buildCacheConfiguration(CACHE_CALL)); + ccfgs.add(buildCacheConfiguration(CACHE_CALL).setKeyConfiguration(new CacheKeyConfiguration(CallKey.class))); c.setCacheConfiguration(ccfgs.toArray(new CacheConfiguration[ccfgs.size()])); if (gridName.equals(NODE_CLIENT)) c.setClientMode(true); - c.setCacheKeyConfiguration(new CacheKeyConfiguration(CallKey.class)); - return c; } From 9686fbaf4f082bac0a49d54fde86f2a1137e26a0 Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 14:37:07 +0300 Subject: [PATCH 20/26] Fixing tests. --- .../cache/CacheDefaultBinaryAffinityKeyMapper.java | 10 ++++++---- .../cache/binary/CacheObjectBinaryProcessorImpl.java | 6 ++---- .../processors/query/IgniteSqlRoutingTest.java | 5 +++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheDefaultBinaryAffinityKeyMapper.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheDefaultBinaryAffinityKeyMapper.java index b7264332a4925..43506873fb427 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheDefaultBinaryAffinityKeyMapper.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheDefaultBinaryAffinityKeyMapper.java @@ -77,9 +77,6 @@ public CacheDefaultBinaryAffinityKeyMapper(@Nullable CacheKeyConfiguration[] cac BinaryField affField = affinityKeyField(key0.typeId()); - if (affField == null) - affField = proc.affinityKeyField(key0); - if (affField != null) { Object res = affField.value(key0); @@ -131,7 +128,12 @@ public CacheDefaultBinaryAffinityKeyMapper(@Nullable CacheKeyConfiguration[] cac typeIdAffFields = typeIdAffFields0; } - return typeIdAffFields0.get(typeId); + BinaryField res = typeIdAffFields0.get(typeId); + + if (res == null) + res = proc.affinityKeyField(typeId); + + return res; } /** {@inheritDoc} */ 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 bf456c7a8d536..5b35a66175f61 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 @@ -630,13 +630,11 @@ public GridBinaryMarshaller marshaller() { /** * Get affinity key field. * - * @param po Binary object. + * @param typeId Binary object type ID. * @return Affinity key. */ - public BinaryField affinityKeyField(BinaryObjectEx po) { + public BinaryField affinityKeyField(int typeId) { // Fast path for already cached field. - int typeId = po.typeId(); - T1 fieldHolder = affKeyFields.get(typeId); if (fieldHolder != null) diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlRoutingTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlRoutingTest.java index ffd6318612b13..fddd3f4b78c21 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlRoutingTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlRoutingTest.java @@ -69,7 +69,6 @@ public class IgniteSqlRoutingTest extends GridCommonAbstractTest { private static String FINAL_QRY_PARAM = "Abracadabra"; /** {@inheritDoc} */ - @SuppressWarnings("ConstantConditions") @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception { IgniteConfiguration c = super.getConfiguration(gridName); @@ -89,13 +88,15 @@ public class IgniteSqlRoutingTest extends GridCommonAbstractTest { ccfgs.add(ccfg); ccfgs.add(buildCacheConfiguration(CACHE_PERSON)); - ccfgs.add(buildCacheConfiguration(CACHE_CALL).setKeyConfiguration(new CacheKeyConfiguration(CallKey.class))); + ccfgs.add(buildCacheConfiguration(CACHE_CALL)); c.setCacheConfiguration(ccfgs.toArray(new CacheConfiguration[ccfgs.size()])); if (gridName.equals(NODE_CLIENT)) c.setClientMode(true); + c.setCacheKeyConfiguration(new CacheKeyConfiguration(CallKey.class)); + return c; } From da1e917858a117383d0974fca0e16292497c3c45 Mon Sep 17 00:00:00 2001 From: devozerov Date: Fri, 9 Jun 2017 20:14:21 +0300 Subject: [PATCH 21/26] Fixed NPE in BinaryContext. --- .../java/org/apache/ignite/internal/binary/BinaryContext.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java index 76c5a5059cd5a..26cf2ab086693 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java @@ -1247,7 +1247,7 @@ public String affinityKeyFieldName(int typeId) { String res = affKeyFieldNames.get(typeId); if (res == null) { - BinaryMetadata meta = metaHnd.metadata0(typeId); + BinaryType meta = metaHnd.metadata(typeId); if (meta != null) res = meta.affinityKeyFieldName(); From 67c957805e8563f209a861d47353eb4942b1b99a Mon Sep 17 00:00:00 2001 From: devozerov Date: Tue, 13 Jun 2017 09:55:46 +0300 Subject: [PATCH 22/26] Correct NPE fix. --- .../ignite/internal/binary/BinaryCachingMetadataHandler.java | 4 +++- .../java/org/apache/ignite/internal/binary/BinaryContext.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryCachingMetadataHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryCachingMetadataHandler.java index 27cccaa876331..26dc4c44db5d1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryCachingMetadataHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryCachingMetadataHandler.java @@ -70,7 +70,9 @@ private BinaryCachingMetadataHandler() { /** {@inheritDoc} */ @Override public synchronized BinaryMetadata metadata0(int typeId) throws BinaryObjectException { - return ((BinaryTypeImpl)metas.get(typeId)).metadata(); + BinaryTypeImpl type = (BinaryTypeImpl)metas.get(typeId); + + return type != null ? type.metadata() : null; } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java index 26cf2ab086693..76c5a5059cd5a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java @@ -1247,7 +1247,7 @@ public String affinityKeyFieldName(int typeId) { String res = affKeyFieldNames.get(typeId); if (res == null) { - BinaryType meta = metaHnd.metadata(typeId); + BinaryMetadata meta = metaHnd.metadata0(typeId); if (meta != null) res = meta.affinityKeyFieldName(); From 18be14a6f9a9a4fac35a406e5c51fc9acee6dff7 Mon Sep 17 00:00:00 2001 From: devozerov Date: Tue, 13 Jun 2017 10:20:00 +0300 Subject: [PATCH 23/26] Fixing tests. --- ...faultBinaryMappersBinaryMetaDataSelfTest.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/GridDefaultBinaryMappersBinaryMetaDataSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/GridDefaultBinaryMappersBinaryMetaDataSelfTest.java index 0e3f79973b473..06fb3f4c00757 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/binary/GridDefaultBinaryMappersBinaryMetaDataSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/GridDefaultBinaryMappersBinaryMetaDataSelfTest.java @@ -150,22 +150,6 @@ else if (expectedTypeName(TestObject2.class.getName()).equals(meta.typeName())) else assert false : meta.typeName(); } - - grid().cache(DEFAULT_CACHE_NAME).put(new AffinityKey<>(1, 1), 1); - - metas = binaries().types(); - - assertEquals(3, metas.size()); - - for (BinaryType meta : metas) { - if (AffinityKey.class.getSimpleName().equals(meta.typeName())) { - assertEquals("affKey", meta.affinityKeyFieldName()); - - return; - } - } - - fail("Failed to find metadata for AffinityKey"); } /** From 6646233163c4354e6c72a6da9682378e081da96b Mon Sep 17 00:00:00 2001 From: devozerov Date: Tue, 13 Jun 2017 10:51:09 +0300 Subject: [PATCH 24/26] Fixed 150 clients test. --- .../cache/distributed/IgniteCache150ClientsTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCache150ClientsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCache150ClientsTest.java index 3864fc562926c..181ddce849842 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCache150ClientsTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCache150ClientsTest.java @@ -26,6 +26,7 @@ import org.apache.ignite.IgniteCache; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.configuration.SqlConnectorConfiguration; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.util.typedef.G; import org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi; @@ -71,6 +72,8 @@ public class IgniteCache150ClientsTest extends GridCommonAbstractTest { cfg.setClientFailureDetectionTimeout(200000); cfg.setClientMode(!igniteInstanceName.equals(getTestIgniteInstanceName(0))); + cfg.setSqlConnectorConfiguration(new SqlConnectorConfiguration().setPortRange(1000)); + CacheConfiguration[] ccfgs = new CacheConfiguration[CACHES]; for (int i = 0 ; i < ccfgs.length; i++) { From 6ae00bc4ca43ead20ef7aaf3f3b447a89e86b307 Mon Sep 17 00:00:00 2001 From: devozerov Date: Tue, 13 Jun 2017 14:18:13 +0300 Subject: [PATCH 25/26] Fixed affintiy key calculation for QueryEntity. --- .../configuration/CacheConfiguration.java | 51 +++++++++++++++++++ .../ignite/internal/binary/BinaryContext.java | 2 +- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java index 9c9361fd29ca4..670046f508436 100644 --- a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java @@ -66,6 +66,7 @@ import org.apache.ignite.cache.store.CacheStore; import org.apache.ignite.cache.store.CacheStoreSessionListener; import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.internal.binary.BinaryContext; import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor; import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.util.tostring.GridToStringExclude; @@ -1783,6 +1784,37 @@ public CacheConfiguration setIndexedTypes(Class... indexedTypes) { if (!dup) qryEntities.add(converted); + + // Set key configuration if needed. + String affFieldName = desc.affinityFieldName(); + + if (affFieldName != null) { + CacheKeyConfiguration newKeyCfg = new CacheKeyConfiguration(converted.getKeyType(), affFieldName); + + if (F.isEmpty(keyCfg)) + keyCfg = new CacheKeyConfiguration[] { newKeyCfg }; + else { + boolean keyCfgDup = false; + + for (CacheKeyConfiguration oldKeyCfg : keyCfg) { + if (F.eq(oldKeyCfg.getTypeName(), newKeyCfg.getTypeName())) { + keyCfgDup = true; + + break; + } + } + + if (!keyCfgDup) { + CacheKeyConfiguration[] keyCfg0 = new CacheKeyConfiguration[keyCfg.length + 1]; + + System.arraycopy(keyCfg, 0, keyCfg0, 0, keyCfg.length); + + keyCfg0[keyCfg0.length - 1] = newKeyCfg; + + keyCfg = keyCfg0; + } + } + } } return this; @@ -2110,6 +2142,8 @@ static TypeDescriptor processKeyAndValueClasses( d.keyClass(keyCls); d.valueClass(valCls); + d.affinityFieldName(BinaryContext.affinityFieldName(keyCls)); + processAnnotationsInClass(true, d.keyCls, d, null); processAnnotationsInClass(false, d.valCls, d, null); @@ -2374,6 +2408,9 @@ private static class TypeDescriptor { /** */ private boolean valTextIdx; + /** Affinity field name. */ + private String affFieldName; + /** * @return Indexes. */ @@ -2474,6 +2511,20 @@ void keyClass(Class keyCls) { this.keyCls = keyCls; } + /** + * @return Affinity field name. + */ + @Nullable public String affinityFieldName() { + return affFieldName; + } + + /** + * @param affFieldName Affinity field name. + */ + private void affinityFieldName(@Nullable String affFieldName) { + this.affFieldName = affFieldName; + } + /** * Adds property to the type descriptor. * diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java index 76c5a5059cd5a..fa051f56913c7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java @@ -1026,7 +1026,7 @@ public String userTypeName(String clsName) { * @param cls Class to get affinity field for. * @return Affinity field name or {@code null} if field name was not found. */ - private String affinityFieldName(Class cls) { + public static String affinityFieldName(Class cls) { for (; cls != Object.class && cls != null; cls = cls.getSuperclass()) { for (Field f : cls.getDeclaredFields()) { if (f.getAnnotation(AffinityKeyMapped.class) != null) From be909d083655a50bc375e15155c0dd062d3e20c2 Mon Sep 17 00:00:00 2001 From: devozerov Date: Tue, 13 Jun 2017 14:34:03 +0300 Subject: [PATCH 26/26] Minors. --- .../processors/query/h2/DmlStatementsProcessor.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java index 40ff38b8c671a..98d123f4f9dec 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java @@ -633,7 +633,7 @@ private UpdateResult doUpdate(UpdatePlan plan, Iterable> cursor, int pag if (bin && hasProps) { assert newVal instanceof BinaryObjectBuilder; - newVal = ((BinaryObjectBuilder)newVal).build(); + newVal = ((BinaryObjectBuilder) newVal).build(); } Object srcVal = e.get(1); @@ -1005,10 +1005,10 @@ private static PageProcessingResult processPage(GridCacheContext cctx, if (cctx.binaryMarshaller()) { if (key instanceof BinaryObjectBuilder) - key = ((BinaryObjectBuilder)key).build(); + key = ((BinaryObjectBuilder) key).build(); if (val instanceof BinaryObjectBuilder) - val = ((BinaryObjectBuilder)val).build(); + val = ((BinaryObjectBuilder) val).build(); } return new IgniteBiTuple<>(key, val);