[
https://issues.apache.org/jira/browse/ARTEMIS-5562?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Clebert Suconic closed ARTEMIS-5562.
------------------------------------
> NullPointerException on call closeConnectionFactory method in
> ActiveMQResourceAdapter class
> --------------------------------------------------------------------------------------------
>
> Key: ARTEMIS-5562
> URL: https://issues.apache.org/jira/browse/ARTEMIS-5562
> Project: ActiveMQ Artemis
> Issue Type: Bug
> Affects Versions: 2.30.0
> Reporter: Vladimir Polukeev
> Priority: Major
> Labels: pull-request-available
> Fix For: 2.43.0
>
> Time Spent: 40m
> Remaining Estimate: 0h
>
> I have faced with NullPointerException on call closeConnectionFactory method
> in ActiveMQResourceAdapter class at my application.
>
> Here is stacktrace:
> {noformat}
> 14:05:18,694 DEBUG
> [org.apache.activemq.artemis.ra.ActiveMQRAManagedConnection] (Thread-1613
> (ActiveMQ-client-global-threads)) Cannot invoke
> "org.apache.activemq.artemis.api.core.Pair.getB()" because "pair" is null:
> java.lang.NullPointerException: Cannot invoke
> "org.apache.activemq.artemis.api.core.Pair.getB()" because "pair" is null
> at
> deployment.artemis-jakarta-rar-2.30.0.rar//org.apache.activemq.artemis.ra.ActiveMQResourceAdapter.closeConnectionFactory(ActiveMQResourceAdapter.java:1924)
> at
> deployment.artemis-jakarta-rar-2.30.0.rar//org.apache.activemq.artemis.ra.ActiveMQRAManagedConnection.destroy(ActiveMQRAManagedConnection.java:253)
> at
> [email protected]//org.jboss.jca.core.connectionmanager.listener.AbstractConnectionListener.destroy(AbstractConnectionListener.java:637)
> at
> [email protected]//org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreConcurrentLinkedDequeManagedConnectionPool.getConnection(SemaphoreConcurrentLinkedDequeManagedConnectionPool.java:459)
> at
> [email protected]//org.jboss.jca.core.connectionmanager.pool.AbstractPool.getTransactionNewConnection(AbstractPool.java:722)
> at
> [email protected]//org.jboss.jca.core.connectionmanager.pool.AbstractPool.getConnection(AbstractPool.java:618)
> at
> [email protected]//org.jboss.jca.core.connectionmanager.AbstractConnectionManager.getManagedConnection(AbstractConnectionManager.java:624)
> at
> [email protected]//org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.getManagedConnection(TxConnectionManagerImpl.java:440)
> at
> [email protected]//org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:789)
> at
> deployment.artemis-jakarta-rar-2.30.0.rar//org.apache.activemq.artemis.ra.ActiveMQRASessionFactoryImpl.allocateConnection(ActiveMQRASessionFactoryImpl.java:792)
> at
> deployment.artemis-jakarta-rar-2.30.0.rar//org.apache.activemq.artemis.ra.ActiveMQRASessionFactoryImpl.createSession(ActiveMQRASessionFactoryImpl.java:482)
> at
> deployment.artemis-jakarta-rar-2.30.0.rar//org.apache.activemq.artemis.ra.ActiveMQRASessionFactoryImpl.createSession(ActiveMQRASessionFactoryImpl.java:673)
> at
> deployment.artemis-jakarta-rar-2.30.0.rar//org.apache.activemq.artemis.ra.ActiveMQRASessionFactoryImpl.createSession(ActiveMQRASessionFactoryImpl.java:678)
> at
> deployment.artemis-jakarta-rar-2.30.0.rar//org.apache.activemq.artemis.ra.ActiveMQRAConnectionFactoryImpl.validateUser(ActiveMQRAConnectionFactoryImpl.java:422)
> at
> deployment.artemis-jakarta-rar-2.30.0.rar//org.apache.activemq.artemis.ra.ActiveMQRAConnectionFactoryImpl.createContext(ActiveMQRAConnectionFactoryImpl.java:379)
> at
> deployment.artemis-jakarta-rar-2.30.0.rar//org.apache.activemq.artemis.ra.ActiveMQRAConnectionFactoryImpl.createContext(ActiveMQRAConnectionFactoryImpl.java:394)
> at
> [email protected]//org.wildfly.extension.messaging.activemq.deployment.injection.AbstractJMSContext.createContext(AbstractJMSContext.java:57)
> at
> [email protected]//org.wildfly.extension.messaging.activemq.deployment.injection.AbstractJMSContext.lambda$getContext$0(AbstractJMSContext.java:47)
> at
> java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)
> at
> [email protected]//org.wildfly.extension.messaging.activemq.deployment.injection.AbstractJMSContext.getContext(AbstractJMSContext.java:46)
> {noformat}
> Here is source code from Artemis Resource Adapter:
> {code:java}
> public synchronized void
> closeConnectionFactory(ConnectionFactoryProperties properties) {
> Pair<ActiveMQConnectionFactory, AtomicInteger> pair =
> knownConnectionFactories.get(properties);
> int references = pair.getB().decrementAndGet();
> if (pair.getA() != null && pair.getA() !=
> defaultActiveMQConnectionFactory && references == 0) {
> knownConnectionFactories.remove(properties).getA().close();
> }
> } {code}
> Exception has been thrown on "int references =
> pair.getB().decrementAndGet();" line.
> I artificially reproduce NPE by this test:
> {noformat}
> public class SyncTest {
> private static final TestClass TEST_CLASS = new TestClass(); @Test
>
> public void test() throws InterruptedException {
> Runnable task = TEST_CLASS::test;
> var thread1 = new Thread(task);
> var thread2 = new Thread(task);
> thread1.start();
> thread2.start();
> thread1.join();
> thread2.join();
> }
> private static class TestClass {
> private final Map<String, AtomicInteger> map = new HashMap<>();
>
> {
> map.put("test", new AtomicInteger(1));
> }
>
> private synchronized void test() {
> System.out.println("Current thread : " +
> Thread.currentThread().getName());
> var value = map.get("test");
> value.decrementAndGet();
> if (value.get() == 0) {
> map.remove("test");
> }
> }
> }
> }{noformat}
> Test shows case when two separated threads invoke the same method and the
> last thread throws NPE due to there is no object in HashMap because it has
> been removed by previous thread.
>
> As I understand the error case, two separated threads invoke
> closeConnectionFactory method. And the first thread remove pair from HashMap.
> And the second thread throws NPE. It looks like there is an error around
> AtomicInteger counter (object B in pair) logic. But it is only my suggestion.
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information, visit: https://activemq.apache.org/contact