[
https://issues.apache.org/jira/browse/CLOUDSTACK-5823?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Mike Tutkowski reassigned CLOUDSTACK-5823:
------------------------------------------
Assignee: Mike Tutkowski
> Taking a VMware snapshot doesn't work
> -------------------------------------
>
> Key: CLOUDSTACK-5823
> URL: https://issues.apache.org/jira/browse/CLOUDSTACK-5823
> Project: CloudStack
> Issue Type: Bug
> Security Level: Public(Anyone can view this level - this is the
> default.)
> Components: VMware
> Affects Versions: 4.3.0
> Environment: ESXi 5.1
> Reporter: Mike Tutkowski
> Assignee: Mike Tutkowski
> Fix For: 4.3.0
>
>
> Per a discussion on the mailing list:
> VMware snapshot question
> Mike Tutkowski <[email protected]>
> 4:10 PM (18 hours ago)
> to dev
> 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 <[email protected]>
> 4:35 PM (17 hours ago)
> to dev
> 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?
> Mike Tutkowski <[email protected]>
> 6:33 PM (15 hours ago)
> to Kelven, dev
> 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).
> 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!
> Kelven Yang 10:02 PM (12 hours ago)
> Yes, your guess is correct, the intent to update with a new path is to
> reflec...
> Mike Tutkowski <[email protected]>
> 10:13 PM (12 hours ago)
> to dev, Kelven
> 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!
> --
> Mike Tutkowski
> Senior CloudStack Developer, SolidFire Inc.
> e: [email protected]
> o: 303.746.7302
> Advancing the way the world uses the cloud™
> Mike Tutkowski <[email protected]>
> 10:43 PM (11 hours ago)
> to dev, Kelven
> 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!!
> Mike Tutkowski <[email protected]>
> 10:47 PM (11 hours ago)
> to dev, Kelven
> 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?
> Mike Tutkowski <[email protected]>
> 12:19 AM (10 hours ago)
> to dev, Kelven
> 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!
> Mike Tutkowski <[email protected]>
> 12:20 AM (10 hours ago)
> to dev, Kelven
> 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);
--
This message was sent by Atlassian JIRA
(v6.1.5#6160)