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
