Skip to content

Commit

Permalink
Narayana - Switch to @ConfigMapping
Browse files Browse the repository at this point in the history
  • Loading branch information
gsmet committed Feb 4, 2025
1 parent 0742585 commit 2fbc83d
Show file tree
Hide file tree
Showing 17 changed files with 100 additions and 116 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -252,11 +252,11 @@ private void applyNewConfiguration(String dataSourceName, AgroalDataSourceConfig
TransactionIntegration txIntegration = new NarayanaTransactionIntegration(transactionManager,
transactionSynchronizationRegistry, null, false,
dataSourceJdbcBuildTimeConfig.transactions() == io.quarkus.agroal.runtime.TransactionIntegration.XA
&& transactionRuntimeConfig.enableRecovery
&& transactionRuntimeConfig.enableRecovery()
? xaResourceRecoveryRegistry
: null);
if (dataSourceJdbcBuildTimeConfig.transactions() == io.quarkus.agroal.runtime.TransactionIntegration.XA
&& !transactionRuntimeConfig.enableRecovery) {
&& !transactionRuntimeConfig.enableRecovery()) {
log.warnv(
"Datasource {0} enables XA but transaction recovery is not enabled. Please enable transaction recovery by setting quarkus.transaction-manager.enable-recovery=true, otherwise data may be lost if the application is terminated abruptly",
dataSourceName);
Expand Down
3 changes: 0 additions & 3 deletions extensions/narayana-jta/deployment/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,6 @@
<version>${project.version}</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<arg>-AlegacyConfigRoot=true</arg>
</compilerArgs>
</configuration>
</execution>
</executions>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ public void build(NarayanaJtaRecorder recorder,
builder.addBeanClass(TransactionalInterceptorNotSupported.class);
additionalBeans.produce(builder.build());

transactionManagerBuildTimeConfig.unsafeMultipleLastResources.ifPresent(mode -> {
transactionManagerBuildTimeConfig.unsafeMultipleLastResources().ifPresent(mode -> {
if (!mode.equals(UnsafeMultipleLastResourcesMode.FAIL)) {
recorder.logUnsafeMultipleLastResourcesOnStartup(mode);
}
Expand All @@ -178,7 +178,7 @@ public void build(NarayanaJtaRecorder recorder,
@BuildStep(onlyIf = NativeOrNativeSourcesBuild.class)
public void nativeImageFeature(TransactionManagerBuildTimeConfig transactionManagerBuildTimeConfig,
BuildProducer<NativeImageFeatureBuildItem> nativeImageFeatures) {
switch (transactionManagerBuildTimeConfig.unsafeMultipleLastResources
switch (transactionManagerBuildTimeConfig.unsafeMultipleLastResources()
.orElse(UnsafeMultipleLastResourcesMode.DEFAULT)) {
case ALLOW, WARN_FIRST, WARN_EACH -> {
nativeImageFeatures.produce(new NativeImageFeatureBuildItem(DisableLoggingFeature.class));
Expand Down Expand Up @@ -264,7 +264,7 @@ private void allowUnsafeMultipleLastResources(NarayanaJtaRecorder recorder,
TransactionManagerBuildTimeConfig transactionManagerBuildTimeConfig,
Capabilities capabilities, BuildProducer<LogCleanupFilterBuildItem> logCleanupFilters,
BuildProducer<NativeImageFeatureBuildItem> nativeImageFeatures) {
switch (transactionManagerBuildTimeConfig.unsafeMultipleLastResources
switch (transactionManagerBuildTimeConfig.unsafeMultipleLastResources()
.orElse(UnsafeMultipleLastResourcesMode.DEFAULT)) {
case ALLOW -> {
recorder.allowUnsafeMultipleLastResources(capabilities.isPresent(Capability.AGROAL), true);
Expand Down
3 changes: 0 additions & 3 deletions extensions/narayana-jta/runtime/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,6 @@
<version>${project.version}</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<arg>-AlegacyConfigRoot=true</arg>
</compilerArgs>
</configuration>
</execution>
</executions>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ private static void begin(RunOptionsBase options) {
try {
getUserTransaction().setTransactionTimeout(
(int) Arc.container().instance(TransactionManagerConfiguration.class)
.get().defaultTransactionTimeout.toSeconds());
.get().defaultTransactionTimeout().toSeconds());
} catch (SystemException e) {
log.error("Failed to reset transaction timeout", e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ void begin(BeginOptions options) {
if (timeout > 0) {
try {
userTransaction.setTransactionTimeout(
(int) transactionManagerConfiguration.defaultTransactionTimeout.toSeconds());
(int) transactionManagerConfiguration.defaultTransactionTimeout().toSeconds());
} catch (SystemException e) {
throw new QuarkusTransactionException(e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import jakarta.transaction.TransactionSynchronizationRegistry;
import jakarta.transaction.UserTransaction;

import org.jboss.logging.Logger;
import org.jboss.tm.JBossXATerminator;
import org.jboss.tm.XAResourceRecoveryRegistry;
import org.jboss.tm.usertx.UserTransactionRegistry;
Expand All @@ -20,7 +19,6 @@

@Dependent
public class NarayanaJtaProducers {
private static final Logger log = Logger.getLogger(NarayanaJtaProducers.class);

@Produces
@ApplicationScoped
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Base64;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Properties;
Expand Down Expand Up @@ -43,20 +42,20 @@ public class NarayanaJtaRecorder {
public void setNodeName(final TransactionManagerConfiguration transactions) {

try {
if (transactions.nodeName.getBytes(StandardCharsets.UTF_8).length > 28
&& transactions.shortenNodeNameIfNecessary) {
shortenNodeName(transactions);
String nodeName = transactions.nodeName();
if (nodeName.getBytes(StandardCharsets.UTF_8).length > 28
&& transactions.shortenNodeNameIfNecessary()) {
nodeName = shortenNodeName(transactions.nodeName());
}
arjPropertyManager.getCoreEnvironmentBean().setNodeIdentifier(transactions.nodeName);
jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(Collections.singletonList(transactions.nodeName));
TxControl.setXANodeName(transactions.nodeName);
arjPropertyManager.getCoreEnvironmentBean().setNodeIdentifier(nodeName);
jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(List.of(nodeName));
TxControl.setXANodeName(nodeName);
} catch (CoreEnvironmentBeanException | NoSuchAlgorithmException e) {
log.error("Could not set node name", e);
}
}

private static void shortenNodeName(TransactionManagerConfiguration transactions) throws NoSuchAlgorithmException {
String originalNodeName = transactions.nodeName;
String shortenNodeName(String originalNodeName) throws NoSuchAlgorithmException {
log.warnf("Node name \"%s\" is longer than 28 bytes, shortening it by using %s.", originalNodeName,
HASH_ALGORITHM_FOR_SHORTENING);
final byte[] nodeNameAsBytes = originalNodeName.getBytes();
Expand All @@ -69,8 +68,9 @@ private static void shortenNodeName(TransactionManagerConfiguration transactions
//truncate the array
byte[] slice = Arrays.copyOfRange(base64Result, 0, 28);

transactions.nodeName = new String(slice, StandardCharsets.UTF_8);
log.warnf("New node name is \"%s\"", transactions.nodeName);
String shorterNodeName = new String(slice, StandardCharsets.UTF_8);
log.warnf("New node name is \"%s\"", shorterNodeName);
return shorterNodeName;
}

public void setDefaultProperties(Properties properties) {
Expand All @@ -92,8 +92,8 @@ public void setDefaultProperties(Properties properties) {

public void setDefaultTimeout(TransactionManagerConfiguration transactions) {
arjPropertyManager.getCoordinatorEnvironmentBean()
.setDefaultTimeout((int) transactions.defaultTransactionTimeout.getSeconds());
TxControl.setDefaultTimeout((int) transactions.defaultTransactionTimeout.getSeconds());
.setDefaultTimeout((int) transactions.defaultTransactionTimeout().getSeconds());
TxControl.setDefaultTimeout((int) transactions.defaultTransactionTimeout().getSeconds());
}

public static Properties getDefaultProperties() {
Expand All @@ -107,17 +107,17 @@ public void disableTransactionStatusManager() {

public void setConfig(final TransactionManagerConfiguration transactions) {
List<String> objectStores = Arrays.asList(null, "communicationStore", "stateStore");
if (transactions.objectStore.type.equals(ObjectStoreType.File_System)) {
if (transactions.objectStore().type().equals(ObjectStoreType.File_System)) {
objectStores.forEach(name -> setObjectStoreDir(name, transactions));
} else if (transactions.objectStore.type.equals(ObjectStoreType.JDBC)) {
} else if (transactions.objectStore().type().equals(ObjectStoreType.JDBC)) {
objectStores.forEach(name -> setJDBCObjectStore(name, transactions));
}
BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class)
.setRecoveryModuleClassNames(transactions.recoveryModules);
.setRecoveryModuleClassNames(transactions.recoveryModules());
BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class)
.setExpiryScannerClassNames(transactions.expiryScanners);
.setExpiryScannerClassNames(transactions.expiryScanners());
BeanPopulator.getDefaultInstance(JTAEnvironmentBean.class)
.setXaResourceOrphanFilterClassNames(transactions.xaResourceOrphanFilters);
.setXaResourceOrphanFilterClassNames(transactions.xaResourceOrphanFilters());
}

/**
Expand Down Expand Up @@ -145,25 +145,26 @@ public void logUnsafeMultipleLastResourcesOnStartup(
}

private void setObjectStoreDir(String name, TransactionManagerConfiguration config) {
BeanPopulator.getNamedInstance(ObjectStoreEnvironmentBean.class, name).setObjectStoreDir(config.objectStore.directory);
BeanPopulator.getNamedInstance(ObjectStoreEnvironmentBean.class, name)
.setObjectStoreDir(config.objectStore().directory());
}

private void setJDBCObjectStore(String name, TransactionManagerConfiguration config) {
final ObjectStoreEnvironmentBean instance = BeanPopulator.getNamedInstance(ObjectStoreEnvironmentBean.class, name);
instance.setObjectStoreType(JDBCStore.class.getName());
instance.setJdbcDataSource(new QuarkusDataSource(config.objectStore.datasource));
instance.setCreateTable(config.objectStore.createTable);
instance.setDropTable(config.objectStore.dropTable);
instance.setTablePrefix(config.objectStore.tablePrefix);
instance.setJdbcDataSource(new QuarkusDataSource(config.objectStore().datasource()));
instance.setCreateTable(config.objectStore().createTable());
instance.setDropTable(config.objectStore().dropTable());
instance.setTablePrefix(config.objectStore().tablePrefix());
}

public void startRecoveryService(final TransactionManagerConfiguration transactions,
Map<String, String> configuredDataSourcesConfigKeys,
Set<String> dataSourcesWithTransactionIntegration) {

if (transactions.objectStore.type.equals(ObjectStoreType.JDBC)) {
if (transactions.objectStore().type().equals(ObjectStoreType.JDBC)) {
final String objectStoreDataSourceName;
if (transactions.objectStore.datasource.isEmpty()) {
if (transactions.objectStore().datasource().isEmpty()) {
if (!DataSourceUtil.hasDefault(configuredDataSourcesConfigKeys.keySet())) {
throw new ConfigurationException(
"The Narayana JTA extension does not have a datasource configured as the JDBC object store,"
Expand All @@ -176,7 +177,7 @@ public void startRecoveryService(final TransactionManagerConfiguration transacti
}
objectStoreDataSourceName = DataSourceUtil.DEFAULT_DATASOURCE_NAME;
} else {
objectStoreDataSourceName = transactions.objectStore.datasource.get();
objectStoreDataSourceName = transactions.objectStore().datasource().get();

if (!configuredDataSourcesConfigKeys.keySet().contains(objectStoreDataSourceName)) {
throw new ConfigurationException(
Expand All @@ -200,15 +201,15 @@ public void startRecoveryService(final TransactionManagerConfiguration transacti
objectStoreDataSourceName, configuredDataSourcesConfigKeys.get(objectStoreDataSourceName)));
}
}
if (transactions.enableRecovery) {
if (transactions.enableRecovery()) {
QuarkusRecoveryService.getInstance().create();
QuarkusRecoveryService.getInstance().start();
}
}

public void handleShutdown(ShutdownContext context, TransactionManagerConfiguration transactions) {
context.addShutdownTask(() -> {
if (transactions.enableRecovery) {
if (transactions.enableRecovery()) {
try {
QuarkusRecoveryService.getInstance().stop();
} catch (Exception e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@

import java.util.Optional;

import io.quarkus.runtime.annotations.ConfigItem;
import io.quarkus.runtime.annotations.ConfigDocDefault;
import io.quarkus.runtime.annotations.ConfigPhase;
import io.quarkus.runtime.annotations.ConfigRoot;
import io.smallrye.config.ConfigMapping;

@ConfigRoot(phase = ConfigPhase.BUILD_TIME)
public final class TransactionManagerBuildTimeConfig {
@ConfigMapping(prefix = "quarkus.transaction-manager")
public interface TransactionManagerBuildTimeConfig {
/**
* Define the behavior when using multiple XA unaware resources in the same transactional demarcation.
* <p>
Expand All @@ -31,8 +33,8 @@ public final class TransactionManagerBuildTimeConfig {
* @deprecated This property is planned for removal in a future version.
*/
@Deprecated(forRemoval = true)
@ConfigItem(defaultValueDocumentation = "fail")
public Optional<UnsafeMultipleLastResourcesMode> unsafeMultipleLastResources;
@ConfigDocDefault("fail")
public Optional<UnsafeMultipleLastResourcesMode> unsafeMultipleLastResources();

public enum UnsafeMultipleLastResourcesMode {
/**
Expand Down
Loading

0 comments on commit 2fbc83d

Please sign in to comment.