check hypervisorType and StoragePoolType in OCFS2 manager when delete host

don't take lock in processResourceEvent()
This commit is contained in:
frank 2011-09-13 17:34:20 -07:00
parent 6b33d114e8
commit 71385f7cc0
2 changed files with 64 additions and 53 deletions

View File

@ -180,44 +180,44 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma
} }
protected void processResourceEvent(Integer event, Object...params) { protected void processResourceEvent(Integer event, Object...params) {
synchronized (_lifeCycleListeners) { List<ResourceListener> lst = _lifeCycleListeners.get(event);
List<ResourceListener> lst = _lifeCycleListeners.get(event); if (lst == null || lst.size() == 0) {
if (lst == null || lst.size() == 0) { return;
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<String>)params[6]);
eventName = "EVENT_DISCOVER_BEFORE";
} else if (event == ResourceListener.EVENT_DISCOVER_AFTER) {
l.processDiscoverEventAfter((Map<? extends ServerResource, Map<String, String>>)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());
}
} }
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<String>) params[6]);
eventName = "EVENT_DISCOVER_BEFORE";
} else if (event == ResourceListener.EVENT_DISCOVER_AFTER) {
l.processDiscoverEventAfter((Map<? extends ServerResource, Map<String, String>>) 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 @Override

View File

@ -19,10 +19,13 @@ import com.cloud.dc.dao.ClusterDao;
import com.cloud.host.Host; import com.cloud.host.Host;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.resource.ResourceListener; import com.cloud.resource.ResourceListener;
import com.cloud.resource.ResourceManager; import com.cloud.resource.ResourceManager;
import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResource;
import com.cloud.storage.Storage.StoragePoolType; 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.Ternary;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.CloudRuntimeException;
@ -37,6 +40,8 @@ public class OCFS2ManagerImpl implements OCFS2Manager, ResourceListener {
@Inject HostDao _hostDao; @Inject HostDao _hostDao;
@Inject ClusterDao _clusterDao; @Inject ClusterDao _clusterDao;
@Inject ResourceManager _resourceMgr; @Inject ResourceManager _resourceMgr;
@Inject StoragePoolHostDao _poolHostDao;
@Inject StoragePoolDao _poolDao;
@Override @Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException { public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
@ -106,16 +111,6 @@ public class OCFS2ManagerImpl implements OCFS2Manager, ResourceListener {
} }
return clusterName; 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 @Override
@ -164,14 +159,30 @@ public class OCFS2ManagerImpl implements OCFS2Manager, ResourceListener {
@Override @Override
public void processDeletHostEventAfter(HostVO host) { 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()); 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())) { if (host.getHypervisorType() != HypervisorType.Ovm) {
s_logger.warn(errMsg); return;
}
} catch (Exception e) {
s_logger.error(errMsg, e);
} }
boolean hasOcfs2 = false;
List<StoragePoolHostVO> 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 @Override