CLOUDSTACK-6236:Negative ref_cnt of template(snapshot/volume)_store_ref results in out-of-range error in Mysql
(cherry picked from commit cd8af6a3e2a180ea4d2cfea8a273dbb0929e0a87) Signed-off-by: Rohit Yadav <rohit.ya...@shapeblue.com> Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/88ec0843 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/88ec0843 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/88ec0843 Branch: refs/heads/4.3 Commit: 88ec08439dfc65178c56c365e276c0018ca03d6d Parents: 7332ea8 Author: Min Chen <min.c...@citrix.com> Authored: Wed Mar 12 15:44:18 2014 -0700 Committer: Rohit Yadav <rohit.ya...@shapeblue.com> Committed: Wed Nov 26 18:14:53 2014 +0530 ---------------------------------------------------------------------- .../storage/datastore/db/SnapshotDataStoreVO.java | 11 ++++++++++- .../storage/datastore/db/TemplateDataStoreVO.java | 11 ++++++++++- .../storage/datastore/db/VolumeDataStoreVO.java | 11 ++++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/88ec0843/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java ---------------------------------------------------------------------- diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java index db86c3f..7acc891 100644 --- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java +++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java @@ -29,6 +29,8 @@ import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; +import org.apache.log4j.Logger; + import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State; @@ -44,6 +46,8 @@ import com.cloud.utils.fsm.StateObject; @Entity @Table(name = "snapshot_store_ref") public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMachine.State>, DataObjectInStore { + private static final Logger s_logger = Logger.getLogger(SnapshotDataStoreVO.class); + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; @@ -266,7 +270,12 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa } public void decrRefCnt() { - refCnt--; + if (refCnt > 0) { + refCnt--; + } + else { + s_logger.warn("We should not try to decrement a zero reference count even though our code has guarded"); + } } public Long getVolumeId() { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/88ec0843/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java ---------------------------------------------------------------------- diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java index a3696d8..af89ee5 100755 --- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java +++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java @@ -29,6 +29,8 @@ import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; +import org.apache.log4j.Logger; + import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State; @@ -45,6 +47,8 @@ import com.cloud.utils.fsm.StateObject; @Entity @Table(name = "template_store_ref") public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMachine.State>, DataObjectInStore { + private static final Logger s_logger = Logger.getLogger(TemplateDataStoreVO.class); + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; @@ -369,7 +373,12 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa } public void decrRefCnt() { - refCnt--; + if (refCnt > 0) { + refCnt--; + } + else{ + s_logger.warn("We should not try to decrement a zero reference count even though our code has guarded"); + } } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/88ec0843/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java ---------------------------------------------------------------------- diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java index e34d4a6..bd15f1c 100755 --- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java +++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java @@ -29,6 +29,8 @@ import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; +import org.apache.log4j.Logger; + import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State; @@ -44,6 +46,8 @@ import com.cloud.utils.fsm.StateObject; @Entity @Table(name = "volume_store_ref") public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMachine.State>, DataObjectInStore { + private static final Logger s_logger = Logger.getLogger(VolumeDataStoreVO.class); + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; @@ -344,7 +348,12 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach } public void setRefCnt(Long refCnt) { - this.refCnt = refCnt; + if (refCnt > 0) { + refCnt--; + } + else { + s_logger.warn("We should not try to decrement a zero reference count even though our code has guarded"); + } } public void incrRefCnt() {