[ https://issues.apache.org/jira/browse/IGNITE-1122?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Valentin Kulichenko updated IGNITE-1122: ---------------------------------------- Fix Version/s: (was: ignite-1.4) ignite-1.5 > Cache put hangs if key hashCode is implemented incorrectly > ---------------------------------------------------------- > > Key: IGNITE-1122 > URL: https://issues.apache.org/jira/browse/IGNITE-1122 > Project: Ignite > Issue Type: Bug > Components: cache > Affects Versions: 1.1.4 > Reporter: Valentin Kulichenko > Assignee: Valentin Kulichenko > Priority: Critical > Labels: Usability > Fix For: ignite-1.5 > > > If key {{hashCode()}} returns inconsistent result (e.g., user used > {{Enum.hashCode()}} in his implementation), the exception below is thrown on > a server node and put operation hangs. > {code} > SEVERE: Future execution resulted in error: GridEmbeddedFuture > [embedded=GridFinishedFuture [resFlag=2, startTime=1436797251202]] > class org.apache.ignite.IgniteCheckedException: Creating partition which does > not belong [part=118, topVer=AffinityTopologyVersion [topVer=5, > minorTopVer=4], this.topVer=AffinityTopologyVersion [topVer=5, minorTopVer=4]] > at > org.apache.ignite.internal.util.IgniteUtils.cast(IgniteUtils.java:6753) > at > org.apache.ignite.internal.util.future.GridFutureAdapter.get(GridFutureAdapter.java:124) > at > org.apache.ignite.internal.processors.cache.GridCacheUtils$22.apply(GridCacheUtils.java:851) > at > org.apache.ignite.internal.processors.cache.GridCacheUtils$22.apply(GridCacheUtils.java:848) > at > org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListener(GridFutureAdapter.java:241) > at > org.apache.ignite.internal.util.future.GridFutureAdapter.listen(GridFutureAdapter.java:204) > at > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter.processNearLockRequest(GridDhtTransactionalCacheAdapter.java:525) > at > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter.access$000(GridDhtTransactionalCacheAdapter.java:52) > at > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$2.apply(GridDhtTransactionalCacheAdapter.java:96) > at > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$2.apply(GridDhtTransactionalCacheAdapter.java:94) > at > org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:532) > at > org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:240) > at > org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:158) > at > org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$000(GridCacheIoManager.java:48) > at > org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:127) > at > org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:690) > at > org.apache.ignite.internal.managers.communication.GridIoManager.access$1500(GridIoManager.java:58) > at > org.apache.ignite.internal.managers.communication.GridIoManager$5.run(GridIoManager.java:653) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at java.lang.Thread.run(Thread.java:745) > Caused by: class > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtInvalidPartitionException > [part=118, msg=Creating partition which does not belong [part=118, > topVer=AffinityTopologyVersion [topVer=5, minorTopVer=4], > this.topVer=AffinityTopologyVersion [topVer=5, minorTopVer=4]]] > at > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionTopologyImpl.localPartition(GridDhtPartitionTopologyImpl.java:527) > at > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionTopologyImpl.localPartition(GridDhtPartitionTopologyImpl.java:496) > at > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionTopologyImpl.onAdded(GridDhtPartitionTopologyImpl.java:580) > at > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheEntry.<init>(GridDhtCacheEntry.java:79) > at > org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedCacheEntry.<init>(GridDhtColocatedCacheEntry.java:46) > at > org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedOffHeapCacheEntry.<init>(GridDhtColocatedOffHeapCacheEntry.java:46) > at > org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedCache$1.create(GridDhtColocatedCache.java:90) > at > org.apache.ignite.internal.processors.cache.GridCacheConcurrentMap$Segment.put0(GridCacheConcurrentMap.java:964) > at > org.apache.ignite.internal.processors.cache.GridCacheConcurrentMap$Segment.putIfObsolete(GridCacheConcurrentMap.java:1028) > at > org.apache.ignite.internal.processors.cache.GridCacheConcurrentMap.putEntryIfObsoleteOrAbsent(GridCacheConcurrentMap.java:496) > at > org.apache.ignite.internal.processors.cache.GridCacheAdapter.entry0(GridCacheAdapter.java:854) > at > org.apache.ignite.internal.processors.cache.GridCacheAdapter.entryEx(GridCacheAdapter.java:838) > at > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheAdapter.entryEx(GridDhtCacheAdapter.java:312) > at > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheAdapter.entryExx(GridDhtCacheAdapter.java:331) > at > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$9.apply(GridDhtTransactionalCacheAdapter.java:782) > at > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter$9.apply(GridDhtTransactionalCacheAdapter.java:694) > at > org.apache.ignite.internal.util.future.GridEmbeddedFuture$2.applyx(GridEmbeddedFuture.java:86) > at > org.apache.ignite.internal.util.future.GridEmbeddedFuture$AsyncListener1.apply(GridEmbeddedFuture.java:240) > at > org.apache.ignite.internal.util.future.GridEmbeddedFuture$AsyncListener1.apply(GridEmbeddedFuture.java:233) > at > org.apache.ignite.internal.util.future.GridFinishedFuture.listen(GridFinishedFuture.java:132) > at > org.apache.ignite.internal.util.future.GridEmbeddedFuture.<init>(GridEmbeddedFuture.java:83) > at > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter.lockAllAsync(GridDhtTransactionalCacheAdapter.java:693) > at > org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTransactionalCacheAdapter.processNearLockRequest(GridDhtTransactionalCacheAdapter.java:521) > ... 14 more > {code} > Need to do the following: > # Fix error message to be more explanatory. It should suggest possible > reasons (incorrect affinity configuration, wrong {{hashCode()}}, ...) and > possible solutions. > # Cache operation should not hang. Instead we should rollback the transaction > and return a response with exception to client. > # If enum itself is used as a key, we should automatically use {{ordinal()}} > instead of {{hashCode()}}. > # Add unit tests that will emulate wrong inconsistent hash code calculation > and check different cases. > # Add documentation page with good practices and pitfalls of implementing > {{hashCode()}} and {{equals()}} methods. -- This message was sent by Atlassian JIRA (v6.3.4#6332)