Merge "Merge commit 'd9850dc' from 'stabilization-f69489' into 'master'"
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/NcLifecycleCoordinator.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/NcLifecycleCoordinator.java
index 961593f..19ae171 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/NcLifecycleCoordinator.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/NcLifecycleCoordinator.java
@@ -60,7 +60,7 @@
 
     private static final Logger LOGGER = LogManager.getLogger();
     protected IClusterStateManager clusterManager;
-    protected String metadataNodeId;
+    protected volatile String metadataNodeId;
     protected Set<String> pendingStartupCompletionNodes = new HashSet<>();
     protected final ICCMessageBroker messageBroker;
     private final boolean replicationEnabled;
@@ -157,7 +157,7 @@
     }
 
     @Override
-    public void notifyMetadataNodeChange(String node) throws HyracksDataException {
+    public synchronized void notifyMetadataNodeChange(String node) throws HyracksDataException {
         if (metadataNodeId.equals(node)) {
             return;
         }
@@ -203,7 +203,7 @@
         return tasks;
     }
 
-    private void process(MetadataNodeResponseMessage response) throws HyracksDataException {
+    private synchronized void process(MetadataNodeResponseMessage response) throws HyracksDataException {
         // rebind metadata node since it might be changing
         MetadataManager.INSTANCE.rebindMetadataNode();
         clusterManager.updateMetadataNode(response.getNodeId(), response.isExported());
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetMemoryManager.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetMemoryManager.java
index 1b4b48e..8aec240 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetMemoryManager.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetMemoryManager.java
@@ -82,7 +82,8 @@
     @Override
     public synchronized boolean reserve(int datasetId) {
         if (reservedMap.containsKey(datasetId)) {
-            throw new IllegalStateException("Memory is already reserved for dataset: " + datasetId);
+            LOGGER.info("Memory is already reserved for dataset: {}", () -> datasetId);
+            return true;
         }
         final long required = getTotalSize(datasetId);
         if (!isAllocatable(required) && !allocatedMap.containsKey(datasetId)) {
diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/context/DatasetMemoryManagerTest.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/context/DatasetMemoryManagerTest.java
index b8e3604..2a26f08 100644
--- a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/context/DatasetMemoryManagerTest.java
+++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/context/DatasetMemoryManagerTest.java
@@ -83,15 +83,7 @@
         Assert.assertEquals(memoryManager.getAvailable(), expectedBudget);
 
         // double reserve
-        boolean thrown = false;
         Assert.assertTrue(memoryManager.reserve(2));
-        try {
-            memoryManager.reserve(2);
-        } catch (IllegalStateException e) {
-            Assert.assertTrue(e.getMessage().contains("already reserved"));
-            thrown = true;
-        }
-        Assert.assertTrue(thrown);
 
         // cancel reserved
         memoryManager.cancelReserved(2);