From 29b5945263bd647a221fe16e568a3468540432d4 Mon Sep 17 00:00:00 2001 From: frank Date: Tue, 13 Sep 2011 17:34:20 -0700 Subject: [PATCH] check hypervisorType and StoragePoolType in OCFS2 manager when delete host don't take lock in processResourceEvent() --- .../cloud/resource/ResourceManagerImpl.java | 74 +++++++++---------- .../com/cloud/storage/OCFS2ManagerImpl.java | 43 +++++++---- 2 files changed, 64 insertions(+), 53 deletions(-) diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index f087933d57e..76d38dd471d 100755 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -180,44 +180,44 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma } protected void processResourceEvent(Integer event, Object...params) { - synchronized (_lifeCycleListeners) { - List lst = _lifeCycleListeners.get(event); - if (lst == null || lst.size() == 0) { - return; - } - - String eventName; - for (ResourceListener l : lst) { - if (event == ResourceListener.EVENT_DISCOVER_BEFORE) { - l.processDiscoverEventBefore((Long)params[0], (Long)params[1], (Long)params[2], (URI)params[3], (String)params[4], (String)params[5], (List)params[6]); - eventName = "EVENT_DISCOVER_BEFORE"; - } else if (event == ResourceListener.EVENT_DISCOVER_AFTER) { - l.processDiscoverEventAfter((Map>)params[0]); - eventName = "EVENT_DISCOVER_AFTER"; - } else if (event == ResourceListener.EVENT_DELETE_HOST_BEFORE) { - l.processDeleteHostEventBefore((HostVO)params[0]); - eventName = "EVENT_DELETE_HOST_BEFORE"; - } else if (event == ResourceListener.EVENT_DELETE_HOST_AFTER) { - l.processDeletHostEventAfter((HostVO)params[0]); - eventName = "EVENT_DELETE_HOST_AFTER"; - } else if (event == ResourceListener.EVENT_CANCEL_MAINTENANCE_BEFORE) { - l.processCancelMaintenaceEventBefore((Long)params[0]); - eventName = "EVENT_CANCEL_MAINTENANCE_BEFORE"; - } else if (event == ResourceListener.EVENT_CANCEL_MAINTENANCE_AFTER) { - l.processCancelMaintenaceEventAfter((Long)params[0]); - eventName = "EVENT_CANCEL_MAINTENANCE_AFTER"; - } else if (event == ResourceListener.EVENT_PREPARE_MAINTENANCE_BEFORE) { - l.processPrepareMaintenaceEventBefore((Long)params[0]); - eventName = "EVENT_PREPARE_MAINTENANCE_BEFORE"; - } else if (event == ResourceListener.EVENT_PREPARE_MAINTENANCE_AFTER) { - l.processPrepareMaintenaceEventAfter((Long)params[0]); - eventName = "EVENT_PREPARE_MAINTENANCE_AFTER"; - } else { - throw new CloudRuntimeException("Unknown resource event:" + event); - } - s_logger.debug("Sent resource event " + eventName + " to listener " + l.getClass().getSimpleName()); - } + List lst = _lifeCycleListeners.get(event); + if (lst == null || lst.size() == 0) { + return; } + + String eventName; + for (ResourceListener l : lst) { + if (event == ResourceListener.EVENT_DISCOVER_BEFORE) { + l.processDiscoverEventBefore((Long) params[0], (Long) params[1], (Long) params[2], (URI) params[3], (String) params[4], (String) params[5], + (List) params[6]); + eventName = "EVENT_DISCOVER_BEFORE"; + } else if (event == ResourceListener.EVENT_DISCOVER_AFTER) { + l.processDiscoverEventAfter((Map>) params[0]); + eventName = "EVENT_DISCOVER_AFTER"; + } else if (event == ResourceListener.EVENT_DELETE_HOST_BEFORE) { + l.processDeleteHostEventBefore((HostVO) params[0]); + eventName = "EVENT_DELETE_HOST_BEFORE"; + } else if (event == ResourceListener.EVENT_DELETE_HOST_AFTER) { + l.processDeletHostEventAfter((HostVO) params[0]); + eventName = "EVENT_DELETE_HOST_AFTER"; + } else if (event == ResourceListener.EVENT_CANCEL_MAINTENANCE_BEFORE) { + l.processCancelMaintenaceEventBefore((Long) params[0]); + eventName = "EVENT_CANCEL_MAINTENANCE_BEFORE"; + } else if (event == ResourceListener.EVENT_CANCEL_MAINTENANCE_AFTER) { + l.processCancelMaintenaceEventAfter((Long) params[0]); + eventName = "EVENT_CANCEL_MAINTENANCE_AFTER"; + } else if (event == ResourceListener.EVENT_PREPARE_MAINTENANCE_BEFORE) { + l.processPrepareMaintenaceEventBefore((Long) params[0]); + eventName = "EVENT_PREPARE_MAINTENANCE_BEFORE"; + } else if (event == ResourceListener.EVENT_PREPARE_MAINTENANCE_AFTER) { + l.processPrepareMaintenaceEventAfter((Long) params[0]); + eventName = "EVENT_PREPARE_MAINTENANCE_AFTER"; + } else { + throw new CloudRuntimeException("Unknown resource event:" + event); + } + s_logger.debug("Sent resource event " + eventName + " to listener " + l.getClass().getSimpleName()); + } + } @Override diff --git a/server/src/com/cloud/storage/OCFS2ManagerImpl.java b/server/src/com/cloud/storage/OCFS2ManagerImpl.java index 81f611f3e12..8990e897999 100755 --- a/server/src/com/cloud/storage/OCFS2ManagerImpl.java +++ b/server/src/com/cloud/storage/OCFS2ManagerImpl.java @@ -19,10 +19,13 @@ import com.cloud.dc.dao.ClusterDao; import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; +import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.resource.ResourceListener; import com.cloud.resource.ResourceManager; import com.cloud.resource.ServerResource; import com.cloud.storage.Storage.StoragePoolType; +import com.cloud.storage.dao.StoragePoolDao; +import com.cloud.storage.dao.StoragePoolHostDao; import com.cloud.utils.Ternary; import com.cloud.utils.component.Inject; import com.cloud.utils.exception.CloudRuntimeException; @@ -37,6 +40,8 @@ public class OCFS2ManagerImpl implements OCFS2Manager, ResourceListener { @Inject HostDao _hostDao; @Inject ClusterDao _clusterDao; @Inject ResourceManager _resourceMgr; + @Inject StoragePoolHostDao _poolHostDao; + @Inject StoragePoolDao _poolDao; @Override public boolean configure(String name, Map params) throws ConfigurationException { @@ -106,16 +111,6 @@ public class OCFS2ManagerImpl implements OCFS2Manager, ResourceListener { } return clusterName; - - - /** - * right now let's use "ocfs2" that is default cluster name of OVM OCFS2 service. - * Using another name is fine but requires extra effort to modify OVM's "utils/config_o2cb.sh", - * currently it doesn't receive parameter specifying which cluster to start. - * And I don't see the benefit of a cluster name rather than "ocfs2" - */ - - //return "ocfs2"; } @Override @@ -164,14 +159,30 @@ public class OCFS2ManagerImpl implements OCFS2Manager, ResourceListener { @Override public void processDeletHostEventAfter(HostVO host) { String errMsg = String.format("Prepare OCFS2 nodes failed after delete host %1$s (zone:%2$s, pod:%3$s, cluster:%4$s", host.getId(), host.getDataCenterId(), host.getPodId(), host.getClusterId()); - try { - if (!prepareNodes(host.getClusterId())) { - s_logger.warn(errMsg); - } - } catch (Exception e) { - s_logger.error(errMsg, e); + + if (host.getHypervisorType() != HypervisorType.Ovm) { + return; } + boolean hasOcfs2 = false; + List poolRefs = _poolHostDao.listByHostId(host.getId()); + for (StoragePoolHostVO poolRef : poolRefs) { + StoragePoolVO pool = _poolDao.findById(poolRef.getPoolId()); + if (pool.getPoolType() == StoragePoolType.OCFS2) { + hasOcfs2 = true; + break; + } + } + + if (hasOcfs2) { + try { + if (!prepareNodes(host.getClusterId())) { + s_logger.warn(errMsg); + } + } catch (Exception e) { + s_logger.error(errMsg, e); + } + } } @Override