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() {

Reply via email to