2727import com .cloud .host .dao .HostDao ;
2828import com .cloud .hypervisor .Hypervisor ;
2929import com .cloud .resource .ResourceManager ;
30- import com .cloud .storage .Storage .StoragePoolType ;
3130import com .cloud .utils .component .AdapterBase ;
31+
32+ import org .apache .cloudstack .engine .subsystem .api .storage .DataStoreDriver ;
33+ import org .apache .cloudstack .engine .subsystem .api .storage .DataStoreProvider ;
34+ import org .apache .cloudstack .engine .subsystem .api .storage .DataStoreProviderManager ;
35+ import org .apache .cloudstack .engine .subsystem .api .storage .PrimaryDataStoreDriver ;
3236import org .apache .cloudstack .ha .HAManager ;
3337import org .apache .cloudstack .storage .datastore .db .PrimaryDataStoreDao ;
3438import org .apache .cloudstack .storage .datastore .db .StoragePoolVO ;
@@ -49,6 +53,8 @@ public class KVMInvestigator extends AdapterBase implements Investigator {
4953 private PrimaryDataStoreDao _storagePoolDao ;
5054 @ Inject
5155 private HAManager haManager ;
56+ @ Inject
57+ private DataStoreProviderManager dataStoreProviderMgr ;
5258
5359 @ Override
5460 public boolean isVmAlive (com .cloud .vm .VirtualMachine vm , Host host ) throws UnknownVM {
@@ -77,32 +83,23 @@ public Status isAgentAlive(Host agent) {
7783 return haManager .getHostStatus (agent );
7884 }
7985
86+ //TODO: check storage for HA support
8087 List <StoragePoolVO > clusterPools = _storagePoolDao .listPoolsByCluster (agent .getClusterId ());
81- boolean hasNfs = false ;
82- for (StoragePoolVO pool : clusterPools ) {
83- if (pool .getPoolType () == StoragePoolType .NetworkFilesystem ) {
84- hasNfs = true ;
85- break ;
86- }
87- }
88- if (!hasNfs ) {
88+ boolean storageSupportHA = storageSupportHa (clusterPools );
89+ if (!storageSupportHA ) {
8990 List <StoragePoolVO > zonePools = _storagePoolDao .findZoneWideStoragePoolsByHypervisor (agent .getDataCenterId (), agent .getHypervisorType ());
90- for (StoragePoolVO pool : zonePools ) {
91- if (pool .getPoolType () == StoragePoolType .NetworkFilesystem ) {
92- hasNfs = true ;
93- break ;
94- }
95- }
91+ storageSupportHA = storageSupportHa (zonePools );
9692 }
97- if (!hasNfs ) {
93+ if (!storageSupportHA ) {
9894 s_logger .warn (
9995 "Agent investigation was requested on host " + agent + ", but host does not support investigation because it has no NFS storage. Skipping investigation." );
10096 return Status .Disconnected ;
10197 }
10298
10399 Status hostStatus = null ;
104100 Status neighbourStatus = null ;
105- CheckOnHostCommand cmd = new CheckOnHostCommand (agent );
101+ boolean reportFailureIfOneStorageIsDown = HighAvailabilityManager .KvmHAFenceHostIfHeartbeatFailsOnStorage .value ();
102+ CheckOnHostCommand cmd = new CheckOnHostCommand (agent , reportFailureIfOneStorageIsDown );
106103
107104 try {
108105 Answer answer = _agentMgr .easySend (agent .getId (), cmd );
@@ -145,4 +142,20 @@ public Status isAgentAlive(Host agent) {
145142 s_logger .debug ("HA: HOST is ineligible legacy state " + hostStatus + " for host " + agent .getId ());
146143 return hostStatus ;
147144 }
145+
146+ private boolean storageSupportHa (List <StoragePoolVO > pools ) {
147+ boolean storageSupportHA = false ;
148+ for (StoragePoolVO pool : pools ) {
149+ DataStoreProvider storeProvider = dataStoreProviderMgr .getDataStoreProvider (pool .getStorageProviderName ());
150+ DataStoreDriver storeDriver = storeProvider .getDataStoreDriver ();
151+ if (storeDriver instanceof PrimaryDataStoreDriver ) {
152+ PrimaryDataStoreDriver primaryStoreDriver = (PrimaryDataStoreDriver )storeDriver ;
153+ if (primaryStoreDriver .isStorageSupportHA (pool .getPoolType ())) {
154+ storageSupportHA = true ;
155+ break ;
156+ }
157+ }
158+ }
159+ return storageSupportHA ;
160+ }
148161}
0 commit comments