From 2133c302f4bf1f4224648bef4689a8a9f725ccd6 Mon Sep 17 00:00:00 2001 From: Anshul Gangwar Date: Thu, 19 Feb 2015 16:22:20 +0530 Subject: [PATCH] CLOUDSTACK-8413: Fixed resource tags on disk are lost when migrate to another storage During cold volume migration we are duplicating volume entry in volumes table. When migration is complete, we update the uuid of new entry and expunge the older entry. This results in removal of resource tags on volume as its resource id still pointing to older volume. As part of fix while updating uuid for volume, we are updating resource_id for tags also. This closes #194 --- api/src/com/cloud/server/ResourceTag.java | 2 ++ .../src/com/cloud/storage/dao/VolumeDaoImpl.java | 1 + engine/schema/src/com/cloud/tags/ResourceTagVO.java | 4 ++++ .../schema/src/com/cloud/tags/dao/ResourceTagDao.java | 1 + .../src/com/cloud/tags/dao/ResourceTagsDaoImpl.java | 10 ++++++++++ 5 files changed, 18 insertions(+) diff --git a/api/src/com/cloud/server/ResourceTag.java b/api/src/com/cloud/server/ResourceTag.java index 16d6dc2c181..ce09fdf955b 100644 --- a/api/src/com/cloud/server/ResourceTag.java +++ b/api/src/com/cloud/server/ResourceTag.java @@ -92,6 +92,8 @@ public interface ResourceTag extends ControlledEntity, Identity, InternalIdentit */ long getResourceId(); + void setResourceId(long resourceId); + /** * @return */ diff --git a/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java index 66e8979b423..85d08b854c0 100644 --- a/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java +++ b/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java @@ -626,6 +626,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol destVol.setInstanceId(instanceId); update(srcVolId, srcVol); update(destVolId, destVol); + _tagsDao.updateResourceId(srcVolId, destVolId, ResourceObjectType.Volume); } catch (Exception e) { throw new CloudRuntimeException("Unable to persist the sequence number for this host"); } diff --git a/engine/schema/src/com/cloud/tags/ResourceTagVO.java b/engine/schema/src/com/cloud/tags/ResourceTagVO.java index eadddd1e31e..cc29d8ea15a 100644 --- a/engine/schema/src/com/cloud/tags/ResourceTagVO.java +++ b/engine/schema/src/com/cloud/tags/ResourceTagVO.java @@ -143,6 +143,10 @@ public class ResourceTagVO implements ResourceTag { return resourceId; } + @Override public void setResourceId(long resourceId) { + this.resourceId = resourceId; + } + @Override public ResourceObjectType getResourceType() { return resourceType; diff --git a/engine/schema/src/com/cloud/tags/dao/ResourceTagDao.java b/engine/schema/src/com/cloud/tags/dao/ResourceTagDao.java index fffe2a475f2..87662ef0679 100644 --- a/engine/schema/src/com/cloud/tags/dao/ResourceTagDao.java +++ b/engine/schema/src/com/cloud/tags/dao/ResourceTagDao.java @@ -34,4 +34,5 @@ public interface ResourceTagDao extends GenericDao { List listBy(long resourceId, ResourceObjectType resourceType); + void updateResourceId(long srcId, long destId, ResourceObjectType resourceType); } diff --git a/engine/schema/src/com/cloud/tags/dao/ResourceTagsDaoImpl.java b/engine/schema/src/com/cloud/tags/dao/ResourceTagsDaoImpl.java index 3611999fda1..a6c26243c21 100644 --- a/engine/schema/src/com/cloud/tags/dao/ResourceTagsDaoImpl.java +++ b/engine/schema/src/com/cloud/tags/dao/ResourceTagsDaoImpl.java @@ -59,4 +59,14 @@ public class ResourceTagsDaoImpl extends GenericDaoBase imp sc.setParameters("resourceType", resourceType); return listBy(sc); } + + @Override public void updateResourceId(long srcId, long destId, ResourceObjectType resourceType) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("resourceId", srcId); + sc.setParameters("resourceType", resourceType); + for( ResourceTagVO tag : listBy(sc)) { + tag.setResourceId(destId); + update(tag.getId(), tag); + } + } }