]
Michael Musgrove commented on WFLY-12317:
-----------------------------------------
The problem is that many of our properties are statically initialised and are read once at
boot time. The "node-identifier" is one such property and it is statically
initialised
(
).
We cannot just make every property dynamic since some properties are dependent on each
other and setting one can introduce race conditions (with for example periodic recovery)
so we could only do that through careful analysis and I doubt the benefits are worth
while.
The node-identifier model attribute
(
)
should be set to RESTART_JVM not reload.
The failing test is testing that another server is able to recover logs from another
server. We do support this type of "proxy recovery" but the relevant attribute
is not exposed in the management model
(
),
My recommendation is to:
- change the test to perform a JVM restart instead of a reload.
- update the WildFly management model attribute to require a JVM restart when it is set
Using JTA transaction's node_name attribute is set to an old
value after node-identifier is changed
---------------------------------------------------------------------------------------------------
Key: WFLY-12317
URL:
https://issues.jboss.org/browse/WFLY-12317
Project: WildFly
Issue Type: Bug
Components: Transactions
Affects Versions: 17.0.0.Final
Reporter: Ivan Straka
Assignee: Michael Musgrove
Priority: Critical
Attachments:
server1_TxDifferentNodeCrashRecoveryTestCase_prepareHalt_jta_server.log,
server2_TxDifferentNodeCrashRecoveryTestCase_prepareHalt_jta_server.log
We have following test scenario (3 servers) that fails:
# node-identifier of server1, 2 & 3 is set to 'vkcd', 'FdOu' and
'GocW' (ts.jbosstsX.node.identifier property)
# server2 is started, node-identifier is set to txdifferentnodeid and server2 is
stopped
# server1 is started, node-identifier is set to txdifferentnodeid and server1 is
reloaded
# server3 is running
# client call an EJB bean (where a transaction is started) on the server1
# the EJB sends JMS message to the server3 (broker)
# the EJB enlists dummy xa resource
# during 2PC the Server1 is halted when prepare on dummy xa resource is invoked
# we move server1 object store directory to the server2
# server2 is started
# the server2 is expected to rollback whole transaction
Transaction is unfinished because server2 has not performed rollback.
{code:java}
prepareHalt(org.jboss.as.test.jbossts.crashrec.differentnode.test.TxDifferentNodeCrashRecoveryTestCase)
Time elapsed: 810.354 sec <<< FAILURE!
java.lang.AssertionError: Some unfinished xids on messaging server - expected 0 but was
1
at org.junit.Assert.fail(Assert.java:88)
at
org.jboss.as.test.jbossts.crashrec.differentnode.test.TxDifferentNodeCrashRecoveryTestCase.checkAfterTestExecution(TxDifferentNodeCrashRecoveryTestCase.java:792)
at
org.jboss.as.test.jbossts.crashrec.differentnode.test.TxDifferentNodeCrashRecoveryTestCase.prepareHalt(TxDifferentNodeCrashRecoveryTestCase.java:565)
{code}
In the beginning servers' node-identifier are set to some value (lets say A,B,C).
Before test execution node-identifier of server1 and server2 is set to the same value,
let's say X.
I see in logs that the transaction's node_name is set to the old value (vkcd vs
txdifferentnodeid in the example below) on server1. Thus the server2 has not performed
rollback.
See node_name
Server1:
{code:java}
2019-07-22 17:40:54,616 DEBUG [com.arjuna.ats.jta] (MSC service thread 1-5) Setting up
node identifiers '[txdifferentnodeid]' for which recovery will be performed
{code}
{code:java}
2019-07-22 17:41:11,931 TRACE [com.arjuna.ats.jta] (default task-2)
XAResourceRecord.XAResourceRecord ( < formatId=131077, gtrid_length=32,
bqual_length=36, tx_uid=0:ffff0a2804ed:26165251:5d35d902:3c, node_name=vkcd,
branch_uid=0:ffff0a2804ed:26165251:5d35d902:46, subordinatenodename=null,
eis_name=java:/JmsXA NodeId:05b492ae-ac97-11e9-a446-2016b912eaa8 >,
XAResourceWrapperImpl@4158c7ec[xaResource=org.jboss.activemq.artemis.wildfly.integration.WildFlyActiveMQXAResourceWrapper(a)4a21a45f
pad=false overrideRmValue=null productName=ActiveMQ Artemis productVersion=2.0
jndiName=java:/JmsXA NodeId:05b492ae-ac97-11e9-a446-2016b912eaa8] ), record
id=0:ffff0a2804ed:26165251:5d35d902:47
{code}
Server2:
{code:java}
2019-07-22 17:41:15,397 DEBUG [com.arjuna.ats.jta] (MSC service thread 1-3) Setting up
node identifiers '[txdifferentnodeid]' for which recovery will be performed
{code}
{code:java}
2019-07-22 17:43:56,062 DEBUG [com.arjuna.ats.jta] (Periodic Recovery) node name of <
formatId=131077, gtrid_length=32, bqual_length=36,
tx_uid=0:ffff0a2804ed:26165251:5d35d902:3c, node_name=vkcd,
branch_uid=0:ffff0a2804ed:26165251:5d35d902:46, subordinatenodename=null, eis_name=forgot
eis name for: 1 > is vkcd
2019-07-22 17:43:56,062 DEBUG [com.arjuna.ats.jta] (Periodic Recovery)
XAResourceOrphanFilter
com.arjuna.ats.internal.jta.recovery.arjunacore.JTANodeNameXAResourceOrphanFilter voted
ABSTAIN
{code}
When I run the TS with
{code:java}
-Dts.jbossts1.node.identifier=txdifferentnodeid
-Dts.jbossts2.node.identifier=txdifferentnodeid
{code}
the test passes (old and new node-identifier on both servers are same)