/// <summary> /// Perform pre-failover checks on the given service we plan to /// failover to, eg to prevent failing over to a service (eg due /// to it being inaccessible, already active, not healthy, etc). /// </summary> /// <remarks> /// Perform pre-failover checks on the given service we plan to /// failover to, eg to prevent failing over to a service (eg due /// to it being inaccessible, already active, not healthy, etc). /// An option to ignore toSvc if it claims it is not ready to /// become active is provided in case performing a failover will /// allow it to become active, eg because it triggers a log roll /// so the standby can learn about new blocks and leave safemode. /// </remarks> /// <param name="from">currently active service</param> /// <param name="target">service to make active</param> /// <param name="forceActive">ignore toSvc if it reports that it is not ready</param> /// <exception cref="FailoverFailedException">if we should avoid failover</exception> /// <exception cref="Org.Apache.Hadoop.HA.FailoverFailedException"/> private void PreFailoverChecks(HAServiceTarget from, HAServiceTarget target, bool forceActive) { HAServiceStatus toSvcStatus; HAServiceProtocol toSvc; if (from.GetAddress().Equals(target.GetAddress())) { throw new FailoverFailedException("Can't failover a service to itself"); } try { toSvc = target.GetProxy(conf, rpcTimeoutToNewActive); toSvcStatus = toSvc.GetServiceStatus(); } catch (IOException e) { string msg = "Unable to get service state for " + target; Log.Error(msg + ": " + e.GetLocalizedMessage()); throw new FailoverFailedException(msg, e); } if (!toSvcStatus.GetState().Equals(HAServiceProtocol.HAServiceState.Standby)) { throw new FailoverFailedException("Can't failover to an active service"); } if (!toSvcStatus.IsReadyToBecomeActive()) { string notReadyReason = toSvcStatus.GetNotReadyReason(); if (!forceActive) { throw new FailoverFailedException(target + " is not ready to become active: " + notReadyReason ); } else { Log.Warn("Service is not ready to become active, but forcing: " + notReadyReason); } } try { HAServiceProtocolHelper.MonitorHealth(toSvc, CreateReqInfo()); } catch (HealthCheckFailedException hce) { throw new FailoverFailedException("Can't failover to an unhealthy service", hce); } catch (IOException e) { throw new FailoverFailedException("Got an IO exception", e); } }
/// <exception cref="System.IO.IOException"/> /// <exception cref="Org.Apache.Hadoop.HA.ServiceFailedException"/> private int CheckHealth(CommandLine cmd) { string[] argv = cmd.GetArgs(); if (argv.Length != 1) { errOut.WriteLine("checkHealth: incorrect number of arguments"); PrintUsage(errOut, "-checkHealth"); return(-1); } HAServiceProtocol proto = ResolveTarget(argv[0]).GetProxy(GetConf(), rpcTimeoutForChecks ); try { HAServiceProtocolHelper.MonitorHealth(proto, CreateReqInfo()); } catch (HealthCheckFailedException e) { errOut.WriteLine("Health check failed: " + e.GetLocalizedMessage()); return(-1); } return(0); }