> On Oct. 15, 2013, 2:41 p.m., John Burwell wrote:
> > engine/storage/integration-test/test/org/apache/cloudstack/storage/test/SnapshotTest.java,
> >  line 437
> > <https://reviews.apache.org/r/14522/diff/2/?file=364644#file364644line437>
> >
> >     *This comment may be more editorial at this point because of the nature 
> > of the existing code*
> >     I would prefer to see an exception thrown here rather than the 
> > complexity of the canHandle.  I am also concerned that the canHandle method 
> > only checks that the underlying device can take a snapshot without 
> > accounting for whether or not the volume is in a state to take a consistent 
> > snapshot.  I am also concerned that we don't have a semantic for handling 
> > errors that might result from the actual snapshot operation.
> 
> Chris Suich wrote:
>     That is actually the purpose of the canHandle() method - to ONLY check 
> whether the underlying device can handle the operation, not whether the 
> storage is in the right state. For example, if my driver can handle 
> snapshotting, but I am unable to actually perform the snapshot, I still want 
> to be the one asked to take the snapshot so that I am the one to cause the 
> API to fail.
>     
>     Additionally, I'm not sure how we could exclude other strategies from 
> attempting to take my storage and try to snapshot. If there are two snapshot 
> strategies and they are not sorted by canHandle(), then some other strategy 
> may be given the opportunity to take the snapshot and simply fail the API 
> because it cannot actually handle it.
> 
> John Burwell wrote:
>     This logic seems overly complicated.  There can be a number of reasons 
> why a snapshot operation will not succeed for a device.  Among those reasons 
> is that the device is being asked to perform an operation it does not 
> support.  As I understand the operation, a snapshot is a operation directed 
> to a particular volume, Volume A.  When the storage layer is asked to 
> snapshot Volume A, the work will eventually be performed by the associated 
> device driver, Device Driver 1.  If Device Driver 1 does not support the 
> requested operation, then the snapshot operation fails.  There are not other 
> options in this scenario.  Provided my understanding is correct, I don't see 
> the need for an additional canHandle method.  Simply call the method, and if 
> it doesn't throw an exception, the operation succeeded.  I am concerned that 
> the current interface seems to only concern itself with whether or not the 
> driver can do something to the exclusion of whether or not the device is in a 
> state to properly p
 erform the operation.
> 
> Chris Suich wrote:
>     Ok, I think I see what you are saying. Once the strategies are sorted (by 
> calling canHandle()), then we no longer need to check whether the strategy 
> can handle the operation and should simply execute the operation on the top 
> sorted strategy.
>     
>     Is that what you are saying?
> 
> John Burwell wrote:
>     Essentially, yes.  I also concerned with the atomicity of the operation 
> once we properly consider the state of the device.  By calling canHandle, and 
> then performing the operation, we creates a race condition.  Combining the 
> check with the operation allows the system to atomicity check and perform the 
> operation -- eliminating races with other threads performing the same 
> operation.
> 
> Chris Suich wrote:
>     How can we determine which strategy to use if we do not check whether the 
> strategy can handle an operation? The canHandle method should not be doing 
> some dynamic check of the state of a the storage to determine whether it can 
> handle an operation. It should simply indicate whether a strategy supports 
> the static operation. If there is a better way to approach this, then that is 
> fine, but the strategies should be able to indicate that. Again, this has 
> nothing to do with the underlying storage. Storage drivers that want to be 
> baked into the default snapshotting workflow can implement the driver level 
> takeSnapshot() and revertSnapshot() method.

I forgot to mention - the reason I don't like having a completely static 
response to whether the strategy supports an operation (like the 
getCapabilities() posted above) is that there is some runtime logic that can 
determine whether a plugin strategy can handle an operation. My use case, for 
example, is that our strategy only works on VMs on our storage. A non-storage 
use case may be something like having a plugin snapshot strategy that is only 
used for VMs using a certain disk offering. In cases like this, the snapshot 
strategy needs to run some check against the VM/volume the request is for, not 
just a compile time declaration of what it can do.


- Chris


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/14522/#review27021
-----------------------------------------------------------


On Oct. 14, 2013, 10:50 p.m., Chris Suich wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/14522/
> -----------------------------------------------------------
> 
> (Updated Oct. 14, 2013, 10:50 p.m.)
> 
> 
> Review request for cloudstack, Brian Federle, edison su, John Burwell, and 
> Mike Tutkowski.
> 
> 
> Repository: cloudstack-git
> 
> 
> Description
> -------
> 
> After the last batch of work to the revertSnapshot API, SnapshotServiceImpl 
> was not tied into the workflow to be used by storage providers. I have added 
> the logic in a similar fashion to takeSnapshot(), backupSnapshot() and 
> deleteSnapshot().
> 
> I have also added a 'Revert to Snapshot' action to the volume snapshots list 
> in the UI.
> 
> 
> Diffs
> -----
> 
>   api/src/org/apache/cloudstack/api/ApiConstants.java f85784b 
>   api/src/org/apache/cloudstack/api/response/SnapshotResponse.java e9cb109 
>   
> engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreDriver.java
>  b124d83 
>   
> engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotInfo.java
>  8d6b760 
>   
> engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotStrategy.java
>  e4cecb6 
>   
> engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StrategyPriority.java
>  8bd04f5 
>   
> engine/api/test/org/apache/cloudstack/engine/subsystem/api/storage/StrategyPriorityTest.java
>  329b99f 
>   
> engine/storage/integration-test/test/org/apache/cloudstack/storage/test/FakePrimaryDataStoreDriver.java
>  810afd1 
>   
> engine/storage/integration-test/test/org/apache/cloudstack/storage/test/SnapshotTest.java
>  81f77d6 
>   
> engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
>  3f35e1d 
>   
> engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
>  6a874d6 
>   
> plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java
>  3eaeb1f 
>   
> plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/driver/SamplePrimaryDataStoreDriverImpl.java
>  ece7b26 
>   
> plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java
>  8046b6c 
>   server/src/com/cloud/api/ApiResponseHelper.java f4ca112 
>   server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java dade983 
>   ui/scripts/storage.js b16f4d4 
> 
> Diff: https://reviews.apache.org/r/14522/diff/
> 
> 
> Testing
> -------
> 
> I have tested all of this locally with a custom storage provider.
> 
> Unfortunately, I'm still in the middle of figuring out how to properly unit 
> test this type of code. If anyone has any recommendations, please let me know.
> 
> 
> Thanks,
> 
> Chris Suich
> 
>

Reply via email to