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

Reply via email to