mirror of
https://github.com/apache/cloudstack.git
synced 2025-11-03 04:12:31 +01:00
check hypervisorType and StoragePoolType in OCFS2 manager when delete host
don't take lock in processResourceEvent()
This commit is contained in:
parent
6b33d114e8
commit
71385f7cc0
@ -180,44 +180,44 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma
|
||||
}
|
||||
|
||||
protected void processResourceEvent(Integer event, Object...params) {
|
||||
synchronized (_lifeCycleListeners) {
|
||||
List<ResourceListener> 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<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());
|
||||
}
|
||||
List<ResourceListener> 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<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
|
||||
|
||||
@ -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<String, Object> 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<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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user