I logged a bug for this:
1. CLOUDSTACK-5823<https://issues.apache.org/jira/browse/CLOUDSTACK-5823> I assigned this to myself. I believe I've corrected the issue with taking a VMware snapshot, but I want to look into the delete and revert code, as well. On Tue, Jan 7, 2014 at 12:20 AM, Mike Tutkowski < mike.tutkow...@solidfire.com> wrote: > If it's true that only the last iteration "counts," couldn't we just grab > the last item in this list?: > > List<Pair<String, ManagedObjectReference>> vmdkFiles = vmMo. > getDiskDatastorePathChain(vdisks[i], false); > > > On Tue, Jan 7, 2014 at 12:19 AM, Mike Tutkowski < > mike.tutkow...@solidfire.com> wrote: > >> Hi Kelven, >> >> I've been playing around with some code to fix this VMware-snapshot >> issue. Probably won't have it done until tomorrow, but I wanted to ask you >> about this code: >> >> for (int i = 0; i < vdisks.length; i++) { >> >> List<Pair<String, ManagedObjectReference>> vmdkFiles >> = vmMo.getDiskDatastorePathChain(vdisks[i], false); >> >> >> for (Pair<String, ManagedObjectReference> fileItem : >> vmdkFiles) { >> >> >> Can you tell me why we iterate through all of the VMDK files of a virtual >> disk? It seems like only the last one "counts." Is that correct? Am I to >> assume the last one we iterate over is the most recent snapshot (the >> snapshot we just took)? >> >> Thanks! >> >> >> On Mon, Jan 6, 2014 at 10:47 PM, Mike Tutkowski < >> mike.tutkow...@solidfire.com> wrote: >> >>> Ignore my question about coming up with a baseName. >>> >>> I see now that volumeTO is not available in the first for loop. >>> >>> I do think the key and value we have in the map, though, is incorrect. >>> >>> What do you think? >>> >>> >>> On Mon, Jan 6, 2014 at 10:43 PM, Mike Tutkowski < >>> mike.tutkow...@solidfire.com> wrote: >>> >>>> Hi Kelven, >>>> >>>> To give you an idea visually what I am referring to, please check out >>>> this screen capture: >>>> >>>> http://i.imgur.com/ma3FE9o.png >>>> >>>> The key is "i-2" (part of the folder for the VMDK file). >>>> >>>> The value contains the folder the VMDK file is in. Since the path >>>> column for VMware volumes in the DB doesn't contain the folder the VMDK >>>> file is in, I think this may be incorrect, as well. >>>> >>>> I also noticed that we later try to retrieve from the map using >>>> volumeTO.getPath() (ignore the getPath() method that enclosing >>>> volumeTO.getPath() in the screen shot as this is related to new code...in >>>> the standard case, the value of volumeTO.getPath() is just returned from >>>> the getPath() method). >>>> >>>> In the first line of code visible in the screen capture, why do we go >>>> to the trouble of doing this: >>>> >>>> String baseName = extractSnapshotBaseFileName(vmdkName); >>>> >>>> It seems like this would have worked: >>>> >>>> String baseName = extractSnapshotBaseFileName(volumTO.getPath()); >>>> >>>> Or am I missing something there? >>>> >>>> Thanks!! >>>> >>>> >>>> On Mon, Jan 6, 2014 at 10:13 PM, Mike Tutkowski < >>>> mike.tutkow...@solidfire.com> wrote: >>>> >>>>> Thanks for the info, Kelven. >>>>> >>>>> I believe we have a serious bug then as null is being assigned to >>>>> newPath when a VMware snapshot is being taken (this is in 4.3, by the >>>>> way). >>>>> >>>>> I was trying to fix an issue with VMware snapshots and managed storage >>>>> and happened upon this. >>>>> >>>>> If you have a moment, you might want to set a breakpoint and step >>>>> through and see what I mean first hand. >>>>> >>>>> I'm looking into it, as well. >>>>> >>>>> Thanks! >>>>> >>>>> >>>>> On Mon, Jan 6, 2014 at 10:02 PM, Kelven Yang >>>>> <kelven.y...@citrix.com>wrote: >>>>> >>>>>> >>>>>> >>>>>> On 1/6/14, 5:33 PM, "Mike Tutkowski" <mike.tutkow...@solidfire.com> >>>>>> wrote: >>>>>> >>>>>> >Actually, the more I look at this code, the more I think perhaps >>>>>> VMware >>>>>> >snapshots are broken because the newPath field should probably not be >>>>>> >assigned null after creating a new VMware snapshot >>>>>> >>>>>> >>>>>> >(I'm thinking the intend >>>>>> >is to replace the other path with a new path that refers to the >>>>>> delta file >>>>>> >that was just created). >>>>>> >>>>>> Yes, your guess is correct, the intent to update with a new path is to >>>>>> reflect the name change after a VM snapshot is taken. When VM >>>>>> snapshot is >>>>>> involved, one CloudStack volume may have more than one disks be >>>>>> related >>>>>> with it. So the information in path field only points to the top of >>>>>> the >>>>>> disk chain, and it is not guaranteed that this information is in sync >>>>>> with >>>>>> vCenter since there may exist out-of-band changes from vCenter (by >>>>>> taking >>>>>> VM snapshot in vCenter). >>>>>> >>>>>> To gracefully work with vCenter, for existing disks that are attached >>>>>> to a >>>>>> VM, CloudStack only uses the information stored in path field in >>>>>> volume >>>>>> table as a search basis to connect the record with the real disk >>>>>> chain in >>>>>> the storage, as soon as it has located the connection, it actually >>>>>> uses >>>>>> the most recent information from vCenter datastore to setup the disk >>>>>> device. In addition, CloudStack also updates the full disk-chain >>>>>> information to a field called ³chainInfo². The full chain-info can be >>>>>> used >>>>>> for recovery/copy-out purpose >>>>>> >>>>>> Kelven >>>>>> >>>>>> >>>>>> > >>>>>> >Does anyone know who worked on VMware snapshots? I've love to ask >>>>>> these >>>>>> >questions to him soon as we are approaching the end of 4.3. >>>>>> > >>>>>> >Thanks! >>>>>> > >>>>>> > >>>>>> >On Mon, Jan 6, 2014 at 4:35 PM, Mike Tutkowski >>>>>> ><mike.tutkow...@solidfire.com >>>>>> >> wrote: >>>>>> > >>>>>> >> In short, I believe we can remove mapNewDisk and just assign null >>>>>> to >>>>>> >> newPath. This will keep the existing path for the volume in >>>>>> question (in >>>>>> >> the volumes table) in the same state as it was before we created a >>>>>> >>VMware >>>>>> >> snapshot, which I believe is the intent anyways. >>>>>> >> >>>>>> >> Thoughts on that? >>>>>> >> >>>>>> >> >>>>>> >> On Mon, Jan 6, 2014 at 4:10 PM, Mike Tutkowski < >>>>>> >> mike.tutkow...@solidfire.com> wrote: >>>>>> >> >>>>>> >>> Hi, >>>>>> >>> >>>>>> >>> I was wondering about the following code in >>>>>> VmwareStorageManagerImpl. >>>>>> >>>It >>>>>> >>> is in the CreateVMSnapshotAnswer execute(VmwareHostService >>>>>> hostService, >>>>>> >>> CreateVMSnapshotCommand cmd) method. >>>>>> >>> >>>>>> >>> The part I wonder about is in populating the mapNewDisk map. For >>>>>> disks >>>>>> >>> like the following: >>>>>> >>> >>>>>> >>> i-2-9-VM/fksjfaklsjdgflajs.vmdk, the key for the map ends up >>>>>> being i-2. >>>>>> >>> >>>>>> >>> When we call this: >>>>>> >>> >>>>>> >>> String baseName = extractSnapshotBaseFileName(volumeTO.getPath()); >>>>>> >>> >>>>>> >>> It uses a path such as the following: >>>>>> >>> >>>>>> >>> fksjfaklsjdgflajs >>>>>> >>> >>>>>> >>> There is no i-2-9-VM/ preceding the name, so the key we search on >>>>>> ends >>>>>> >>>up >>>>>> >>> being the following: >>>>>> >>> >>>>>> >>> fksjfaklsjdgflajs >>>>>> >>> >>>>>> >>> This leads to a newPath being equal to null. >>>>>> >>> >>>>>> >>> As it turns out, I believe null is actually correct, but - if >>>>>> that's >>>>>> >>>the >>>>>> >>> case - why do we have all this logic if - in the end - we are just >>>>>> >>>going to >>>>>> >>> assign null to newPath in every case when creating a VM snapshot >>>>>> for >>>>>> >>> VMware? As it turns out, null is later interpreted to mean, "don't >>>>>> >>>replace >>>>>> >>> the path field of this volume in the volumes table," which is, I >>>>>> think, >>>>>> >>> what we want. >>>>>> >>> >>>>>> >>> Thanks! >>>>>> >>> >>>>>> >>> VirtualDisk[] vdisks = vmMo.getAllDiskDevice(); >>>>>> >>> >>>>>> >>> for (int i = 0; i < vdisks.length; i ++){ >>>>>> >>> >>>>>> >>> List<Pair<String, ManagedObjectReference>> >>>>>> >>>vmdkFiles >>>>>> >>> = vmMo.getDiskDatastorePathChain(vdisks[i], false); >>>>>> >>> >>>>>> >>> for(Pair<String, ManagedObjectReference> >>>>>> fileItem : >>>>>> >>> vmdkFiles) { >>>>>> >>> >>>>>> >>> String vmdkName = fileItem.first().split(" >>>>>> >>>")[1]; >>>>>> >>> >>>>>> >>> if (vmdkName.endsWith(".vmdk")){ >>>>>> >>> >>>>>> >>> vmdkName = vmdkName.substring(0, >>>>>> >>> vmdkName.length() - (".vmdk").length()); >>>>>> >>> >>>>>> >>> } >>>>>> >>> >>>>>> >>> String baseName = >>>>>> >>> extractSnapshotBaseFileName(vmdkName); >>>>>> >>> >>>>>> >>> mapNewDisk.put(baseName, vmdkName); >>>>>> >>> >>>>>> >>> } >>>>>> >>> >>>>>> >>> } >>>>>> >>> >>>>>> >>> for (VolumeObjectTO volumeTO : volumeTOs) { >>>>>> >>> >>>>>> >>> String baseName = >>>>>> >>> extractSnapshotBaseFileName(volumeTO.getPath()); >>>>>> >>> >>>>>> >>> String newPath = mapNewDisk.get(baseName); >>>>>> >>> >>>>>> >>> // get volume's chain size for this VM >>>>>> snapshot, >>>>>> >>> exclude current volume vdisk >>>>>> >>> >>>>>> >>> DataStoreTO store = volumeTO.getDataStore(); >>>>>> >>> >>>>>> >>> long size = >>>>>> >>> getVMSnapshotChainSize(context,hyperHost,baseName + "*.vmdk", >>>>>> >>> >>>>>> >>> store.getUuid(), newPath); >>>>>> >>> >>>>>> >>> >>>>>> >>> if(volumeTO.getVolumeType()== >>>>>> Volume.Type.ROOT){ >>>>>> >>> >>>>>> >>> // add memory snapshot size >>>>>> >>> >>>>>> >>> size = size + >>>>>> >>> getVMSnapshotChainSize(context,hyperHost,cmd.getVmName()+"*.vmsn" >>>>>> >>> ,store.getUuid(),null); >>>>>> >>> >>>>>> >>> } >>>>>> >>> >>>>>> >>> >>>>>> >>> volumeTO.setSize(size); >>>>>> >>> >>>>>> >>> volumeTO.setPath(newPath); >>>>>> >>> >>>>>> >>> } >>>>>> >>> >>>>>> >>> -- >>>>>> >>> *Mike Tutkowski* >>>>>> >>> *Senior CloudStack Developer, SolidFire Inc.* >>>>>> >>> e: mike.tutkow...@solidfire.com >>>>>> >>> o: 303.746.7302 >>>>>> >>> Advancing the way the world uses the >>>>>> >>>cloud<http://solidfire.com/solution/overview/?video=play> >>>>>> >>> * * >>>>>> >>> >>>>>> >> >>>>>> >> >>>>>> >> >>>>>> >> -- >>>>>> >> *Mike Tutkowski* >>>>>> >> *Senior CloudStack Developer, SolidFire Inc.* >>>>>> >> e: mike.tutkow...@solidfire.com >>>>>> >> o: 303.746.7302 >>>>>> >> Advancing the way the world uses the >>>>>> >>cloud<http://solidfire.com/solution/overview/?video=play> >>>>>> >> * * >>>>>> >> >>>>>> > >>>>>> > >>>>>> > >>>>>> >-- >>>>>> >*Mike Tutkowski* >>>>>> >*Senior CloudStack Developer, SolidFire Inc.* >>>>>> >e: mike.tutkow...@solidfire.com >>>>>> >o: 303.746.7302 >>>>>> >Advancing the way the world uses the >>>>>> >cloud<http://solidfire.com/solution/overview/?video=play> >>>>>> >* * >>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> *Mike Tutkowski* >>>>> *Senior CloudStack Developer, SolidFire Inc.* >>>>> e: mike.tutkow...@solidfire.com >>>>> o: 303.746.7302 >>>>> Advancing the way the world uses the >>>>> cloud<http://solidfire.com/solution/overview/?video=play> >>>>> *™* >>>>> >>>> >>>> >>>> >>>> -- >>>> *Mike Tutkowski* >>>> *Senior CloudStack Developer, SolidFire Inc.* >>>> e: mike.tutkow...@solidfire.com >>>> o: 303.746.7302 >>>> Advancing the way the world uses the >>>> cloud<http://solidfire.com/solution/overview/?video=play> >>>> *™* >>>> >>> >>> >>> >>> -- >>> *Mike Tutkowski* >>> *Senior CloudStack Developer, SolidFire Inc.* >>> e: mike.tutkow...@solidfire.com >>> o: 303.746.7302 >>> Advancing the way the world uses the >>> cloud<http://solidfire.com/solution/overview/?video=play> >>> *™* >>> >> >> >> >> -- >> *Mike Tutkowski* >> *Senior CloudStack Developer, SolidFire Inc.* >> e: mike.tutkow...@solidfire.com >> o: 303.746.7302 >> Advancing the way the world uses the >> cloud<http://solidfire.com/solution/overview/?video=play> >> *™* >> > > > > -- > *Mike Tutkowski* > *Senior CloudStack Developer, SolidFire Inc.* > e: mike.tutkow...@solidfire.com > o: 303.746.7302 > Advancing the way the world uses the > cloud<http://solidfire.com/solution/overview/?video=play> > *™* > -- *Mike Tutkowski* *Senior CloudStack Developer, SolidFire Inc.* e: mike.tutkow...@solidfire.com o: 303.746.7302 Advancing the way the world uses the cloud<http://solidfire.com/solution/overview/?video=play> *™*