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
