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

Reply via email to