This is an automated email from the ASF dual-hosted git repository.

brusdev pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git


The following commit(s) were added to refs/heads/main by this push:
     new aa4e4409bf ARTEMIS-4417: use ConcurrentHashMap for the sub-maps to 
make their use thread safe
aa4e4409bf is described below

commit aa4e4409bf2cf4b14a02b5b2887b900e30cae84d
Author: Robbie Gemmell <[email protected]>
AuthorDate: Tue Sep 5 13:58:19 2023 +0100

    ARTEMIS-4417: use ConcurrentHashMap for the sub-maps to make their use 
thread safe
---
 .../journal/AbstractJournalStorageManager.java     | 29 ++++++++++++----------
 1 file changed, 16 insertions(+), 13 deletions(-)

diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AbstractJournalStorageManager.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AbstractJournalStorageManager.java
index 9a4d8533f0..23800a5577 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AbstractJournalStorageManager.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AbstractJournalStorageManager.java
@@ -33,6 +33,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
 import java.util.concurrent.ScheduledExecutorService;
@@ -232,7 +233,7 @@ public abstract class AbstractJournalStorageManager extends 
CriticalComponentImp
 
    protected final Map<String, PersistedRole> mapPersistedRoles = new 
ConcurrentHashMap<>();
 
-   protected final Map<String, Map<String, PersistedKeyValuePair>> 
mapPersistedKeyValuePairs = new ConcurrentHashMap<>();
+   protected final ConcurrentMap<String, ConcurrentMap<String, 
PersistedKeyValuePair>> mapPersistedKeyValuePairs = new ConcurrentHashMap<>();
 
    protected final ConcurrentLongHashMap<LargeServerMessage> 
largeMessagesToDelete = new ConcurrentLongHashMap<>();
 
@@ -891,12 +892,7 @@ public abstract class AbstractJournalStorageManager 
extends CriticalComponentImp
          final long id = idGenerator.generateID();
          persistedKeyValuePair.setStoreId(id);
          bindingsJournal.appendAddRecord(id, 
JournalRecordIds.KEY_VALUE_PAIR_RECORD, persistedKeyValuePair, true);
-         Map<String, PersistedKeyValuePair> persistedKeyValuePairs = 
mapPersistedKeyValuePairs.get(persistedKeyValuePair.getMapId());
-         if (persistedKeyValuePairs == null) {
-            persistedKeyValuePairs = new HashMap<>();
-            mapPersistedKeyValuePairs.put(persistedKeyValuePair.getMapId(), 
persistedKeyValuePairs);
-         }
-         persistedKeyValuePairs.put(persistedKeyValuePair.getKey(), 
persistedKeyValuePair);
+         insertPersistedKeyValuePair(persistedKeyValuePair);
       }
    }
 
@@ -1658,12 +1654,7 @@ public abstract class AbstractJournalStorageManager 
extends CriticalComponentImp
                mapPersistedRoles.put(role.getUsername(), role);
             } else if (rec == JournalRecordIds.KEY_VALUE_PAIR_RECORD) {
                PersistedKeyValuePair keyValuePair = 
newKeyValuePairEncoding(id, buffer);
-               Map<String, PersistedKeyValuePair> persistedKeyValuePairs = 
mapPersistedKeyValuePairs.get(keyValuePair.getMapId());
-               if (persistedKeyValuePairs == null) {
-                  persistedKeyValuePairs = new HashMap<>();
-                  mapPersistedKeyValuePairs.put(keyValuePair.getMapId(), 
persistedKeyValuePairs);
-               }
-               persistedKeyValuePairs.put(keyValuePair.getKey(), keyValuePair);
+               insertPersistedKeyValuePair(keyValuePair);
             } else if (rec == JournalRecordIds.CONNECTOR_RECORD) {
                PersistedConnector connector = newConnectorEncoding(id, buffer);
                mapPersistedConnectors.put(connector.getName(), connector);
@@ -1690,6 +1681,18 @@ public abstract class AbstractJournalStorageManager 
extends CriticalComponentImp
       return bindingsInfo;
    }
 
+   private void insertPersistedKeyValuePair(final PersistedKeyValuePair 
keyValuePair) {
+      Map<String, PersistedKeyValuePair> persistedKeyValuePairs = 
mapPersistedKeyValuePairs.get(keyValuePair.getMapId());
+      if (persistedKeyValuePairs == null) {
+         ConcurrentMap<String, PersistedKeyValuePair> newMap = new 
ConcurrentHashMap<>();
+         Map<String, PersistedKeyValuePair> existingMap = 
mapPersistedKeyValuePairs.putIfAbsent(keyValuePair.getMapId(), newMap);
+
+         persistedKeyValuePairs = existingMap == null ? newMap : existingMap;
+      }
+
+      persistedKeyValuePairs.put(keyValuePair.getKey(), keyValuePair);
+   }
+
    @Override
    public void lineUpContext() {
       try (ArtemisCloseable lock = closeableReadLock()) {

Reply via email to