-
Notifications
You must be signed in to change notification settings - Fork 2.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[#4765] fix node name to be harmonized with xa node name #4806
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,13 +1,15 @@ | ||
package io.quarkus.narayana.jta.runtime; | ||
|
||
import java.lang.reflect.Field; | ||
import java.util.Collections; | ||
import java.util.Properties; | ||
|
||
import org.jboss.logging.Logger; | ||
|
||
import com.arjuna.ats.arjuna.common.CoreEnvironmentBeanException; | ||
import com.arjuna.ats.arjuna.common.arjPropertyManager; | ||
import com.arjuna.ats.arjuna.coordinator.TxControl; | ||
import com.arjuna.ats.jta.common.jtaPropertyManager; | ||
import com.arjuna.common.util.propertyservice.PropertiesFactory; | ||
|
||
import io.quarkus.runtime.annotations.Recorder; | ||
|
@@ -23,7 +25,8 @@ public void setNodeName(final TransactionManagerConfiguration transactions) { | |
|
||
try { | ||
arjPropertyManager.getCoreEnvironmentBean().setNodeIdentifier(transactions.nodeName); | ||
TxControl.setXANodeName(transactions.xaNodeName.orElse(transactions.nodeName)); | ||
jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(Collections.singletonList(transactions.nodeName)); | ||
TxControl.setXANodeName(transactions.nodeName); | ||
} catch (CoreEnvironmentBeanException e) { | ||
e.printStackTrace(); | ||
} | ||
|
@@ -46,6 +49,7 @@ public void setDefaultProperties(Properties properties) { | |
|
||
public void setDefaultTimeout(TransactionManagerConfiguration transactions) { | ||
transactions.defaultTransactionTimeout.ifPresent(defaultTimeout -> { | ||
arjPropertyManager.getCoordinatorEnvironmentBean().setDefaultTimeout((int) defaultTimeout.getSeconds()); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. +1 - could the TxControl statement immediately following be removed too do you think? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No, I assume it can't be. Just pointing that for WFLY we need to call |
||
TxControl.setDefaultTimeout((int) defaultTimeout.getSeconds()); | ||
}); | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we genuinely need the TxControl setting here? I would imagine it can be controlled through the arjPropertyManager directly?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this is the problematic issue of the whole narayana configuration. Once the
TxControl
class is first initialized (and that's decision of the JVM, not possible to be influence. normally theTxControl
is initialized as class when accessed first time) then any change done in thearjPropertyManager
has no effect for the further use.As we can't be sure what setter is started first or where the
TxControl
data is needed for the first time during Quarkus startup I consider this as the safe way (or maybe even necessary).A bit related point is that I created a jira about rethinking the configuration of the whole Narayana. That came from discussion with @mmusgrov, here https://issues.jboss.org/browse/JBTM-3215
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What we do have to be certain of is there are no transactions that could be created before this is called and indeed the recovery manager has not started running before it. Are you sure that is the case?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, I'm not sure if it's the case.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I assume that this code must run before the transaction service is created? In which case I would expect no transactions could be created before this runs? Or is that not the case in Quarkus? IOW could there be a transaction created with the default (non-unique) node ID and that could therefore lead to data integrity issue?
/cc @mmusgrov
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@tomjenkinson the need of use
TxControl.setXANodeName
is not caused by time when the transaction service is created. The need is caused by the fact that we can't be sure that nobody else calls theTxControl
setter
. When it happens then all data are initialized. When this method is called after thesetter
was used before then changes in thebean
have no effect.In summary, by me the
TxControl
call is needed here.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for confirming. I suppose you are less concerned about the setter being called (which as you say it is public) but rather when the class is loaded it will read the value as set in the arjPropertyManager: https://github.com/jbosstm/narayana/blob/master/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TxControl.java#L238
In that case, I understand the point - thanks!