From 5e013e9931837f11d878ae697a995a0b9d7166f8 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Wed, 21 Aug 2013 18:32:52 -0700 Subject: [PATCH] add test (cherry picked from commit d157e2970ebd6d8d4c5a98a6d2adbc5da013f59b) Signed-off-by: animesh --- .../storage/test/ChildTestConfiguration.java | 6 --- .../test/FakeDriverTestConfiguration.java | 7 ++++ .../test/MockStorageMotionStrategy.java | 24 +++++++++++- .../test/SnapshotTestWithFakeData.java | 39 ++++++++++++++++++- .../test/resource/fakeDriverTestContext.xml | 3 +- .../storage/snapshot/SnapshotManagerImpl.java | 4 -- 6 files changed, 70 insertions(+), 13 deletions(-) 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 817262c28d7..731c1c66343 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 @@ -185,12 +185,6 @@ public class ChildTestConfiguration extends TestConfiguration { return Mockito.mock(VirtualMachineManager.class); } - - @Bean - public SnapshotManager snapshotMgr() { - return Mockito.mock(SnapshotManager.class); - } - @Bean public ResourceManager resourceMgr() { return Mockito.mock(ResourceManager.class); diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/FakeDriverTestConfiguration.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/FakeDriverTestConfiguration.java index b0cf5e5be6f..b5421b4ceb1 100644 --- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/FakeDriverTestConfiguration.java +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/FakeDriverTestConfiguration.java @@ -18,6 +18,7 @@ */ package org.apache.cloudstack.storage.test; +import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionStrategy; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider; import org.apache.cloudstack.storage.datastore.provider.CloudStackPrimaryDataStoreProviderImpl; import org.apache.cloudstack.storage.datastore.type.DataStoreType; @@ -35,4 +36,10 @@ public class FakeDriverTestConfiguration extends ChildTestConfiguration{ return provider; } + @Bean + public DataMotionStrategy dataMotionStrategy() { + DataMotionStrategy strategy = new MockStorageMotionStrategy(); + return strategy; + } + } 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 52ccf410c8d..2a836892ebb 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 @@ -19,7 +19,11 @@ package org.apache.cloudstack.storage.test; import java.util.Map; +import java.util.UUID; +import com.cloud.agent.api.to.DataObjectType; +import com.cloud.agent.api.to.DataTO; +import com.cloud.storage.Storage; 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; @@ -29,6 +33,9 @@ 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.to.SnapshotObjectTO; +import org.apache.cloudstack.storage.to.TemplateObjectTO; public class MockStorageMotionStrategy implements DataMotionStrategy { @@ -45,7 +52,22 @@ public class MockStorageMotionStrategy implements DataMotionStrategy { @Override public Void copyAsync(DataObject srcData, DataObject destData, AsyncCompletionCallback callback) { - CopyCommandResult result = new CopyCommandResult("something", null); + CopyCmdAnswer answer = null; + DataTO data = null; + if (destData.getType() == DataObjectType.SNAPSHOT) { + SnapshotObjectTO newSnapshot = new SnapshotObjectTO(); + newSnapshot.setPath(UUID.randomUUID().toString()); + data = newSnapshot; + } else if (destData.getType() == DataObjectType.TEMPLATE) { + TemplateObjectTO newTemplate = new TemplateObjectTO(); + newTemplate.setPath(UUID.randomUUID().toString()); + newTemplate.setFormat(Storage.ImageFormat.QCOW2); + newTemplate.setSize(10L); + newTemplate.setPhysicalSize(10L); + data = newTemplate; + } + answer = new CopyCmdAnswer(data); + CopyCommandResult result = new CopyCommandResult("something", answer); callback.complete(result); return null; } 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 c98f7056662..d5465056aa6 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 @@ -29,6 +29,7 @@ import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.SnapshotDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.utils.component.ComponentContext; +import com.cloud.utils.db.DB; import junit.framework.Assert; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; @@ -61,10 +62,17 @@ import java.net.URISyntaxException; import java.util.HashSet; import java.util.Set; import java.util.UUID; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:/fakeDriverTestContext.xml" }) -public class SnapshotTestWithFakeData { +public class SnapshotTestWithFakeData { @Inject SnapshotService snapshotService; @Inject @@ -85,6 +93,7 @@ public class SnapshotTestWithFakeData { VolumeService volumeService; @Inject VolumeDataFactory volumeDataFactory; + VolumeInfo vol = null; FakePrimaryDataStoreDriver driver = new FakePrimaryDataStoreDriver(); @Before @@ -191,4 +200,32 @@ public class SnapshotTestWithFakeData { Assert.assertTrue(result == null); } + @Test + public void testConcurrentSnapshot() throws URISyntaxException, InterruptedException, ExecutionException { + DataStore store = createDataStore(); + FakePrimaryDataStoreDriver dataStoreDriver = (FakePrimaryDataStoreDriver)store.getDriver(); + dataStoreDriver.makeTakeSnapshotSucceed(true); + final VolumeInfo volumeInfo = createVolume(1L, store); + Assert.assertTrue(volumeInfo.getState() == Volume.State.Ready); + vol = volumeInfo; + ExecutorService pool = Executors.newFixedThreadPool(2); + boolean result = false; + Future future = null; + for(int i = 0; i < 1; i++) { + future = pool.submit(new Callable() { + @Override + public Boolean call() throws Exception { + boolean r = false; + try { + SnapshotInfo newSnapshot = volumeService.takeSnapshot(vol); + Assert.assertTrue(newSnapshot != null); + } catch (Exception e) { + r = false; + } + return true; + } + }); + } + future.get(); + } } diff --git a/engine/storage/integration-test/test/resource/fakeDriverTestContext.xml b/engine/storage/integration-test/test/resource/fakeDriverTestContext.xml index 3abcf08090b..98209de67e9 100644 --- a/engine/storage/integration-test/test/resource/fakeDriverTestContext.xml +++ b/engine/storage/integration-test/test/resource/fakeDriverTestContext.xml @@ -48,7 +48,6 @@ - @@ -84,4 +83,6 @@ + + diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java index 7e7026209e0..2730d258d29 100755 --- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java +++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java @@ -139,8 +139,6 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager, @Inject protected VMTemplateDao _templateDao; @Inject - protected HostDao _hostDao; - @Inject protected UserVmDao _vmDao; @Inject protected VolumeDao _volsDao; @@ -157,8 +155,6 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager, @Inject protected PrimaryDataStoreDao _storagePoolDao; @Inject - protected EventDao _eventDao; - @Inject protected SnapshotPolicyDao _snapshotPolicyDao = null; @Inject protected SnapshotScheduleDao _snapshotScheduleDao;