Shubhendu Tripathi has uploaded a new change for review.

Change subject: gluster: Update task status everytime while querying
......................................................................

gluster: Update task status everytime while querying

Modified to update the task status in engine DB everytime a remove
bricks status query is fired. This makes sure the details in the DB are
up-to-date with query status.
This makes sure correct working of Retain and Commit actions on the
remobe bricks for volume.

Change-Id: I3e8fa7ab590e15ee5821ae2f3fb41650c195c0fa
Bug-Url: https://bugzilla.redhat.com/1024782
Signed-off-by: Shubhendu Tripathi <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeRemoveBricksStatusQuery.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeRemoveBricksStatusQueryTest.java
2 files changed, 77 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/05/21005/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeRemoveBricksStatusQuery.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeRemoveBricksStatusQuery.java
index d36c17a..eb154e8 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeRemoveBricksStatusQuery.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeRemoveBricksStatusQuery.java
@@ -1,7 +1,11 @@
 package org.ovirt.engine.core.bll.gluster;
 
+import java.util.Collections;
 import java.util.List;
 
+import org.ovirt.engine.core.bll.LockMessagesMatchUtil;
+import org.ovirt.engine.core.bll.job.JobRepository;
+import org.ovirt.engine.core.bll.job.JobRepositoryFactory;
 import 
org.ovirt.engine.core.common.action.gluster.GlusterVolumeRemoveBricksQueriesParameters;
 import org.ovirt.engine.core.common.asynctasks.gluster.GlusterAsyncTask;
 import org.ovirt.engine.core.common.businessentities.VDS;
@@ -10,13 +14,18 @@
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeTaskStatusEntity;
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeTaskStatusForHost;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.common.job.JobExecutionStatus;
 import org.ovirt.engine.core.common.job.Step;
+import org.ovirt.engine.core.common.locks.LockingGroup;
 import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
 import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
 import 
org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeRemoveBricksVDSParameters;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dao.StepDao;
 import org.ovirt.engine.core.dao.gluster.GlusterServerDao;
+import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao;
+import org.ovirt.engine.core.utils.lock.EngineLock;
+import org.ovirt.engine.core.utils.lock.LockManagerFactory;
 
 public class GetGlusterVolumeRemoveBricksStatusQuery<P extends 
GlusterVolumeRemoveBricksQueriesParameters> extends 
GlusterQueriesCommandBase<P> {
 
@@ -45,6 +54,43 @@
         getQueryReturnValue().setReturnValue(fetchRemobeBricksStatusDetails());
     }
 
+    public void releaseVolumeLock(Guid taskId) {
+        // get volume associated with task
+        GlusterVolumeEntity vol = 
getVolumeDao().getVolumeByGlusterTask(taskId);
+
+        if (vol != null) {
+            // release lock on volume
+            EngineLock engineLock =
+                    new 
EngineLock(Collections.singletonMap(vol.getId().toString(),
+                            
LockMessagesMatchUtil.makeLockingPair(LockingGroup.GLUSTER,
+                                    
VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED)), null);
+            LockManagerFactory.getLockManager().releaseLock(engineLock);
+        } else {
+            log.debugFormat("Did not find a volume associated with task {0}", 
taskId);
+        }
+    }
+
+    public void updateTaskStepDetails(GlusterAsyncTask task, 
JobExecutionStatus status) {
+        List<Step> steps = getStepDao().getStepsByExternalId(task.getTaskId());
+
+        // If the job is already stopped no need to update the status
+        if (task.getStatus() == JobExecutionStatus.ABORTED) {
+            return;
+        }
+
+        // update status in step table
+        for (Step step : steps) {
+            if (step.getEndTime() != null) {
+                // already done
+                continue;
+            }
+            step.setStatus(status);
+            getJobRepository().updateStep(step);
+        }
+
+        releaseVolumeLock(task.getTaskId());
+    }
+
     private GlusterVolumeTaskStatusEntity fetchRemobeBricksStatusDetails() {
         VDSReturnValue returnValue =
                 
runVdsCommand(VDSCommandType.GetGlusterVolumeRemoveBricksStatus,
@@ -60,6 +106,18 @@
             List<Step> stepsList = 
getStepDao().getStepsByExternalId(asyncTask.getTaskId());
             if (stepsList != null && !stepsList.isEmpty()) {
                 entity.setStartTime(stepsList.get(0).getStartTime());
+            }
+
+            // Update the latest status details for task steps.
+            // This is required to make sure the engine details are up-to-date
+            updateTaskStepDetails(asyncTask, 
entity.getStatusSummary().getStatus());
+
+            // If the task status at engine side is aborted, set the same to 
current status
+            // This is required because even in case of retention of the brick 
the gluster returns
+            // the status as finished and to avoid enabling of retain and 
commit in ui the status should
+            // be set to aborted. This is required only in case of remove 
bricks
+            if (asyncTask.getStatus() == JobExecutionStatus.ABORTED) {
+                
entity.getStatusSummary().setStatus(JobExecutionStatus.ABORTED);
             }
         }
 
@@ -89,4 +147,12 @@
     public GlusterServerDao getGlusterServerDao() {
         return getDbFacade().getGlusterServerDao();
     }
+
+    public JobRepository getJobRepository() {
+        return JobRepositoryFactory.getJobRepository();
+    }
+
+    public GlusterVolumeDao getVolumeDao() {
+        return getDbFacade().getGlusterVolumeDao();
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeRemoveBricksStatusQueryTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeRemoveBricksStatusQueryTest.java
index 2b1f044..dee40f8 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeRemoveBricksStatusQueryTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeRemoveBricksStatusQueryTest.java
@@ -4,6 +4,7 @@
 import static org.junit.Assert.assertNotNull;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
@@ -17,9 +18,11 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.ovirt.engine.core.bll.AbstractQueryTest;
+import org.ovirt.engine.core.bll.job.JobRepository;
 import org.ovirt.engine.core.bll.utils.ClusterUtils;
 import 
org.ovirt.engine.core.common.action.gluster.GlusterVolumeRemoveBricksQueriesParameters;
 import org.ovirt.engine.core.common.asynctasks.gluster.GlusterAsyncTask;
+import org.ovirt.engine.core.common.asynctasks.gluster.GlusterTaskParameters;
 import org.ovirt.engine.core.common.asynctasks.gluster.GlusterTaskType;
 import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.VDSStatus;
@@ -57,6 +60,7 @@
     private GlusterServerDao glusterServerDao;
     private StepDao stepDao;
     private ClusterUtils clusterUtils;
+    private JobRepository jobRepository;
 
     @Before
     @Override
@@ -176,6 +180,9 @@
         asyncTask.setStatus(JobExecutionStatus.FINISHED);
         asyncTask.setMessage("test_msg");
         asyncTask.setTaskId(Guid.newGuid());
+        GlusterTaskParameters params = new GlusterTaskParameters();
+        params.setVolumeName("volume1");
+        asyncTask.setTaskParameters(params);
 
         return asyncTask;
     }
@@ -194,6 +201,7 @@
         volumeDao = mock(GlusterVolumeDao.class);
         glusterServerDao = mock(GlusterServerDao.class);
         stepDao = mock(StepDao.class);
+        jobRepository = mock(JobRepository.class);
 
         doReturn(vdsDao).when(getQuery()).getVdsDao();
         doReturn(volumeDao).when(getQuery()).getGlusterVolumeDao();
@@ -201,10 +209,13 @@
         doReturn(glusterServerDao).when(getQuery()).getGlusterServerDao();
         doReturn(CLUSTER_ID).when(getQueryParameters()).getClusterId();
         doReturn(VOLUME_ID).when(getQueryParameters()).getVolumeId();
+        doReturn(jobRepository).when(getQuery()).getJobRepository();
         when(volumeDao.getById(VOLUME_ID)).thenReturn(getVolume());
         
when(stepDao.getStepsByExternalId(any(Guid.class))).thenReturn(getStepsList());
         
when(glusterServerDao.getByGlusterServerUuid(any(Guid.class))).thenReturn(getGlusterServer());
         when(vdsDao.get(any(Guid.class))).thenReturn(getVds(VDSStatus.Up));
+        doNothing().when(jobRepository).updateStep(any(Step.class));
+        doNothing().when(getQuery()).releaseVolumeLock(any(Guid.class));
 
         VDSReturnValue returnValue = new VDSReturnValue();
         returnValue.setSucceeded(true);


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

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

Reply via email to