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>
*™*

Reply via email to