]
Work on ISPN-5174 started by Dan Berindei.
------------------------------------------
Transaction cannot be recommitted after ownership changes
---------------------------------------------------------
Key: ISPN-5174
URL:
https://issues.jboss.org/browse/ISPN-5174
Project: Infinispan
Issue Type: Bug
Components: Core
Affects Versions: 7.1.0.CR2
Reporter: Radim Vansa
Assignee: Dan Berindei
Priority: Critical
Once transaction is completed, it cannot commit again. If it should commit more keys
since it has become an owner of some new keys modified in this transaction, it just
ignores the further commit.
There is a race with state transfer which can bring an old value (with
StateResponseCommand sent before it is commited) but the value is not set by the ongoing
transaction either.
This results with stale value stored on one node.
In my case, The problematic part is transaction <edg-perf01-62141>:15066
(consisting of 10 modifications) which got prepared and committed on edg-perf04 in
topology 25. Before the originator finishes, topology changes and 04 requests ongoing
transactions:
{code}
11:06:11,369 TRACE [org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher]
(transport-thread-17) Replication task sending StateRequestCommand{cache=testCache,
origin=edg-perf04-35097, type=GET_TRANSACTIONS, topologyId=28, segments=[275, 1, 278, 9,
282, 286, 17, 259, 25, 267, 171, 169, 33, 306, 175, 173, 310, 172, 314, 41, 167, 165, 318,
187, 290, 49, 185, 191, 294, 189, 179, 298, 57, 177, 183, 302, 181, 343, 205, 201, 338,
203, 336, 351, 197, 349, 199, 347, 193, 345, 195, 326, 85, 87, 322, 93, 332, 95, 330, 89,
91, 103, 101, 99, 506, 97, 105, 357, 359, 353, 355, 361]} to single recipient
edg-perf01-62141 with response mode GET_ALL
11:06:11,495 DEBUG [org.infinispan.statetransfer.StateConsumerImpl] (transport-thread-17)
Applying 6 transactions for cache testCache transferred from node edg-perf01-62141
{code}
However I don't see how these are applied, since PrepareCommand is not created again
- from the code I see only that backup locks are added. Not sure if the transaction is
registered at all, since it was already completed on this node (but at that time it did
not own key_00000000000002EB).
After originator stores the entry, it sends one more CommitCommand with topology 28:
{code}
11:06:11,619 TRACE [org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher]
(DefaultStressor-2) Replication task sending CommitCommand
{gtx=GlobalTransaction:<edg-perf01-62141>:15066:local,
cacheName='testCache', topologyId=28} to addresses [edg-perf03-20530,
edg-perf04-35097] with response mode GET_ALL
{code}
04 receives several CommitCommands (both from originator and forwards), but all of them
are ignored as the transaction is completed.
I don't see the logs where state transfer is assembled, but it's probably before
the entry is stored on originator as the state transfer contains the old entry:
{code}
11:06:13,449 TRACE [org.infinispan.statetransfer.StateConsumerImpl] (remote-thread-91)
Received chunk with keys [key_000000000000065B, key_00000000000006BE,
key_FFFFFFFFFFFFE62F, key_0000000000001F42, key_000000000000027B, key_000000000000159D,
key_00000000000002EB, key_00000000000002BB] for segment 343 of cache testCache from node
edg-perf01-62141
11:06:13,454 TRACE [org.infinispan.container.DefaultDataContainer] (remote-thread-91)
Store ImmortalCacheEntry{key=key_00000000000002EB, value=[2 #7: 366, 544, 576, 804, 1061,
1181, 1290, ]} in container
{code}