Updated Branches:
  refs/heads/4.0 92ad48fff -> 9d618380b

KVM: Storage Pool collisions on ISOs due to using random UUID on pool
create

The code is unable to detect an existing pool, because we use a random
UUID each time. New Libvirt doesn't allow multiple pools to be defined
to the same storage.  This patch generates a UUID based on the storage
path, so that it can be detected as existing and reused. It also cleans
up no-op code and adjusts the naming of a few things to clean up any
confusion.

Signed-off-by: Edison Su <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/9d618380
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/9d618380
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/9d618380

Branch: refs/heads/4.0
Commit: 9d618380bd4b02dad804be426750db0505a29ee6
Parents: 92ad48f
Author: Marcus Sorensen <[email protected]>
Authored: Wed Sep 26 16:17:23 2012 -0700
Committer: Edison Su <[email protected]>
Committed: Wed Sep 26 16:17:23 2012 -0700

----------------------------------------------------------------------
 .../kvm/storage/KVMStoragePoolManager.java         |    2 +-
 .../kvm/storage/LibvirtStorageAdaptor.java         |  108 +--------------
 .../hypervisor/kvm/storage/StorageAdaptor.java     |    2 +-
 3 files changed, 6 insertions(+), 106 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/9d618380/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
 
b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
index 8246a5c..2c0e0ac 100644
--- 
a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
+++ 
b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
@@ -49,7 +49,7 @@ public class KVMStoragePoolManager {
     }
 
     public KVMStoragePool getStoragePoolByURI(String uri) {
-        return this._storageAdaptor.getStoragePoolByUri(uri);
+        return this._storageAdaptor.getStoragePoolByURI(uri);
     }
 
     public KVMStoragePool createStoragePool(String name, String host, int 
port, String path,

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/9d618380/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
 
b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
index 1381843..059073f 100644
--- 
a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
+++ 
b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
@@ -101,81 +101,6 @@ public class LibvirtStorageAdaptor implements 
StorageAdaptor {
         return pool.storageVolCreateXML(volDef.toString(), 0);
     }
 
-    public StoragePool getStoragePoolbyURI(Connect conn, URI uri)
-            throws LibvirtException {
-        String sourcePath;
-        String uuid;
-        String sourceHost = "";
-        String protocal;
-        if (uri.getScheme().equalsIgnoreCase("local")) {
-            sourcePath = _mountPoint + File.separator
-                    + uri.toString().replace("local:///", "");
-            sourcePath = sourcePath.replace("//", "/");
-            uuid = UUID.nameUUIDFromBytes(new String(sourcePath).getBytes())
-                    .toString();
-            protocal = "DIR";
-        } else {
-            sourcePath = uri.getPath();
-            sourcePath = sourcePath.replace("//", "/");
-            sourceHost = uri.getHost();
-            uuid = UUID.nameUUIDFromBytes(
-                    new String(sourceHost + sourcePath).getBytes()).toString();
-            protocal = "NFS";
-        }
-
-        String targetPath = _mountPoint + File.separator + uuid;
-        StoragePool sp = null;
-        try {
-            sp = conn.storagePoolLookupByUUIDString(uuid);
-        } catch (LibvirtException e) {
-        }
-
-        if (sp == null) {
-            try {
-                LibvirtStoragePoolDef spd = null;
-                if (protocal.equalsIgnoreCase("NFS")) {
-                    _storageLayer.mkdir(targetPath);
-                    spd = new LibvirtStoragePoolDef(poolType.NETFS, uuid, uuid,
-                            sourceHost, sourcePath, targetPath);
-                    s_logger.debug(spd.toString());
-                    // addStoragePool(uuid);
-
-                } else if (protocal.equalsIgnoreCase("DIR")) {
-                    _storageLayer.mkdir(targetPath);
-                    spd = new LibvirtStoragePoolDef(poolType.DIR, uuid, uuid,
-                            null, null, sourcePath);
-                }
-
-                synchronized (getStoragePool(uuid)) {
-                    sp = conn.storagePoolDefineXML(spd.toString(), 0);
-                    if (sp == null) {
-                        s_logger.debug("Failed to define storage pool");
-                        return null;
-                    }
-                    sp.create(0);
-                }
-
-                return sp;
-            } catch (LibvirtException e) {
-                try {
-                    if (sp != null) {
-                        sp.undefine();
-                        sp.free();
-                    }
-                } catch (LibvirtException l) {
-
-                }
-                throw e;
-            }
-        } else {
-            StoragePoolInfo spi = sp.getInfo();
-            if (spi.state != StoragePoolState.VIR_STORAGE_POOL_RUNNING) {
-                sp.create(0);
-            }
-            return sp;
-        }
-    }
-
     public void storagePoolRefresh(StoragePool pool) {
         try {
             synchronized (getStoragePool(pool.getUUIDString())) {
@@ -368,32 +293,6 @@ public class LibvirtStorageAdaptor implements 
StorageAdaptor {
         return parser.parseStorageVolumeXML(volDefXML);
     }
 
-    public StorageVol getVolumeFromURI(Connect conn, String volPath)
-            throws LibvirtException, URISyntaxException {
-        int index = volPath.lastIndexOf("/");
-        URI volDir = null;
-        StoragePool sp = null;
-        StorageVol vol = null;
-        try {
-            volDir = new URI(volPath.substring(0, index));
-            String volName = volPath.substring(index + 1);
-            sp = getStoragePoolbyURI(conn, volDir);
-            vol = sp.storageVolLookupByName(volName);
-            return vol;
-        } catch (LibvirtException e) {
-            s_logger.debug("Faild to get vol path: " + e.toString());
-            throw e;
-        } finally {
-            try {
-                if (sp != null) {
-                    sp.free();
-                }
-            } catch (LibvirtException e) {
-
-            }
-        }
-    }
-
     public StoragePool createFileBasedStoragePool(Connect conn,
             String localStoragePath, String uuid) {
         if (!(_storageLayer.exists(localStoragePath) && _storageLayer
@@ -821,7 +720,7 @@ public class LibvirtStorageAdaptor implements 
StorageAdaptor {
     }
 
     @Override
-    public KVMStoragePool getStoragePoolByUri(String uri) {
+    public KVMStoragePool getStoragePoolByURI(String uri) {
         URI storageUri = null;
 
         try {
@@ -838,11 +737,12 @@ public class LibvirtStorageAdaptor implements 
StorageAdaptor {
             sourcePath = storageUri.getPath();
             sourcePath = sourcePath.replace("//", "/");
             sourceHost = storageUri.getHost();
-            uuid = UUID.randomUUID().toString();
+            uuid = UUID.nameUUIDFromBytes(
+                    new String(sourceHost + sourcePath).getBytes()).toString();
             protocal = StoragePoolType.NetworkFilesystem;
         }
 
-            return createStoragePool(uuid, sourceHost, 0, sourcePath, "", 
protocal);
+        return createStoragePool(uuid, sourceHost, 0, sourcePath, "", 
protocal);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/9d618380/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java
 
b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java
index ec10332..ef1e7c9 100644
--- 
a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java
+++ 
b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java
@@ -55,7 +55,7 @@ public interface StorageAdaptor {
     public KVMPhysicalDisk createDiskFromSnapshot(KVMPhysicalDisk snapshot,
             String snapshotName, String name, KVMStoragePool destPool);
 
-    public KVMStoragePool getStoragePoolByUri(String uri);
+    public KVMStoragePool getStoragePoolByURI(String uri);
 
     public KVMPhysicalDisk getPhysicalDiskFromURI(String uri);
 

Reply via email to