cloudstack-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bfede...@apache.org
Subject [10/34] git commit: updated refs/heads/ui-restyle to 23093ed
Date Thu, 26 Sep 2013 18:03:11 GMT
add table lock on snapshot, during taking snapshot

Conflicts:

	engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/a82b1798
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/a82b1798
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/a82b1798

Branch: refs/heads/ui-restyle
Commit: a82b1798789eb05bd3653af1c46157eb16627be3
Parents: b5f7e30
Author: Edison Su <sudison@gmail.com>
Authored: Wed Sep 25 16:03:59 2013 -0700
Committer: Edison Su <sudison@gmail.com>
Committed: Wed Sep 25 16:03:59 2013 -0700

----------------------------------------------------------------------
 .../storage/test/ChildTestConfiguration.java    |   4 +-
 .../storage/test/MockStorageMotionStrategy.java |  17 ++
 .../storage/test/SnapshotTestWithFakeData.java  | 170 ++++++++++++++++---
 .../test/resource/fakeDriverTestContext.xml     |   1 +
 .../snapshot/XenserverSnapshotStrategy.java     |  66 ++++---
 .../image/db/SnapshotDataStoreDaoImpl.java      |   6 +-
 .../storage/volume/VolumeServiceImpl.java       |   6 +-
 .../storage/snapshot/SnapshotManagerImpl.java   |  23 ++-
 8 files changed, 231 insertions(+), 62 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a82b1798/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java
----------------------------------------------------------------------
diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java
b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java
index 2724118..d5eea85 100644
--- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java
+++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java
@@ -18,6 +18,8 @@ package org.apache.cloudstack.storage.test;
 
 import java.io.IOException;
 
+import com.cloud.event.ActionEventUtils;
+import com.cloud.event.dao.EventDaoImpl;
 import org.apache.cloudstack.acl.APIChecker;
 import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
 import org.apache.cloudstack.engine.service.api.OrchestrationService;
@@ -107,7 +109,7 @@ import com.cloud.vm.snapshot.dao.VMSnapshotDaoImpl;
         VMSnapshotDaoImpl.class, OCFS2ManagerImpl.class, ClusterDetailsDaoImpl.class, SecondaryStorageVmDaoImpl.class,
         ConsoleProxyDaoImpl.class, StoragePoolWorkDaoImpl.class, StorageCacheManagerImpl.class,
UserDaoImpl.class,
         DataCenterDaoImpl.class, StoragePoolDetailsDaoImpl.class, DomainDaoImpl.class, DownloadMonitorImpl.class,
-        AccountDaoImpl.class }, includeFilters = { @Filter(value = Library.class, type =
FilterType.CUSTOM) },
+        AccountDaoImpl.class, ActionEventUtils.class, EventDaoImpl.class}, includeFilters
= { @Filter(value = Library.class, type = FilterType.CUSTOM) },
         useDefaultFilters = false)
 public class ChildTestConfiguration extends TestConfiguration {
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a82b1798/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockStorageMotionStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockStorageMotionStrategy.java
b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockStorageMotionStrategy.java
index 2a83689..6c0bd55 100644
--- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockStorageMotionStrategy.java
+++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockStorageMotionStrategy.java
@@ -28,23 +28,30 @@ import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionStrategy;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
 import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
 
 import com.cloud.agent.api.to.VirtualMachineTO;
 import com.cloud.host.Host;
 import org.apache.cloudstack.storage.command.CopyCmdAnswer;
+import org.apache.cloudstack.storage.snapshot.SnapshotObject;
 import org.apache.cloudstack.storage.to.SnapshotObjectTO;
 import org.apache.cloudstack.storage.to.TemplateObjectTO;
 
 public class MockStorageMotionStrategy implements DataMotionStrategy {
 
+    boolean success = true;
     @Override
     public boolean canHandle(DataObject srcData, DataObject destData) {
         // TODO Auto-generated method stub
         return true;
     }
 
+    public void makeBackupSnapshotSucceed(boolean success) {
+        this.success = success;
+    }
+
     @Override
     public boolean canHandle(Map<VolumeInfo, DataStore> volumeMap, Host srcHost, Host
destHost) {
         return true;
@@ -54,9 +61,19 @@ public class MockStorageMotionStrategy implements DataMotionStrategy {
     public Void copyAsync(DataObject srcData, DataObject destData, AsyncCompletionCallback<CopyCommandResult>
callback) {
         CopyCmdAnswer answer = null;
         DataTO data = null;
+        if (!success) {
+            CopyCommandResult result = new CopyCommandResult(null, null);
+            result.setResult("Failed");
+            callback.complete(result);
+        }
         if (destData.getType() == DataObjectType.SNAPSHOT) {
+            SnapshotInfo srcSnapshot = (SnapshotInfo)srcData;
+
             SnapshotObjectTO newSnapshot = new SnapshotObjectTO();
             newSnapshot.setPath(UUID.randomUUID().toString());
+            if (srcSnapshot.getParent() != null) {
+                newSnapshot.setParentSnapshotPath(srcSnapshot.getParent().getPath());
+            }
             data = newSnapshot;
         } else if (destData.getType() == DataObjectType.TEMPLATE) {
             TemplateObjectTO newTemplate = new TemplateObjectTO();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a82b1798/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/SnapshotTestWithFakeData.java
----------------------------------------------------------------------
diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/SnapshotTestWithFakeData.java
b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/SnapshotTestWithFakeData.java
index d546505..2aaabda 100644
--- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/SnapshotTestWithFakeData.java
+++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/SnapshotTestWithFakeData.java
@@ -18,18 +18,37 @@
  */
 package org.apache.cloudstack.storage.test;
 
+import com.cloud.cluster.LockMasterListener;
+import com.cloud.dc.ClusterVO;
+import com.cloud.dc.DataCenter;
+import com.cloud.dc.DataCenterVO;
+import com.cloud.dc.HostPodVO;
+import com.cloud.dc.dao.ClusterDao;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.dc.dao.HostPodDao;
 import com.cloud.hypervisor.Hypervisor;
+import com.cloud.org.Cluster;
+import com.cloud.org.Managed;
+import com.cloud.storage.CreateSnapshotPayload;
+import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.ScopeType;
 import com.cloud.storage.Snapshot;
+import com.cloud.storage.SnapshotPolicyVO;
 import com.cloud.storage.SnapshotVO;
 import com.cloud.storage.Storage;
 import com.cloud.storage.StoragePoolStatus;
 import com.cloud.storage.Volume;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.SnapshotDao;
+import com.cloud.storage.dao.SnapshotPolicyDao;
 import com.cloud.storage.dao.VolumeDao;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.user.User;
+import com.cloud.utils.DateUtil;
 import com.cloud.utils.component.ComponentContext;
 import com.cloud.utils.db.DB;
+import com.cloud.utils.db.Merovingian2;
 import junit.framework.Assert;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
@@ -45,10 +64,14 @@ import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService;
 import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
+import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
+import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.cloudstack.storage.volume.VolumeObject;
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -59,7 +82,9 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 import javax.inject.Inject;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.Callable;
@@ -70,6 +95,9 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 @RunWith(SpringJUnit4ClassRunner.class)
 @ContextConfiguration(locations = { "classpath:/fakeDriverTestContext.xml" })
 public class SnapshotTestWithFakeData  {
@@ -93,31 +121,106 @@ public class SnapshotTestWithFakeData  {
     VolumeService volumeService;
     @Inject
     VolumeDataFactory volumeDataFactory;
+    @Inject
+    DataCenterDao dcDao;
+    Long dcId;
+    @Inject
+    HostPodDao podDao;
+    Long podId;
+    @Inject
+    ClusterDao clusterDao;
+    Long clusterId;
+    @Inject
+    ImageStoreDao imageStoreDao;
+    ImageStoreVO imageStore;
+    @Inject
+    AccountManager accountManager;
+    LockMasterListener lockMasterListener;
     VolumeInfo vol = null;
     FakePrimaryDataStoreDriver driver = new FakePrimaryDataStoreDriver();
+    @Inject
+    MockStorageMotionStrategy mockStorageMotionStrategy;
+    Merovingian2 _lockMaster;
+    @Inject
+    SnapshotPolicyDao snapshotPolicyDao;
 
     @Before
     public void setUp() {
-        Mockito.when(primaryDataStoreProvider.configure(Mockito.anyMap())).thenReturn(true);
+        // create data center
+
+        DataCenterVO dc = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8",
null, "10.0.0.1", null,
+                "10.0.0.1/24", null, null, DataCenter.NetworkType.Basic, null, null, true,
true, null, null);
+        dc = dcDao.persist(dc);
+        dcId = dc.getId();
+        // create pod
+
+        HostPodVO pod = new HostPodVO(UUID.randomUUID().toString(), dc.getId(), "10.223.0.1",
+                "10.233.2.2/25", 8, "test");
+        pod = podDao.persist(pod);
+        podId = pod.getId();
+        // create xen cluster
+        ClusterVO cluster = new ClusterVO(dc.getId(), pod.getId(), "devcloud cluster");
+        cluster.setHypervisorType(Hypervisor.HypervisorType.XenServer.toString());
+        cluster.setClusterType(Cluster.ClusterType.CloudManaged);
+        cluster.setManagedState(Managed.ManagedState.Managed);
+        cluster = clusterDao.persist(cluster);
+        clusterId = cluster.getId();
+
+        imageStore = new ImageStoreVO();
+        imageStore.setName(UUID.randomUUID().toString());
+        imageStore.setDataCenterId(dcId);
+        imageStore.setProviderName(DataStoreProvider.NFS_IMAGE);
+        imageStore.setRole(DataStoreRole.Image);
+        imageStore.setUrl(UUID.randomUUID().toString());
+        imageStore.setUuid(UUID.randomUUID().toString());
+        imageStore.setProtocol("nfs");
+        imageStore = imageStoreDao.persist(imageStore);
+
+        when(primaryDataStoreProvider.configure(Mockito.anyMap())).thenReturn(true);
         Set<DataStoreProvider.DataStoreProviderType> types = new HashSet<DataStoreProvider.DataStoreProviderType>();
         types.add(DataStoreProvider.DataStoreProviderType.PRIMARY);
 
-        Mockito.when(primaryDataStoreProvider.getTypes()).thenReturn(types);
-        Mockito.when(primaryDataStoreProvider.getName()).thenReturn(DataStoreProvider.DEFAULT_PRIMARY);
-        Mockito.when(primaryDataStoreProvider.getDataStoreDriver()).thenReturn(driver);
+        when(primaryDataStoreProvider.getTypes()).thenReturn(types);
+        when(primaryDataStoreProvider.getName()).thenReturn(DataStoreProvider.DEFAULT_PRIMARY);
+        when(primaryDataStoreProvider.getDataStoreDriver()).thenReturn(driver);
+        User user = mock(User.class);
+        when(user.getId()).thenReturn(1L);
+        Account account = mock(Account.class);
+        when(account.getId()).thenReturn(1L);
+        when(accountManager.getSystemAccount()).thenReturn(account);
+        when(accountManager.getSystemUser()).thenReturn(user);
 
+        if(Merovingian2.getLockMaster() == null) {
+            _lockMaster = Merovingian2.createLockMaster(1234);
+        } else {
+            _lockMaster = Merovingian2.getLockMaster();
+        }
+        _lockMaster.cleanupThisServer();
         ComponentContext.initComponentsLifeCycle();
     }
+
+    @After
+    public void tearDown() throws Exception {
+        _lockMaster.cleanupThisServer();
+    }
     private SnapshotVO createSnapshotInDb() {
-        Snapshot.Type snapshotType = Snapshot.Type.MANUAL;
-        SnapshotVO snapshotVO = new SnapshotVO(1, 2, 1, 1L, 1L, UUID.randomUUID()
+        Snapshot.Type snapshotType = Snapshot.Type.RECURRING;
+        SnapshotVO snapshotVO = new SnapshotVO(dcId, 2, 1, 1L, 1L, UUID.randomUUID()
+                .toString(), (short) snapshotType.ordinal(), snapshotType.name(), 100,
+                Hypervisor.HypervisorType.XenServer);
+        return this.snapshotDao.persist(snapshotVO);
+    }
+
+    private SnapshotVO createSnapshotInDb(Long volumeId) {
+        Snapshot.Type snapshotType = Snapshot.Type.DAILY;
+        SnapshotVO snapshotVO = new SnapshotVO(dcId, 2, 1, volumeId, 1L, UUID.randomUUID()
                 .toString(), (short) snapshotType.ordinal(), snapshotType.name(), 100,
                 Hypervisor.HypervisorType.XenServer);
         return this.snapshotDao.persist(snapshotVO);
     }
 
     private VolumeInfo createVolume(Long templateId, DataStore store) {
-        VolumeVO volume = new VolumeVO(Volume.Type.DATADISK, UUID.randomUUID().toString(),
1L, 1L, 1L, 1L, 1000, 0L, 0L, "");
+        VolumeVO volume = new VolumeVO(Volume.Type.DATADISK, UUID.randomUUID().toString(),
dcId, 1L, 1L, 1L, 1000, 0L, 0L, "");
         ;
         volume.setPoolId(store.getId());
 
@@ -129,8 +232,8 @@ public class SnapshotTestWithFakeData  {
     }
     private DataStore createDataStore() throws URISyntaxException {
         StoragePoolVO pool = new StoragePoolVO();
-        pool.setClusterId(1L);
-        pool.setDataCenterId(1);
+        pool.setClusterId(clusterId);
+        pool.setDataCenterId(dcId);
         URI uri = new URI("nfs://jfkdkf/fjdkfj");
         pool.setHostAddress(uri.getHost());
         pool.setPath(uri.getPath());
@@ -139,14 +242,14 @@ public class SnapshotTestWithFakeData  {
         pool.setUuid(UUID.randomUUID().toString());
         pool.setStatus(StoragePoolStatus.Up);
         pool.setPoolType(Storage.StoragePoolType.NetworkFilesystem);
-        pool.setPodId(1L);
+        pool.setPodId(podId);
         pool.setScope(ScopeType.CLUSTER);
         pool.setStorageProviderName(DataStoreProvider.DEFAULT_PRIMARY);
         pool = this.primaryDataStoreDao.persist(pool);
         DataStore store = this.dataStoreManager.getPrimaryDataStore(pool.getId());
         return store;
     }
-    @Test
+    //@Test
     public void testTakeSnapshot() throws URISyntaxException {
         SnapshotVO snapshotVO = createSnapshotInDb();
         DataStore store = createDataStore();
@@ -167,7 +270,7 @@ public class SnapshotTestWithFakeData  {
         }
     }
 
-    @Test
+    //@Test
     public void testTakeSnapshotWithFailed() throws URISyntaxException {
         SnapshotVO snapshotVO = createSnapshotInDb();
         DataStore store = null;
@@ -188,7 +291,7 @@ public class SnapshotTestWithFakeData  {
         }
     }
 
-    @Test
+    //@Test
     public void testTakeSnapshotFromVolume() throws URISyntaxException {
         DataStore store = createDataStore();
         FakePrimaryDataStoreDriver dataStoreDriver = (FakePrimaryDataStoreDriver)store.getDriver();
@@ -200,32 +303,57 @@ public class SnapshotTestWithFakeData  {
         Assert.assertTrue(result == null);
     }
 
+    protected SnapshotPolicyVO createSnapshotPolicy(Long volId) {
+        SnapshotPolicyVO policyVO = new SnapshotPolicyVO(volId, "jfkd", "fdfd", DateUtil.IntervalType.DAILY,
8);
+        policyVO = snapshotPolicyDao.persist(policyVO);
+        return policyVO;
+    }
+
     @Test
     public void testConcurrentSnapshot() throws URISyntaxException, InterruptedException,
ExecutionException {
         DataStore store = createDataStore();
-        FakePrimaryDataStoreDriver dataStoreDriver = (FakePrimaryDataStoreDriver)store.getDriver();
+        final FakePrimaryDataStoreDriver dataStoreDriver = (FakePrimaryDataStoreDriver)store.getDriver();
         dataStoreDriver.makeTakeSnapshotSucceed(true);
         final VolumeInfo volumeInfo = createVolume(1L, store);
         Assert.assertTrue(volumeInfo.getState() == Volume.State.Ready);
         vol = volumeInfo;
+       // final SnapshotPolicyVO policyVO = createSnapshotPolicy(vol.getId());
+
+
         ExecutorService pool = Executors.newFixedThreadPool(2);
         boolean result = false;
-        Future<Boolean> future = null;
-        for(int i = 0; i < 1; i++) {
-           future =  pool.submit(new Callable<Boolean>() {
+        List<Future<Boolean>> future = new ArrayList<Future<Boolean>>();
+        for(int i = 0; i < 12; i++) {
+            final int cnt = i;
+           Future<Boolean> task =  pool.submit(new Callable<Boolean>() {
                 @Override
                 public Boolean call() throws Exception {
-                    boolean r = false;
+                    boolean r = true;
                     try {
+                        SnapshotVO snapshotVO = createSnapshotInDb(vol.getId());
+                        VolumeObject volumeObject = (VolumeObject)vol;
+                        Account account = mock(Account.class);
+                        when(account.getId()).thenReturn(1L);
+                        CreateSnapshotPayload createSnapshotPayload = mock(CreateSnapshotPayload.class);
+                        when(createSnapshotPayload.getAccount()).thenReturn(account);
+                        when(createSnapshotPayload.getSnapshotId()).thenReturn(snapshotVO.getId());
+                        when(createSnapshotPayload.getSnapshotPolicyId()).thenReturn(0L);
+                        volumeObject.addPayload(createSnapshotPayload);
+                        if (cnt > 8) {
+                            mockStorageMotionStrategy.makeBackupSnapshotSucceed(false);
+                        }
                         SnapshotInfo newSnapshot = volumeService.takeSnapshot(vol);
-                        Assert.assertTrue(newSnapshot != null);
+                        if (newSnapshot == null) {
+                            r = false;
+                        }
                     } catch (Exception e) {
                         r = false;
                     }
-                    return true;
+                    return r;
                 }
             });
+            Assert.assertTrue(task.get());
         }
-        future.get();
+
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a82b1798/engine/storage/integration-test/test/resource/fakeDriverTestContext.xml
----------------------------------------------------------------------
diff --git a/engine/storage/integration-test/test/resource/fakeDriverTestContext.xml b/engine/storage/integration-test/test/resource/fakeDriverTestContext.xml
index c3c8ef5..b7ef363 100644
--- a/engine/storage/integration-test/test/resource/fakeDriverTestContext.xml
+++ b/engine/storage/integration-test/test/resource/fakeDriverTestContext.xml
@@ -86,5 +86,6 @@
     <bean id='SnapshotManagerImpl' class='com.cloud.storage.snapshot.SnapshotManagerImpl'/>
     <bean id='SnapshotPolicyDao' class='com.cloud.storage.dao.SnapshotPolicyDaoImpl'/>
     <bean id='SnapshotScheduleDao' class='com.cloud.storage.dao.SnapshotScheduleDaoImpl'
/>
+    <bean id='UserContextInitializer'  class='com.cloud.user.UserContextInitializer' />
 
 </beans>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a82b1798/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
index 5653ab4..fbf9081 100644
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
@@ -18,6 +18,7 @@ package org.apache.cloudstack.storage.snapshot;
 
 import javax.inject.Inject;
 
+import com.cloud.utils.db.DB;
 import org.apache.cloudstack.engine.subsystem.api.storage.*;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
@@ -189,7 +190,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
 
         if (!Snapshot.State.BackedUp.equals(snapshotVO.getState())) {
             throw new InvalidParameterValueException("Can't delete snapshotshot " + snapshotId
-                    + " due to it is not in BackedUp Status");
+                    + " due to it is in " + snapshotVO.getState() + " Status");
         }
 
         // first mark the snapshot as destroyed, so that ui can't see it, but we
@@ -235,40 +236,53 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase
{
     }
 
     @Override
+    @DB
     public SnapshotInfo takeSnapshot(SnapshotInfo snapshot) {
-        SnapshotResult result =  snapshotSvr.takeSnapshot(snapshot);
-        if (result.isFailed()) {
-            s_logger.debug("Failed to take snapshot: " + result.getResult());
-            throw new CloudRuntimeException(result.getResult());
+        SnapshotVO snapshotVO = snapshotDao.acquireInLockTable(snapshot.getId());
+        if (snapshotVO == null) {
+            throw new CloudRuntimeException("Failed to get lock on snapshot:" + snapshot.getId());
         }
-        snapshot = result.getSnashot();
-        DataStore primaryStore = snapshot.getDataStore();
 
-        SnapshotInfo backupedSnapshot = this.backupSnapshot(snapshot);
         try {
-            SnapshotInfo parent = snapshot.getParent();
-            if (backupedSnapshot != null && parent != null) {
-                Long parentSnapshotId = parent.getId();
-                while (parentSnapshotId != null && parentSnapshotId != 0L) {
-                    SnapshotDataStoreVO snapshotDataStoreVO = snapshotStoreDao.findByStoreSnapshot(primaryStore.getRole(),primaryStore.getId(),
parentSnapshotId);
+            SnapshotResult result =  snapshotSvr.takeSnapshot(snapshot);
+            if (result.isFailed()) {
+                s_logger.debug("Failed to take snapshot: " + result.getResult());
+                throw new CloudRuntimeException(result.getResult());
+            }
+            snapshot = result.getSnashot();
+            DataStore primaryStore = snapshot.getDataStore();
+
+            SnapshotInfo backupedSnapshot = this.backupSnapshot(snapshot);
+
+            try {
+                SnapshotInfo parent = snapshot.getParent();
+                if (backupedSnapshot != null && parent != null) {
+                    Long parentSnapshotId = parent.getId();
+                    while (parentSnapshotId != null && parentSnapshotId != 0L) {
+                        SnapshotDataStoreVO snapshotDataStoreVO = snapshotStoreDao.findByStoreSnapshot(primaryStore.getRole(),primaryStore.getId(),
parentSnapshotId);
+                        if (snapshotDataStoreVO != null) {
+                            parentSnapshotId = snapshotDataStoreVO.getParentSnapshotId();
+                            snapshotStoreDao.remove(snapshotDataStoreVO.getId());
+                        } else {
+                            parentSnapshotId = null;
+                        }
+                    }
+                    SnapshotDataStoreVO snapshotDataStoreVO = snapshotStoreDao.findByStoreSnapshot(primaryStore.getRole(),
primaryStore.getId(),
+                            snapshot.getId());
                     if (snapshotDataStoreVO != null) {
-                        parentSnapshotId = snapshotDataStoreVO.getParentSnapshotId();
-                        snapshotStoreDao.remove(snapshotDataStoreVO.getId());
-                    } else {
-                        parentSnapshotId = null;
+                        snapshotDataStoreVO.setParentSnapshotId(0L);
+                        snapshotStoreDao.update(snapshotDataStoreVO.getId(), snapshotDataStoreVO);
                     }
                 }
-                SnapshotDataStoreVO snapshotDataStoreVO = snapshotStoreDao.findByStoreSnapshot(primaryStore.getRole(),
primaryStore.getId(),
-                        snapshot.getId());
-                if (snapshotDataStoreVO != null) {
-                    snapshotDataStoreVO.setParentSnapshotId(0L);
-                    snapshotStoreDao.update(snapshotDataStoreVO.getId(), snapshotDataStoreVO);
-                }
+            } catch (Exception e) {
+                s_logger.debug("Failed to clean up snapshots on primary storage", e);
+            }
+            return backupedSnapshot;
+        } finally {
+            if (snapshotVO != null) {
+                snapshotDao.releaseFromLockTable(snapshot.getId());
             }
-        } catch (Exception e) {
-            s_logger.debug("Failed to clean up snapshots on primary storage", e);
         }
-        return backupedSnapshot;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a82b1798/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
index 1935a88..d828085 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
@@ -25,7 +25,8 @@ import java.util.Map;
 
 import javax.naming.ConfigurationException;
 
-import com.cloud.utils.db.SearchCriteria2;
+
+import com.cloud.utils.db.DB;
 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.Event;
@@ -179,6 +180,7 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
     }
 
     @Override
+    @DB
     public SnapshotDataStoreVO findParent(DataStoreRole role, Long storeId, Long volumeId)
{
         Transaction txn = Transaction.currentTxn();
         PreparedStatement pstmt = null;
@@ -197,8 +199,6 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
             }
         } catch (SQLException e) {
             s_logger.debug("Failed to find parent snapshot: " + e.toString());
-        } finally {
-            txn.close();
         }
         return null;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a82b1798/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
index e7ff021..eab79b8 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
@@ -1292,8 +1292,10 @@ public class VolumeServiceImpl implements VolumeService {
     @Override
     public SnapshotInfo takeSnapshot(VolumeInfo volume) {
         VolumeObject vol = (VolumeObject) volume;
-        vol.stateTransit(Volume.Event.SnapshotRequested);
-
+        boolean result = vol.stateTransit(Volume.Event.SnapshotRequested);
+        if (!result) {
+            s_logger.debug("Failed to transit state");
+        }
         SnapshotInfo snapshot = null;
         try {
             snapshot = snapshotMgr.takeSnapshot(volume);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a82b1798/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
index 6574b7f..2297e6a 100755
--- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
+++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
@@ -459,7 +459,9 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
         while (snaps.size() > maxSnaps && snaps.size() > 1) {
             SnapshotVO oldestSnapshot = snaps.get(0);
             long oldSnapId = oldestSnapshot.getId();
-            s_logger.debug("Max snaps: " + policy.getMaxSnaps() + " exceeded for snapshot
policy with Id: " + policyId + ". Deleting oldest snapshot: " + oldSnapId);
+            if (policy != null) {
+                s_logger.debug("Max snaps: " + policy.getMaxSnaps() + " exceeded for snapshot
policy with Id: " + policyId + ". Deleting oldest snapshot: " + oldSnapId);
+            }
             if(deleteSnapshot(oldSnapId)){
             	//log Snapshot delete event
                 ActionEventUtils.onCompletedActionEvent(User.UID_SYSTEM, oldestSnapshot.getAccountId(),
EventVO.LEVEL_INFO, EventTypes.EVENT_SNAPSHOT_DELETE, "Successfully deleted oldest snapshot:
" + oldSnapId, 0);
@@ -997,6 +999,7 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
 		return true;
 	}
     @Override
+    @DB
     public SnapshotInfo takeSnapshot(VolumeInfo volume) throws ResourceAllocationException
{
         CreateSnapshotPayload payload = (CreateSnapshotPayload)volume.getpayload();
         Long snapshotId = payload.getSnapshotId();
@@ -1015,15 +1018,17 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
             if (!processed) {
                 throw new CloudRuntimeException("Can't find snapshot strategy to deal with
snapshot:" + snapshotId);
             }
-            postCreateSnapshot(volume.getId(), snapshotId, payload.getSnapshotPolicyId());
-
-            UsageEventUtils.publishUsageEvent(EventTypes.EVENT_SNAPSHOT_CREATE, snapshot.getAccountId(),
-                    snapshot.getDataCenterId(), snapshotId, snapshot.getName(), null, null,
-                    volume.getSize(), snapshot.getClass().getName(), snapshot.getUuid());
-
-
-            _resourceLimitMgr.incrementResourceCount(snapshotOwner.getId(), ResourceType.snapshot);
 
+            try {
+                postCreateSnapshot(volume.getId(), snapshotId, payload.getSnapshotPolicyId());
+
+                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_SNAPSHOT_CREATE, snapshot.getAccountId(),
+                        snapshot.getDataCenterId(), snapshotId, snapshot.getName(), null,
null,
+                        volume.getSize(), snapshot.getClass().getName(), snapshot.getUuid());
+                _resourceLimitMgr.incrementResourceCount(snapshotOwner.getId(), ResourceType.snapshot);
+            } catch (Exception e) {
+                s_logger.debug("post process snapshot failed", e);
+            }
         } catch(Exception e) {
             s_logger.debug("Failed to create snapshot", e);
             if (backup) {


Mime
View raw message