[ https://issues.apache.org/jira/browse/IGNITE-3505?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Alexei Scherbakov updated IGNITE-3505: -------------------------------------- Description: BinaryObject can't be reused as key between caches because it's actual implementation BinaryObjectImpl implements KeyCacheObject and due to the fact caches partition, which is not recalculated later. See org.apache.ignite.internal.processors.cache.GridCacheAffinityManager.partition: {code} if (key instanceof KeyCacheObject && ((KeyCacheObject)key).partition() != -1) return ((KeyCacheObject)key).partition(); {code} The issue can be reproduced with the following code: {code} public static void main(String[] args) throws IgniteException { IgniteConfiguration cfg = new IgniteConfiguration(); cfg.setDiscoverySpi(new TcpDiscoverySpi().setIpFinder(new TcpDiscoveryVmIpFinder(true))); Ignite ignite = Ignition.start(cfg); CacheConfiguration<BinaryObject, BinaryObject> cfg1 = new CacheConfiguration<>("Cache 1"); cfg1.setCacheMode(CacheMode.PARTITIONED); cfg1.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL); IgniteCache<BinaryObject, BinaryObject> cache1 = ignite.getOrCreateCache(cfg1).withKeepBinary(); CacheConfiguration<BinaryObject, BinaryObject> cfg2 = new CacheConfiguration<>("Cache 2"); cfg2.setCacheMode(CacheMode.REPLICATED); cfg2.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC); IgniteCache<BinaryObject, BinaryObject> cache2 = ignite.getOrCreateCache(cfg2); BinaryObjectBuilder keyBuilder = ignite.binary().builder("keyType") .setField("F1", "V1").hashCode("V1".hashCode()); BinaryObjectBuilder valBuilder = ignite.binary().builder("valueType") .setField("F2", "V2") .setField("F3", "V3"); BinaryObject key = keyBuilder.build(); BinaryObject val = valBuilder.build(); cache1.put(key, val); cache2.put(key, val); // error System.out.println(cache1.get(key)); // error System.out.println(cache2.get(key)); } {code} Corresponding user list thread: http://apache-ignite-users.70518.x6.nabble.com/Adding-a-binary-object-to-two-caches-fails-with-FULL-SYNC-write-mode-configured-for-the-replicated-ce-tp6343p6366.html was: BinaryObject can't be reused as key between caches because it's actual implementation BinaryObjectImpl implements KeyCacheObject and due to the fact caches partition, which is not recalculated later. See org.apache.ignite.internal.processors.cache.GridCacheAffinityManager.partition: {code} if (key instanceof KeyCacheObject && ((KeyCacheObject)key).partition() != -1) return ((KeyCacheObject)key).partition(); {code} The issue can be reproduced with the following code: {code} public static void main(String[] args) throws IgniteException { IgniteConfiguration cfg = new IgniteConfiguration(); cfg.setDiscoverySpi(new TcpDiscoverySpi().setIpFinder(new TcpDiscoveryVmIpFinder(true))); Ignite ignite = Ignition.start(cfg); CacheConfiguration<BinaryObject, BinaryObject> cfg1 = new CacheConfiguration<>("Cache 1"); cfg1.setCacheMode(CacheMode.PARTITIONED); cfg1.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL); IgniteCache<BinaryObject, BinaryObject> cache1 = ignite.getOrCreateCache(cfg1).withKeepBinary(); CacheConfiguration<BinaryObject, BinaryObject> cfg2 = new CacheConfiguration<>("Cache 2"); cfg2.setCacheMode(CacheMode.REPLICATED); cfg2.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC); IgniteCache<BinaryObject, BinaryObject> cache2 = ignite.getOrCreateCache(cfg2); BinaryObjectBuilder keyBuilder = ignite.binary().builder("keyType") .setField("F1", "V1").hashCode("V1".hashCode()); BinaryObjectBuilder valBuilder = ignite.binary().builder("valueType") .setField("F2", "V2") .setField("F3", "V3"); BinaryObject key = keyBuilder.build(); BinaryObject val = valBuilder.build(); cache1.put(key, val); cache2.put(key, val); // error System.out.println(cache1.get(key)); // error System.out.println(cache2.get(key)); } {code} > BinaryObject keys can't be reused because of partition caching. > --------------------------------------------------------------- > > Key: IGNITE-3505 > URL: https://issues.apache.org/jira/browse/IGNITE-3505 > Project: Ignite > Issue Type: Bug > Affects Versions: 1.6 > Reporter: Alexei Scherbakov > Assignee: Denis Magda > Fix For: 1.7 > > > BinaryObject can't be reused as key between caches because it's > actual implementation BinaryObjectImpl implements KeyCacheObject and > due to the fact caches partition, which is not recalculated later. > See > org.apache.ignite.internal.processors.cache.GridCacheAffinityManager.partition: > {code} > if (key instanceof KeyCacheObject && ((KeyCacheObject)key).partition() != -1) > return ((KeyCacheObject)key).partition(); > {code} > The issue can be reproduced with the following code: > {code} > public static void main(String[] args) throws IgniteException { > IgniteConfiguration cfg = new IgniteConfiguration(); > cfg.setDiscoverySpi(new TcpDiscoverySpi().setIpFinder(new > TcpDiscoveryVmIpFinder(true))); > Ignite ignite = Ignition.start(cfg); > CacheConfiguration<BinaryObject, BinaryObject> cfg1 = new > CacheConfiguration<>("Cache 1"); > cfg1.setCacheMode(CacheMode.PARTITIONED); > cfg1.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL); > IgniteCache<BinaryObject, BinaryObject> cache1 = > ignite.getOrCreateCache(cfg1).withKeepBinary(); > CacheConfiguration<BinaryObject, BinaryObject> cfg2 = new > CacheConfiguration<>("Cache 2"); > cfg2.setCacheMode(CacheMode.REPLICATED); > > cfg2.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC); > IgniteCache<BinaryObject, BinaryObject> cache2 = > ignite.getOrCreateCache(cfg2); > BinaryObjectBuilder keyBuilder = ignite.binary().builder("keyType") > .setField("F1", "V1").hashCode("V1".hashCode()); > BinaryObjectBuilder valBuilder = ignite.binary().builder("valueType") > .setField("F2", "V2") > .setField("F3", "V3"); > BinaryObject key = keyBuilder.build(); > BinaryObject val = valBuilder.build(); > cache1.put(key, val); > cache2.put(key, val); // error > System.out.println(cache1.get(key)); // error > System.out.println(cache2.get(key)); > } > {code} > Corresponding user list thread: > http://apache-ignite-users.70518.x6.nabble.com/Adding-a-binary-object-to-two-caches-fails-with-FULL-SYNC-write-mode-configured-for-the-replicated-ce-tp6343p6366.html -- This message was sent by Atlassian JIRA (v6.3.4#6332)