]
Dan Berindei commented on ISPN-3130:
------------------------------------
The problem was at a higher level: StateConsumerImpl.cancelTransfers was supposed to
remove the cancelled segments from the transfersBySegment map, but it only removed one of
them. When another thread tried to cancel the same segments, it found the
already-cancelled segments in the map and tried to cancel them again.
Cancelling an InboundTransferTask should be idempotent
------------------------------------------------------
Key: ISPN-3130
URL:
https://issues.jboss.org/browse/ISPN-3130
Project: Infinispan
Issue Type: Bug
Components: State transfer
Affects Versions: 5.2.6.Final
Reporter: Dan Berindei
Assignee: Dan Berindei
Fix For: 5.2.7.Final, 5.3.0.Final
When installing a new topology, it's possible for the
{{StateConsumerImpl.cancelSegments}} method to fail with an {{IllegalArgumentException}}:
{code}
05:43:56,513 WARN [org.infinispan.topology.CacheTopologyControlCommand]
(notification-thread-0) ISPN000071: Caught exception when handling command
CacheTopologyControlCommand{cache=default-host/clusterbench, type=CH_UPDATE,
sender=perf21/web, joinInfo=null, topologyId=23,
currentCH=DefaultConsistentHash{numSegments=80, numOwners=2, members=[perf21/web,
perf18/web, perf19/web]}, pendingCH=null, throwable=null, viewId=8}:
java.lang.IllegalArgumentException: The task is already cancelled.
at
org.infinispan.statetransfer.InboundTransferTask.cancelSegments(InboundTransferTask.java:167)
at
org.infinispan.statetransfer.StateConsumerImpl.cancelTransfers(StateConsumerImpl.java:774)
at
org.infinispan.statetransfer.StateConsumerImpl.onTopologyUpdate(StateConsumerImpl.java:314)
at
org.infinispan.statetransfer.StateTransferManagerImpl.doTopologyUpdate(StateTransferManagerImpl.java:195)
at
org.infinispan.statetransfer.StateTransferManagerImpl.access$000(StateTransferManagerImpl.java:61)
at
org.infinispan.statetransfer.StateTransferManagerImpl$1.updateConsistentHash(StateTransferManagerImpl.java:121)
at
org.infinispan.topology.LocalTopologyManagerImpl.handleConsistentHashUpdate(LocalTopologyManagerImpl.java:202)
at
org.infinispan.topology.CacheTopologyControlCommand.doPerform(CacheTopologyControlCommand.java:165)
at
org.infinispan.topology.CacheTopologyControlCommand.perform(CacheTopologyControlCommand.java:137)
at
org.infinispan.topology.ClusterTopologyManagerImpl.executeOnClusterSync(ClusterTopologyManagerImpl.java:540)
at
org.infinispan.topology.ClusterTopologyManagerImpl.broadcastConsistentHashUpdate(ClusterTopologyManagerImpl.java:332)
at
org.infinispan.topology.ClusterTopologyManagerImpl.updateCacheStatusAfterMerge(ClusterTopologyManagerImpl.java:319)
at
org.infinispan.topology.ClusterTopologyManagerImpl.handleNewView(ClusterTopologyManagerImpl.java:236)
at
org.infinispan.topology.ClusterTopologyManagerImpl$ClusterViewListener.handleViewChange(ClusterTopologyManagerImpl.java:579)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.6.0_43]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[rt.jar:1.6.0_43]
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[rt.jar:1.6.0_43]
at java.lang.reflect.Method.invoke(Method.java:597) [rt.jar:1.6.0_43]
at
org.infinispan.notifications.AbstractListenerImpl$ListenerInvocation$1.run(AbstractListenerImpl.java:212)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
[rt.jar:1.6.0_43]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
[rt.jar:1.6.0_43]
at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_43]
{code}
Instead, it should just log a message and ignore the cancel request.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: