mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	CLOUDSTACK-1648 - KVM - make storage pools non-persistent in libvirt. Persisting
cloud-defined resources on the host has caused various problems. As a backward compatible fix, if an existing pool with a different name collides with a pool being created (by path), the pool will be redefined with the name cloudstack knows about. This is actually what brought up the bug, a persisted storage pool cloudstack wasn't managing. Signed-off-by: Marcus Sorensen <marcus@betterservers.com> 1363210149 -0600
This commit is contained in:
		
							parent
							
								
									7bb8ed4d05
								
							
						
					
					
						commit
						a94ff361dd
					
				| @ -3496,7 +3496,7 @@ ServerResource { | ||||
|             sscmd.setDataCenter(_dcId); | ||||
|             sscmd.setResourceType(Storage.StorageResourceType.STORAGE_POOL); | ||||
|         } catch (CloudRuntimeException e) { | ||||
| 
 | ||||
|             s_logger.debug("Unable to initialize local storage pool: " + e); | ||||
|         } | ||||
| 
 | ||||
|         if (sscmd != null) { | ||||
|  | ||||
| @ -120,14 +120,18 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { | ||||
|         StoragePool sp = null; | ||||
|         try { | ||||
|             s_logger.debug(spd.toString()); | ||||
|             sp = conn.storagePoolDefineXML(spd.toString(), 0); | ||||
|             sp.create(0); | ||||
|             sp = conn.storagePoolCreateXML(spd.toString(), 0); | ||||
|             return sp; | ||||
|         } catch (LibvirtException e) { | ||||
|             s_logger.error(e.toString()); | ||||
|             if (sp != null) { | ||||
|                 try { | ||||
|                     sp.undefine(); | ||||
|                     if (sp.isPersistent() == 1) { | ||||
|                         sp.destroy(); | ||||
|                         sp.undefine(); | ||||
|                     } else { | ||||
|                         sp.destroy(); | ||||
|                     } | ||||
|                     sp.free(); | ||||
|                 } catch (LibvirtException l) { | ||||
|                     s_logger.debug("Failed to define nfs storage pool with: " | ||||
| @ -150,15 +154,18 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { | ||||
|         StoragePool sp = null; | ||||
|         try { | ||||
|             s_logger.debug(spd.toString()); | ||||
|             sp = conn.storagePoolDefineXML(spd.toString(), 0); | ||||
|             sp.create(0); | ||||
| 
 | ||||
|             sp = conn.storagePoolCreateXML(spd.toString(), 0); | ||||
|             return sp; | ||||
|         } catch (LibvirtException e) { | ||||
|             s_logger.error(e.toString()); | ||||
|             if (sp != null) { | ||||
|                 try { | ||||
|                     sp.undefine(); | ||||
|                     if (sp.isPersistent() == 1) { | ||||
|                         sp.destroy(); | ||||
|                         sp.undefine(); | ||||
|                     } else { | ||||
|                         sp.destroy(); | ||||
|                     } | ||||
|                     sp.free(); | ||||
|                 } catch (LibvirtException l) { | ||||
|                     s_logger.debug("Failed to define shared mount point storage pool with: " | ||||
| @ -181,14 +188,18 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { | ||||
|         StoragePool sp = null; | ||||
|         try { | ||||
|             s_logger.debug(spd.toString()); | ||||
|             sp = conn.storagePoolDefineXML(spd.toString(), 0); | ||||
|             sp.create(0); | ||||
|             sp = conn.storagePoolCreateXML(spd.toString(), 0); | ||||
|             return sp; | ||||
|         } catch (LibvirtException e) { | ||||
|             s_logger.error(e.toString()); | ||||
|             if (sp != null) { | ||||
|                 try { | ||||
|                     sp.undefine(); | ||||
|                     if (sp.isPersistent() == 1) { | ||||
|                         sp.destroy(); | ||||
|                         sp.undefine(); | ||||
|                     } else { | ||||
|                         sp.destroy(); | ||||
|                     } | ||||
|                     sp.free(); | ||||
|                 } catch (LibvirtException l) { | ||||
|                     s_logger.debug("Failed to define clvm storage pool with: " | ||||
| @ -236,14 +247,18 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { | ||||
| 
 | ||||
|         try { | ||||
|             s_logger.debug(spd.toString()); | ||||
|             sp = conn.storagePoolDefineXML(spd.toString(), 0); | ||||
|             sp.create(0); | ||||
|             sp = conn.storagePoolCreateXML(spd.toString(), 0); | ||||
|             return sp; | ||||
|         } catch (LibvirtException e) { | ||||
|             s_logger.debug(e.toString()); | ||||
|             if (sp != null) { | ||||
|                 try { | ||||
|                     sp.undefine(); | ||||
|                     if (sp.isPersistent() == 1) { | ||||
|                         sp.destroy(); | ||||
|                         sp.undefine(); | ||||
|                     } else { | ||||
|                         sp.destroy(); | ||||
|                     } | ||||
|                     sp.free(); | ||||
|                 } catch (LibvirtException l) { | ||||
|                     s_logger.debug("Failed to define RBD storage pool with: " + l.toString()); | ||||
| @ -385,15 +400,59 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { | ||||
| 
 | ||||
|         try { | ||||
|             sp = conn.storagePoolLookupByUUIDString(name); | ||||
|             if (sp.getInfo().state != StoragePoolState.VIR_STORAGE_POOL_RUNNING) { | ||||
|             if (sp != null && sp.isActive() == 0) { | ||||
|                 sp.undefine(); | ||||
|                 sp = null; | ||||
|                 s_logger.debug("Found existing defined storage pool " + name + ". It wasn't running, so we undefined it."); | ||||
|             } | ||||
|             if (sp != null) { | ||||
|                 s_logger.debug("Found existing defined storage pool " + name + ", using it."); | ||||
|             } | ||||
|         } catch (LibvirtException e) { | ||||
|             sp = null; | ||||
|             s_logger.debug("createStoragePool didn't find existing running pool: " + e + ", need to create it"); | ||||
|         } | ||||
| 
 | ||||
|         // libvirt strips trailing slashes off of path, we will too in order to match | ||||
|         // existing paths | ||||
|         if (path.endsWith("/")) { | ||||
|             path = path.substring(0, path.length() - 1); | ||||
|         } | ||||
| 
 | ||||
|         if (sp == null) { | ||||
|             // see if any existing pool by another name is using our storage path. | ||||
|             // if anyone is, undefine the pool so we can define it as requested. | ||||
|             // This should be safe since a pool in use can't be removed, and no | ||||
|             // volumes are affected by unregistering the pool with libvirt. | ||||
|             s_logger.debug("Didn't find an existing storage pool " + name  | ||||
|                             + " by UUID, checking for pools with duplicate paths"); | ||||
| 
 | ||||
|             try { | ||||
|                 String[] poolnames = conn.listStoragePools(); | ||||
|                 for (String poolname : poolnames) { | ||||
|                     s_logger.debug("Checking path of existing pool " + poolname  | ||||
|                                     + " against pool we want to create"); | ||||
|                     StoragePool p = conn.storagePoolLookupByName(poolname); | ||||
|                     LibvirtStoragePoolDef pdef = getStoragePoolDef(conn, p); | ||||
| 
 | ||||
|                     if (pdef.getTargetPath().equals(path)) { | ||||
|                         s_logger.debug("Storage pool utilizing path '" + path + "' already exists as pool " | ||||
|                                        + poolname + ", undefining so we can re-define with correct name " + name); | ||||
|                         if (p.isPersistent() == 1) { | ||||
|                             p.destroy(); | ||||
|                             p.undefine(); | ||||
|                         } else { | ||||
|                             p.destroy(); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } catch (LibvirtException e) { | ||||
|                 s_logger.error("Failure in attempting to see if an existing storage pool might "  | ||||
|                                + "be using the path of the pool to be created:" + e); | ||||
|             } | ||||
| 
 | ||||
|             s_logger.debug("Attempting to create storage pool " + name); | ||||
| 
 | ||||
|             if (type == StoragePoolType.NetworkFilesystem) { | ||||
|                 sp = createNfsStoragePool(conn, name, host, path); | ||||
|             } else if (type == StoragePoolType.SharedMountPoint | ||||
| @ -407,8 +466,8 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { | ||||
|         } | ||||
| 
 | ||||
|         try { | ||||
|             StoragePoolInfo spi = sp.getInfo(); | ||||
|             if (spi.state != StoragePoolState.VIR_STORAGE_POOL_RUNNING) { | ||||
|             if (sp.isActive() == 0) { | ||||
|                 s_logger.debug("attempting to activate pool " + name); | ||||
|                 sp.create(0); | ||||
|             } | ||||
| 
 | ||||
| @ -427,7 +486,15 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { | ||||
|    | ||||
|             return pool; | ||||
|         } catch (LibvirtException e) { | ||||
|             throw new CloudRuntimeException(e.toString()); | ||||
|             String error = e.toString(); | ||||
|             if (error.contains("Storage source conflict")) { | ||||
|                 throw new CloudRuntimeException("A pool matching this location already exists in libvirt, " | ||||
|                                   + " but has a different UUID/Name. Cannot create new pool without first "  | ||||
|                                   + " removing it. Check for inactive pools via 'virsh pool-list --all'. "  | ||||
|                                   + error); | ||||
|             } else { | ||||
|                 throw new CloudRuntimeException(error); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -459,8 +526,12 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { | ||||
|         } | ||||
| 
 | ||||
|         try { | ||||
|             sp.destroy(); | ||||
|             sp.undefine(); | ||||
|             if (sp.isPersistent() == 1) { | ||||
|                 sp.destroy(); | ||||
|                 sp.undefine(); | ||||
|             } else { | ||||
|                 sp.destroy(); | ||||
|             } | ||||
|             sp.free(); | ||||
|             if (s != null) { | ||||
|                 s.undefine(); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user