Ravi Nori has uploaded a new change for review. Change subject: engine : Null Pointer Exception for action CreateAllSnapshotsFromVm after failure in create snapshot ......................................................................
engine : Null Pointer Exception for action CreateAllSnapshotsFromVm after failure in create snapshot After a failure in create snapshot, engine enters to loop with Null Pointer Exception. This patch fixes the case where the vdsm was restarted after submission of the command and the entry in snapshots command was cleared leading to NPE in CreateAllSnapshotsFromVmCommand. Change-Id: If89c45a236029078eae4a4254837b373c88adfd2 Bug-Url: https://bugzilla.redhat.com/982003 Signed-off-by: Ravi Nori <rn...@redhat.com> --- 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/CreateAllSnapshotsFromVmCommand.java 2 files changed, 19 insertions(+), 14 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/90/17590/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 4865fbb..6efc7fa 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 @@ -72,6 +72,8 @@ */ private Map<Guid, AsyncTasks> partiallyCompletedCommandTasks = new ConcurrentHashMap<>(); + private Map<Guid, List<AsyncTasks>> rootCommandIdToTasksMap = new HashMap<>(); + private CountDownLatch irsBrokerLatch; private static final AsyncTaskManager _taskManager = new AsyncTaskManager(); @@ -96,7 +98,7 @@ public void InitAsyncTaskManager() { tasksInDbAfterRestart = new ConcurrentHashMap(); - Map<Guid, List<AsyncTasks>> rootCommandIdToTasksMap = groupTasksByRootCommandId(DbFacade.getInstance().getAsyncTaskDao().getAll()); + rootCommandIdToTasksMap = groupTasksByRootCommandId(DbFacade.getInstance().getAsyncTaskDao().getAll()); int numberOfCommandsWithEmptyVdsmId = 0; for (Entry<Guid, List<AsyncTasks>> entry : rootCommandIdToTasksMap.entrySet()) { if (hasTasksWithoutVdsmId(rootCommandIdToTasksMap.get(entry.getKey()))) { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java index fe6462f..13561da 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java @@ -231,21 +231,24 @@ final boolean taskGroupSucceeded = getParameters().getTaskGroupSuccess(); Snapshot createdSnapshot = getSnapshotDao().get(getVmId(), getParameters().getSnapshotType(), SnapshotStatus.LOCKED); if (taskGroupSucceeded) { - getSnapshotDao().updateStatus(createdSnapshot.getId(), SnapshotStatus.OK); + if (createdSnapshot != null) { + getSnapshotDao().updateStatus(createdSnapshot.getId(), SnapshotStatus.OK); - if (isLiveSnapshotApplicable()) { - performLiveSnapshot(createdSnapshot); - } - else { - // If the created snapshot contains memory, remove the memory volumes as - // they are not in use since no live snapshot was created - if (!createdSnapshot.getMemoryVolume().isEmpty()) { - logMemorySavingFailed(); - if (!removeMemoryFromSnapshot(createdSnapshot, true)) { - log.errorFormat("Failed to remove unused memory {0} of snapshot {1}", - createdSnapshot.getMemoryVolume(), createdSnapshot.getId()); + if (isLiveSnapshotApplicable()) { + performLiveSnapshot(createdSnapshot); + } else { + // If the created snapshot contains memory, remove the memory volumes as + // they are not in use since no live snapshot was created + if (!createdSnapshot.getMemoryVolume().isEmpty()) { + logMemorySavingFailed(); + if (!removeMemoryFromSnapshot(createdSnapshot, true)) { + log.errorFormat("Failed to remove unused memory {0} of snapshot {1}", + createdSnapshot.getMemoryVolume(), createdSnapshot.getId()); + } } } + } else { + log.warnFormat("No snapshot was found for VM {0} which is in LOCKED status command will be failed", getVmId()); } } else { if (createdSnapshot != null) { @@ -264,7 +267,7 @@ incrementVmGeneration(); endActionOnDisks(); - setSucceeded(taskGroupSucceeded); + setSucceeded(createdSnapshot == null ? false : taskGroupSucceeded); getReturnValue().setEndActionTryAgain(false); return null; } -- To view, visit http://gerrit.ovirt.org/17590 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: If89c45a236029078eae4a4254837b373c88adfd2 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Ravi Nori <rn...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches