From 23c6248ef72a25b833be18d2f5b51d005a5326a4 Mon Sep 17 00:00:00 2001 From: Abhinandan Prateek Date: Thu, 7 Jul 2016 14:20:39 +0530 Subject: [PATCH] SUPPORT-69: Async Job Database Connection Timeouts, connection refresh during create volume Signed-off-by: Rohit Yadav --- .../cloudstack/storage/image/store/TemplateObject.java | 3 +++ .../cloudstack/storage/snapshot/SnapshotObject.java | 3 +++ .../apache/cloudstack/storage/volume/VolumeObject.java | 3 +++ .../db/src/com/cloud/utils/db/TransactionLegacy.java | 10 ++++++++++ 4 files changed, 19 insertions(+) diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java index fa2c80b0ed9..cec42bb2ec3 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java @@ -52,6 +52,7 @@ import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplatePoolDao; import com.cloud.template.VirtualMachineTemplate; import com.cloud.utils.component.ComponentContext; +import com.cloud.utils.db.TransactionLegacy; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.fsm.NoTransitionException; @@ -184,6 +185,8 @@ public class TemplateObject implements TemplateInfo { @Override public void processEvent(ObjectInDataStoreStateMachine.Event event, Answer answer) { try { + TransactionLegacy txn = TransactionLegacy.currentTxn(); + txn.checkConnection(); if (getDataStore().getRole() == DataStoreRole.Primary) { if (answer instanceof CopyCmdAnswer) { CopyCmdAnswer cpyAnswer = (CopyCmdAnswer)answer; diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java index 60ff31e4342..2eaa1f0c42c 100644 --- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java +++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java @@ -53,6 +53,7 @@ import com.cloud.storage.dao.SnapshotDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.utils.component.ComponentContext; import com.cloud.utils.db.QueryBuilder; +import com.cloud.utils.db.TransactionLegacy; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.fsm.NoTransitionException; @@ -288,6 +289,8 @@ public class SnapshotObject implements SnapshotInfo { @Override public void processEvent(ObjectInDataStoreStateMachine.Event event, Answer answer) { try { + TransactionLegacy txn = TransactionLegacy.currentTxn(); + txn.checkConnection(); SnapshotDataStoreVO snapshotStore = snapshotStoreDao.findByStoreSnapshot(getDataStore().getRole(), getDataStore().getId(), getId()); if (answer instanceof CreateObjectAnswer) { SnapshotObjectTO snapshotTO = (SnapshotObjectTO)((CreateObjectAnswer)answer).getData(); diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java index 6a424353b78..0628607ca49 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java @@ -48,6 +48,7 @@ import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.DiskOfferingDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.utils.component.ComponentContext; +import com.cloud.utils.db.TransactionLegacy; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.fsm.NoTransitionException; import com.cloud.utils.fsm.StateMachine2; @@ -512,6 +513,8 @@ public class VolumeObject implements VolumeInfo { @Override public void processEvent(ObjectInDataStoreStateMachine.Event event, Answer answer) { try { + TransactionLegacy txn = TransactionLegacy.currentTxn(); + txn.checkConnection(); if (dataStore.getRole() == DataStoreRole.Primary) { if (answer instanceof CopyCmdAnswer) { CopyCmdAnswer cpyAnswer = (CopyCmdAnswer)answer; diff --git a/framework/db/src/com/cloud/utils/db/TransactionLegacy.java b/framework/db/src/com/cloud/utils/db/TransactionLegacy.java index 7784d2f4399..fc2502c849d 100755 --- a/framework/db/src/com/cloud/utils/db/TransactionLegacy.java +++ b/framework/db/src/com/cloud/utils/db/TransactionLegacy.java @@ -177,6 +177,16 @@ public class TransactionLegacy implements Closeable { return txn; } + public void checkConnection() { + try { + if (_conn != null && !_conn.isValid(3)) { + _conn = null; + } + } catch (SQLException e) { + _conn = null; + } + } + protected StackElement peekInStack(Object obj) { final Iterator it = _stack.iterator(); while (it.hasNext()) {