Yair Zaslavsky has uploaded a new change for review.

Change subject: core: Fix race between AsyncTaskManager and VdsManager
......................................................................

core: Fix race between AsyncTaskManager and VdsManager

This patch fixes a race between AsyncTaskManager and VdsManager

IrsBrokerCommand.Init fetches store pool, and initializes IrsProxyData, which
in turn calls StoragePoolUpEvent which AccessesTaskManager.
But, At the same time AsyncTaskManager did not complete its initialization, so
ClassDefNotFoundException may be thrown.

The following patch fixes this by:
1. Call AsyncTaskManager initialization code before Initialization of VdsBroker 
(which in turn initializes
IrsProxyData)
2. Use countdown latch to wait for all asyncrhonous code inside the async task 
manager initialization.

After the countdown latch is being used, the state of AsyncTaskManager is valid 
to be used by Irs Proxy data.

Change-Id: Ibbbacef1109741ef005e33d1e4c7f4f7cc741338
Signed-off-by: Yair Zaslavsky <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskManager.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java
2 files changed, 21 insertions(+), 5 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/21/16821/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskManager.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskManager.java
index d57c6b4..aa6ecc4 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskManager.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskManager.java
@@ -9,6 +9,7 @@
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.lang.exception.ExceptionUtils;
@@ -71,12 +72,13 @@
      */
     private Map<Guid, AsyncTasks> partiallyCompletedCommandTasks = new 
ConcurrentHashMap<>();
 
+    private CountDownLatch irsBrokerLatch;
+
     private static final AsyncTaskManager _taskManager = new 
AsyncTaskManager();
 
     public static AsyncTaskManager getInstance() {
         return _taskManager;
     }
-
 
     private AsyncTaskManager() {
         _tasks = new ConcurrentHashMap<Guid, SPMAsyncTask>();
@@ -90,8 +92,19 @@
                 new Object[]{}, 
Config.<Integer>GetValue(ConfigValues.AsyncTaskStatusCacheRefreshRateInSeconds),
                 
Config.<Integer>GetValue(ConfigValues.AsyncTaskStatusCacheRefreshRateInSeconds),
 TimeUnit.SECONDS);
         _cacheTimeInMinutes = 
Config.<Integer>GetValue(ConfigValues.AsyncTaskStatusCachingTimeInMinutes);
+    }
+
+    public void InitAsyncTaskManager() {
         tasksInDbAfterRestart = new ConcurrentHashMap();
         Map<Guid, List<AsyncTasks>> rootCommandIdToTasksMap = 
groupTasksByRootCommandId(DbFacade.getInstance().getAsyncTaskDao().getAll());
+        int numberOfCommandsWithEmptyVdsmId = 0;
+        for (Entry<Guid, List<AsyncTasks>> entry : 
rootCommandIdToTasksMap.entrySet()) {
+            if 
(hasTasksWithoutVdsmId(rootCommandIdToTasksMap.get(entry.getKey()))) {
+                log.infoFormat("Root Command {0} has tasks without vdsm id.", 
entry.getKey());
+                numberOfCommandsWithEmptyVdsmId++;
+            }
+        }
+        irsBrokerLatch = new CountDownLatch(numberOfCommandsWithEmptyVdsmId);
         for (Entry<Guid, List<AsyncTasks>> entry : 
rootCommandIdToTasksMap.entrySet()) {
             if 
(hasTasksWithoutVdsmId(rootCommandIdToTasksMap.get(entry.getKey()))) {
                 log.infoFormat("Root Command {0} has tasks without vdsm id.", 
entry.getKey());
@@ -104,10 +117,12 @@
                 }
             }
         }
-    }
+        try {
+            irsBrokerLatch.await();
+            log.info("Initialization of AsyncTaskManager completed 
successfully.");
+        } catch (InterruptedException e) {
+        }
 
-    public void InitAsyncTaskManager() {
-        log.info("Initialization of AsyncTaskManager completed successfully.");
     }
 
     @OnTimerMethodAnnotation("_timer_Elapsed")
@@ -196,6 +211,7 @@
                         for (AsyncTasks task : tasks) {
                             
handleTaskOfCommandWithEmptyVdsmId(isPartiallySubmittedCommand, task);
                         }
+                        irsBrokerLatch.countDown();
                         return null;
                     }
                 });
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java
index 1353faf..468eb65 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java
@@ -45,8 +45,8 @@
     @PostConstruct
     public void create() {
 
-        ResourceManager.getInstance().init();
         AsyncTaskManager.getInstance().InitAsyncTaskManager();
+        ResourceManager.getInstance().init();
         OvfDataUpdater.getInstance().initOvfDataUpdater();
 
         VdsLoadBalancer.getInstance().setMigrationHandler(new 
MigrationHandler() {


-- 
To view, visit http://gerrit.ovirt.org/16821
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibbbacef1109741ef005e33d1e4c7f4f7cc741338
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Yair Zaslavsky <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to