You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by to...@apache.org on 2012/03/26 03:54:23 UTC
svn commit: r1305196 - in
/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common: ./
src/main/java/org/apache/hadoop/ha/ src/test/java/org/apache/hadoop/ha/
Author: todd
Date: Mon Mar 26 01:54:22 2012
New Revision: 1305196
URL: http://svn.apache.org/viewvc?rev=1305196&view=rev
Log:
HADOOP-8193. Refactor FailoverController/HAAdmin code to add an abstract class for "target" services. Contributed by Todd Lipcon.
Added:
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/HAServiceTarget.java
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/DummyHAService.java
Modified:
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/CHANGES.txt
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/BadFencingConfigurationException.java
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/FailoverController.java
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/FenceMethod.java
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/HAAdmin.java
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/NodeFencer.java
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ShellCommandFencer.java
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/SshFenceByTcpPort.java
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestFailoverController.java
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestHAAdmin.java
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestNodeFencer.java
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestShellCommandFencer.java
hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestSshFenceByTcpPort.java
Modified: hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/CHANGES.txt?rev=1305196&r1=1305195&r2=1305196&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/CHANGES.txt (original)
+++ hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/CHANGES.txt Mon Mar 26 01:54:22 2012
@@ -109,6 +109,9 @@ Release 0.23.3 - UNRELEASED
HADOOP-8163. Improve ActiveStandbyElector to provide hooks for
fencing old active. (todd)
+ HADOOP-8193. Refactor FailoverController/HAAdmin code to add an abstract
+ class for "target" services. (todd)
+
OPTIMIZATIONS
BUG FIXES
Modified: hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/BadFencingConfigurationException.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/BadFencingConfigurationException.java?rev=1305196&r1=1305195&r2=1305196&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/BadFencingConfigurationException.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/BadFencingConfigurationException.java Mon Mar 26 01:54:22 2012
@@ -19,11 +19,16 @@ package org.apache.hadoop.ha;
import java.io.IOException;
+import org.apache.hadoop.classification.InterfaceAudience;
+import org.apache.hadoop.classification.InterfaceStability;
+
/**
* Indicates that the operator has specified an invalid configuration
* for fencing methods.
*/
-class BadFencingConfigurationException extends IOException {
+@InterfaceAudience.Public
+@InterfaceStability.Evolving
+public class BadFencingConfigurationException extends IOException {
private static final long serialVersionUID = 1L;
public BadFencingConfigurationException(String msg) {
Modified: hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/FailoverController.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/FailoverController.java?rev=1305196&r1=1305195&r2=1305196&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/FailoverController.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/FailoverController.java Mon Mar 26 01:54:22 2012
@@ -18,7 +18,6 @@
package org.apache.hadoop.ha;
import java.io.IOException;
-import java.net.InetSocketAddress;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -51,21 +50,21 @@ public class FailoverController {
* allow it to become active, eg because it triggers a log roll
* so the standby can learn about new blocks and leave safemode.
*
- * @param toSvc service to make active
- * @param toSvcName name of service to make active
+ * @param target service to make active
* @param forceActive ignore toSvc if it reports that it is not ready
* @throws FailoverFailedException if we should avoid failover
*/
- private static void preFailoverChecks(HAServiceProtocol toSvc,
- InetSocketAddress toSvcAddr,
+ private static void preFailoverChecks(HAServiceTarget target,
boolean forceActive)
throws FailoverFailedException {
HAServiceStatus toSvcStatus;
+ HAServiceProtocol toSvc;
try {
+ toSvc = target.getProxy();
toSvcStatus = toSvc.getServiceStatus();
} catch (IOException e) {
- String msg = "Unable to get service state for " + toSvcAddr;
+ String msg = "Unable to get service state for " + target;
LOG.error(msg, e);
throw new FailoverFailedException(msg, e);
}
@@ -79,7 +78,7 @@ public class FailoverController {
String notReadyReason = toSvcStatus.getNotReadyReason();
if (!forceActive) {
throw new FailoverFailedException(
- toSvcAddr + " is not ready to become active: " +
+ target + " is not ready to become active: " +
notReadyReason);
} else {
LOG.warn("Service is not ready to become active, but forcing: " +
@@ -103,44 +102,39 @@ public class FailoverController {
* then try to failback.
*
* @param fromSvc currently active service
- * @param fromSvcAddr addr of the currently active service
* @param toSvc service to make active
- * @param toSvcAddr addr of the service to make active
- * @param fencer for fencing fromSvc
* @param forceFence to fence fromSvc even if not strictly necessary
* @param forceActive try to make toSvc active even if it is not ready
* @throws FailoverFailedException if the failover fails
*/
- public static void failover(HAServiceProtocol fromSvc,
- InetSocketAddress fromSvcAddr,
- HAServiceProtocol toSvc,
- InetSocketAddress toSvcAddr,
- NodeFencer fencer,
+ public static void failover(HAServiceTarget fromSvc,
+ HAServiceTarget toSvc,
boolean forceFence,
boolean forceActive)
throws FailoverFailedException {
- Preconditions.checkArgument(fencer != null, "failover requires a fencer");
- preFailoverChecks(toSvc, toSvcAddr, forceActive);
+ Preconditions.checkArgument(fromSvc.getFencer() != null,
+ "failover requires a fencer");
+ preFailoverChecks(toSvc, forceActive);
// Try to make fromSvc standby
boolean tryFence = true;
try {
- HAServiceProtocolHelper.transitionToStandby(fromSvc);
+ HAServiceProtocolHelper.transitionToStandby(fromSvc.getProxy());
// We should try to fence if we failed or it was forced
tryFence = forceFence ? true : false;
} catch (ServiceFailedException sfe) {
- LOG.warn("Unable to make " + fromSvcAddr + " standby (" +
+ LOG.warn("Unable to make " + fromSvc + " standby (" +
sfe.getMessage() + ")");
} catch (IOException ioe) {
- LOG.warn("Unable to make " + fromSvcAddr +
+ LOG.warn("Unable to make " + fromSvc +
" standby (unable to connect)", ioe);
}
// Fence fromSvc if it's required or forced by the user
if (tryFence) {
- if (!fencer.fence(fromSvcAddr)) {
+ if (!fromSvc.getFencer().fence(fromSvc)) {
throw new FailoverFailedException("Unable to fence " +
- fromSvcAddr + ". Fencing failed.");
+ fromSvc + ". Fencing failed.");
}
}
@@ -148,14 +142,14 @@ public class FailoverController {
boolean failed = false;
Throwable cause = null;
try {
- HAServiceProtocolHelper.transitionToActive(toSvc);
+ HAServiceProtocolHelper.transitionToActive(toSvc.getProxy());
} catch (ServiceFailedException sfe) {
- LOG.error("Unable to make " + toSvcAddr + " active (" +
+ LOG.error("Unable to make " + toSvc + " active (" +
sfe.getMessage() + "). Failing back.");
failed = true;
cause = sfe;
} catch (IOException ioe) {
- LOG.error("Unable to make " + toSvcAddr +
+ LOG.error("Unable to make " + toSvc +
" active (unable to connect). Failing back.", ioe);
failed = true;
cause = ioe;
@@ -163,7 +157,7 @@ public class FailoverController {
// We failed to make toSvc active
if (failed) {
- String msg = "Unable to failover to " + toSvcAddr;
+ String msg = "Unable to failover to " + toSvc;
// Only try to failback if we didn't fence fromSvc
if (!tryFence) {
try {
@@ -171,9 +165,9 @@ public class FailoverController {
// become active, eg we timed out waiting for its response.
// Unconditionally force fromSvc to become active since it
// was previously active when we initiated failover.
- failover(toSvc, toSvcAddr, fromSvc, fromSvcAddr, fencer, true, true);
+ failover(toSvc, fromSvc, true, true);
} catch (FailoverFailedException ffe) {
- msg += ". Failback to " + fromSvcAddr +
+ msg += ". Failback to " + fromSvc +
" failed (" + ffe.getMessage() + ")";
LOG.fatal(msg);
}
Modified: hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/FenceMethod.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/FenceMethod.java?rev=1305196&r1=1305195&r2=1305196&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/FenceMethod.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/FenceMethod.java Mon Mar 26 01:54:22 2012
@@ -17,8 +17,6 @@
*/
package org.apache.hadoop.ha;
-import java.net.InetSocketAddress;
-
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.conf.Configurable;
@@ -62,6 +60,6 @@ public interface FenceMethod {
* @throws BadFencingConfigurationException if the configuration was
* determined to be invalid only at runtime
*/
- public boolean tryFence(InetSocketAddress serviceAddr, String args)
+ public boolean tryFence(HAServiceTarget target, String args)
throws BadFencingConfigurationException;
}
Modified: hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/HAAdmin.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/HAAdmin.java?rev=1305196&r1=1305195&r2=1305196&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/HAAdmin.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/HAAdmin.java Mon Mar 26 01:54:22 2012
@@ -19,7 +19,6 @@ package org.apache.hadoop.ha;
import java.io.IOException;
import java.io.PrintStream;
-import java.net.InetSocketAddress;
import java.util.Map;
import org.apache.commons.cli.Options;
@@ -27,12 +26,11 @@ import org.apache.commons.cli.CommandLin
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.ParseException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
-import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.conf.Configured;
-import org.apache.hadoop.ha.protocolPB.HAServiceProtocolClientSideTranslatorPB;
-import org.apache.hadoop.net.NetUtils;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
@@ -49,6 +47,7 @@ public abstract class HAAdmin extends Co
private static final String FORCEFENCE = "forcefence";
private static final String FORCEACTIVE = "forceactive";
+ private static final Log LOG = LogFactory.getLog(HAAdmin.class);
private static Map<String, UsageInfo> USAGE =
ImmutableMap.<String, UsageInfo>builder()
@@ -77,6 +76,8 @@ public abstract class HAAdmin extends Co
protected PrintStream errOut = System.err;
PrintStream out = System.out;
+ protected abstract HAServiceTarget resolveTarget(String string);
+
protected String getUsageString() {
return "Usage: HAAdmin";
}
@@ -109,7 +110,7 @@ public abstract class HAAdmin extends Co
return -1;
}
- HAServiceProtocol proto = getProtocol(argv[1]);
+ HAServiceProtocol proto = resolveTarget(argv[1]).getProxy();
HAServiceProtocolHelper.transitionToActive(proto);
return 0;
}
@@ -122,14 +123,13 @@ public abstract class HAAdmin extends Co
return -1;
}
- HAServiceProtocol proto = getProtocol(argv[1]);
+ HAServiceProtocol proto = resolveTarget(argv[1]).getProxy();
HAServiceProtocolHelper.transitionToStandby(proto);
return 0;
}
private int failover(final String[] argv)
throws IOException, ServiceFailedException {
- Configuration conf = getConf();
boolean forceFence = false;
boolean forceActive = false;
@@ -162,29 +162,12 @@ public abstract class HAAdmin extends Co
return -1;
}
- NodeFencer fencer;
- try {
- fencer = NodeFencer.create(conf);
- } catch (BadFencingConfigurationException bfce) {
- errOut.println("failover: incorrect fencing configuration: " +
- bfce.getLocalizedMessage());
- return -1;
- }
- if (fencer == null) {
- errOut.println("failover: no fencer configured");
- return -1;
- }
-
- InetSocketAddress addr1 =
- NetUtils.createSocketAddr(getServiceAddr(args[0]));
- InetSocketAddress addr2 =
- NetUtils.createSocketAddr(getServiceAddr(args[1]));
- HAServiceProtocol proto1 = getProtocol(args[0]);
- HAServiceProtocol proto2 = getProtocol(args[1]);
-
+ HAServiceTarget fromNode = resolveTarget(args[0]);
+ HAServiceTarget toNode = resolveTarget(args[1]);
+
try {
- FailoverController.failover(proto1, addr1, proto2, addr2,
- fencer, forceFence, forceActive);
+ FailoverController.failover(fromNode, toNode,
+ forceFence, forceActive);
out.println("Failover from "+args[0]+" to "+args[1]+" successful");
} catch (FailoverFailedException ffe) {
errOut.println("Failover failed: " + ffe.getLocalizedMessage());
@@ -201,7 +184,7 @@ public abstract class HAAdmin extends Co
return -1;
}
- HAServiceProtocol proto = getProtocol(argv[1]);
+ HAServiceProtocol proto = resolveTarget(argv[1]).getProxy();
try {
HAServiceProtocolHelper.monitorHealth(proto);
} catch (HealthCheckFailedException e) {
@@ -219,7 +202,7 @@ public abstract class HAAdmin extends Co
return -1;
}
- HAServiceProtocol proto = getProtocol(argv[1]);
+ HAServiceProtocol proto = resolveTarget(argv[1]).getProxy();
out.println(proto.getServiceStatus().getState());
return 0;
}
@@ -232,16 +215,6 @@ public abstract class HAAdmin extends Co
return serviceId;
}
- /**
- * Return a proxy to the specified target service.
- */
- protected HAServiceProtocol getProtocol(String serviceId)
- throws IOException {
- String serviceAddr = getServiceAddr(serviceId);
- InetSocketAddress addr = NetUtils.createSocketAddr(serviceAddr);
- return new HAServiceProtocolClientSideTranslatorPB(addr, getConf());
- }
-
@Override
public int run(String[] argv) throws Exception {
try {
@@ -251,6 +224,9 @@ public abstract class HAAdmin extends Co
return -1;
} catch (IOException ioe) {
errOut.println("Operation failed: " + ioe.getLocalizedMessage());
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Operation failed", ioe);
+ }
return -1;
}
}
Added: hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/HAServiceTarget.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/HAServiceTarget.java?rev=1305196&view=auto
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/HAServiceTarget.java (added)
+++ hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/HAServiceTarget.java Mon Mar 26 01:54:22 2012
@@ -0,0 +1,78 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.ha;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+
+import javax.net.SocketFactory;
+
+import org.apache.hadoop.classification.InterfaceAudience;
+import org.apache.hadoop.classification.InterfaceStability;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
+import org.apache.hadoop.ha.protocolPB.HAServiceProtocolClientSideTranslatorPB;
+import org.apache.hadoop.net.NetUtils;
+
+/**
+ * Represents a target of the client side HA administration commands.
+ */
+@InterfaceAudience.Public
+@InterfaceStability.Evolving
+public abstract class HAServiceTarget {
+
+ /**
+ * @return the IPC address of the target node.
+ */
+ public abstract InetSocketAddress getAddress();
+
+ /**
+ * @return a Fencer implementation configured for this target node
+ */
+ public abstract NodeFencer getFencer();
+
+ /**
+ * @throws BadFencingConfigurationException if the fencing configuration
+ * appears to be invalid. This is divorced from the above
+ * {@link #getFencer()} method so that the configuration can be checked
+ * during the pre-flight phase of failover.
+ */
+ public abstract void checkFencingConfigured()
+ throws BadFencingConfigurationException;
+
+ /**
+ * @return a proxy to connect to the target HA Service.
+ */
+ public HAServiceProtocol getProxy(Configuration conf, int timeoutMs)
+ throws IOException {
+ Configuration confCopy = new Configuration(conf);
+ // Lower the timeout so we quickly fail to connect
+ confCopy.setInt(CommonConfigurationKeysPublic.IPC_CLIENT_CONNECT_MAX_RETRIES_KEY, 1);
+ SocketFactory factory = NetUtils.getDefaultSocketFactory(confCopy);
+ return new HAServiceProtocolClientSideTranslatorPB(
+ getAddress(),
+ confCopy, factory, timeoutMs);
+ }
+
+ /**
+ * @return a proxy to connect to the target HA Service.
+ */
+ public final HAServiceProtocol getProxy() throws IOException {
+ return getProxy(new Configuration(), 0); // default conf, timeout
+ }
+}
Modified: hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/NodeFencer.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/NodeFencer.java?rev=1305196&r1=1305195&r2=1305196&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/NodeFencer.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/NodeFencer.java Mon Mar 26 01:54:22 2012
@@ -17,7 +17,6 @@
*/
package org.apache.hadoop.ha;
-import java.net.InetSocketAddress;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
@@ -91,14 +90,14 @@ public class NodeFencer {
return new NodeFencer(conf);
}
- public boolean fence(InetSocketAddress serviceAddr) {
+ public boolean fence(HAServiceTarget fromSvc) {
LOG.info("====== Beginning Service Fencing Process... ======");
int i = 0;
for (FenceMethodWithArg method : methods) {
LOG.info("Trying method " + (++i) + "/" + methods.size() +": " + method);
try {
- if (method.method.tryFence(serviceAddr, method.arg)) {
+ if (method.method.tryFence(fromSvc, method.arg)) {
LOG.info("====== Fencing successful by method " + method + " ======");
return true;
}
Modified: hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ShellCommandFencer.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ShellCommandFencer.java?rev=1305196&r1=1305195&r2=1305196&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ShellCommandFencer.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ShellCommandFencer.java Mon Mar 26 01:54:22 2012
@@ -75,7 +75,8 @@ public class ShellCommandFencer
}
@Override
- public boolean tryFence(InetSocketAddress serviceAddr, String cmd) {
+ public boolean tryFence(HAServiceTarget target, String cmd) {
+ InetSocketAddress serviceAddr = target.getAddress();
List<String> cmdList = Arrays.asList(cmd.split("\\s+"));
// Create arg list with service as the first argument
Modified: hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/SshFenceByTcpPort.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/SshFenceByTcpPort.java?rev=1305196&r1=1305195&r2=1305196&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/SshFenceByTcpPort.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/SshFenceByTcpPort.java Mon Mar 26 01:54:22 2012
@@ -79,10 +79,11 @@ public class SshFenceByTcpPort extends C
}
@Override
- public boolean tryFence(InetSocketAddress serviceAddr, String argsStr)
+ public boolean tryFence(HAServiceTarget target, String argsStr)
throws BadFencingConfigurationException {
Args args = new Args(argsStr);
+ InetSocketAddress serviceAddr = target.getAddress();
String host = serviceAddr.getHostName();
Session session;
Added: hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/DummyHAService.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/DummyHAService.java?rev=1305196&view=auto
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/DummyHAService.java (added)
+++ hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/DummyHAService.java Mon Mar 26 01:54:22 2012
@@ -0,0 +1,94 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.ha;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.ha.HAServiceProtocol.HAServiceState;
+import org.apache.hadoop.security.AccessControlException;
+import org.mockito.Mockito;
+
+/**
+ * Test-only implementation of {@link HAServiceTarget}, which returns
+ * a mock implementation.
+ */
+class DummyHAService extends HAServiceTarget {
+ HAServiceState state;
+ HAServiceProtocol proxy;
+ NodeFencer fencer;
+ InetSocketAddress address;
+
+ DummyHAService(HAServiceState state, InetSocketAddress address) {
+ this.state = state;
+ this.proxy = makeMock();
+ this.fencer = Mockito.mock(NodeFencer.class);
+ this.address = address;
+ }
+
+ private HAServiceProtocol makeMock() {
+ return Mockito.spy(new HAServiceProtocol() {
+ @Override
+ public void monitorHealth() throws HealthCheckFailedException,
+ AccessControlException, IOException {
+ }
+
+ @Override
+ public void transitionToActive() throws ServiceFailedException,
+ AccessControlException, IOException {
+ state = HAServiceState.ACTIVE;
+ }
+
+ @Override
+ public void transitionToStandby() throws ServiceFailedException,
+ AccessControlException, IOException {
+ state = HAServiceState.STANDBY;
+ }
+
+ @Override
+ public HAServiceStatus getServiceStatus() throws IOException {
+ HAServiceStatus ret = new HAServiceStatus(state);
+ if (state == HAServiceState.STANDBY) {
+ ret.setReadyToBecomeActive();
+ }
+ return ret;
+ }
+ });
+ }
+
+ @Override
+ public InetSocketAddress getAddress() {
+ return address;
+ }
+
+ @Override
+ public HAServiceProtocol getProxy(Configuration conf, int timeout)
+ throws IOException {
+ return proxy;
+ }
+
+ @Override
+ public NodeFencer getFencer() {
+ return fencer;
+ }
+
+ @Override
+ public void checkFencingConfigured() throws BadFencingConfigurationException {
+ }
+}
\ No newline at end of file
Modified: hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestFailoverController.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestFailoverController.java?rev=1305196&r1=1305195&r2=1305196&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestFailoverController.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestFailoverController.java Mon Mar 26 01:54:22 2012
@@ -24,124 +24,85 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
import org.apache.hadoop.ha.HAServiceProtocol.HAServiceState;
-import org.apache.hadoop.ha.protocolPB.HAServiceProtocolClientSideTranslatorPB;
import org.apache.hadoop.ha.TestNodeFencer.AlwaysSucceedFencer;
import org.apache.hadoop.ha.TestNodeFencer.AlwaysFailFencer;
import static org.apache.hadoop.ha.TestNodeFencer.setupFencer;
-import org.apache.hadoop.net.NetUtils;
import org.apache.hadoop.security.AccessControlException;
import org.junit.Test;
+import org.mockito.Mockito;
+import org.mockito.internal.stubbing.answers.ThrowsException;
+import org.mockito.stubbing.Answer;
+
import static org.junit.Assert.*;
public class TestFailoverController {
-
private InetSocketAddress svc1Addr = new InetSocketAddress("svc1", 1234);
- private InetSocketAddress svc2Addr = new InetSocketAddress("svc2", 5678);
-
- private class DummyService implements HAServiceProtocol {
- HAServiceState state;
-
- DummyService(HAServiceState state) {
- this.state = state;
- }
-
- @Override
- public void monitorHealth() throws HealthCheckFailedException, IOException {
- // Do nothing
- }
-
- @Override
- public void transitionToActive() throws ServiceFailedException, IOException {
- state = HAServiceState.ACTIVE;
- }
+ private InetSocketAddress svc2Addr = new InetSocketAddress("svc2", 5678);
- @Override
- public void transitionToStandby() throws ServiceFailedException, IOException {
- state = HAServiceState.STANDBY;
- }
+ HAServiceStatus STATE_NOT_READY = new HAServiceStatus(HAServiceState.STANDBY)
+ .setNotReadyToBecomeActive("injected not ready");
- @Override
- public HAServiceStatus getServiceStatus() throws IOException {
- HAServiceStatus ret = new HAServiceStatus(state);
- if (state == HAServiceState.STANDBY) {
- ret.setReadyToBecomeActive();
- }
- return ret;
- }
-
- private HAServiceState getServiceState() {
- return state;
- }
- }
-
@Test
public void testFailoverAndFailback() throws Exception {
- DummyService svc1 = new DummyService(HAServiceState.ACTIVE);
- DummyService svc2 = new DummyService(HAServiceState.STANDBY);
- NodeFencer fencer = setupFencer(AlwaysSucceedFencer.class.getName());
+ DummyHAService svc1 = new DummyHAService(HAServiceState.ACTIVE, svc1Addr);
+ DummyHAService svc2 = new DummyHAService(HAServiceState.STANDBY, svc2Addr);
+ svc1.fencer = svc2.fencer = setupFencer(AlwaysSucceedFencer.class.getName());
AlwaysSucceedFencer.fenceCalled = 0;
- FailoverController.failover(svc1, svc1Addr, svc2, svc2Addr, fencer, false, false);
+ FailoverController.failover(svc1, svc2, false, false);
assertEquals(0, TestNodeFencer.AlwaysSucceedFencer.fenceCalled);
- assertEquals(HAServiceState.STANDBY, svc1.getServiceState());
- assertEquals(HAServiceState.ACTIVE, svc2.getServiceState());
+ assertEquals(HAServiceState.STANDBY, svc1.state);
+ assertEquals(HAServiceState.ACTIVE, svc2.state);
AlwaysSucceedFencer.fenceCalled = 0;
- FailoverController.failover(svc2, svc2Addr, svc1, svc1Addr, fencer, false, false);
+ FailoverController.failover(svc2, svc1, false, false);
assertEquals(0, TestNodeFencer.AlwaysSucceedFencer.fenceCalled);
- assertEquals(HAServiceState.ACTIVE, svc1.getServiceState());
- assertEquals(HAServiceState.STANDBY, svc2.getServiceState());
+ assertEquals(HAServiceState.ACTIVE, svc1.state);
+ assertEquals(HAServiceState.STANDBY, svc2.state);
}
@Test
public void testFailoverFromStandbyToStandby() throws Exception {
- DummyService svc1 = new DummyService(HAServiceState.STANDBY);
- DummyService svc2 = new DummyService(HAServiceState.STANDBY);
- NodeFencer fencer = setupFencer(AlwaysSucceedFencer.class.getName());
-
- FailoverController.failover(svc1, svc1Addr, svc2, svc2Addr, fencer, false, false);
- assertEquals(HAServiceState.STANDBY, svc1.getServiceState());
- assertEquals(HAServiceState.ACTIVE, svc2.getServiceState());
+ DummyHAService svc1 = new DummyHAService(HAServiceState.STANDBY, svc1Addr);
+ DummyHAService svc2 = new DummyHAService(HAServiceState.STANDBY, svc2Addr);
+ svc1.fencer = svc2.fencer = setupFencer(AlwaysSucceedFencer.class.getName());
+
+ FailoverController.failover(svc1, svc2, false, false);
+ assertEquals(HAServiceState.STANDBY, svc1.state);
+ assertEquals(HAServiceState.ACTIVE, svc2.state);
}
@Test
public void testFailoverFromActiveToActive() throws Exception {
- DummyService svc1 = new DummyService(HAServiceState.ACTIVE);
- DummyService svc2 = new DummyService(HAServiceState.ACTIVE);
- NodeFencer fencer = setupFencer(AlwaysSucceedFencer.class.getName());
+ DummyHAService svc1 = new DummyHAService(HAServiceState.ACTIVE, svc1Addr);
+ DummyHAService svc2 = new DummyHAService(HAServiceState.ACTIVE, svc2Addr);
+ svc1.fencer = svc2.fencer = setupFencer(AlwaysSucceedFencer.class.getName());
try {
- FailoverController.failover(svc1, svc1Addr, svc2, svc2Addr, fencer, false, false);
+ FailoverController.failover(svc1, svc2, false, false);
fail("Can't failover to an already active service");
} catch (FailoverFailedException ffe) {
// Expected
}
- assertEquals(HAServiceState.ACTIVE, svc1.getServiceState());
- assertEquals(HAServiceState.ACTIVE, svc2.getServiceState());
+ assertEquals(HAServiceState.ACTIVE, svc1.state);
+ assertEquals(HAServiceState.ACTIVE, svc2.state);
}
@Test
public void testFailoverWithoutPermission() throws Exception {
- DummyService svc1 = new DummyService(HAServiceState.ACTIVE) {
- @Override
- public HAServiceStatus getServiceStatus() throws IOException {
- throw new AccessControlException("Access denied");
- }
- };
- DummyService svc2 = new DummyService(HAServiceState.STANDBY) {
- @Override
- public HAServiceStatus getServiceStatus() throws IOException {
- throw new AccessControlException("Access denied");
- }
- };
- NodeFencer fencer = setupFencer(AlwaysSucceedFencer.class.getName());
+ DummyHAService svc1 = new DummyHAService(HAServiceState.ACTIVE, svc1Addr);
+ Mockito.doThrow(new AccessControlException("Access denied"))
+ .when(svc1.proxy).getServiceStatus();
+ DummyHAService svc2 = new DummyHAService(HAServiceState.STANDBY, svc2Addr);
+ Mockito.doThrow(new AccessControlException("Access denied"))
+ .when(svc2.proxy).getServiceStatus();
+ svc1.fencer = svc2.fencer = setupFencer(AlwaysSucceedFencer.class.getName());
try {
- FailoverController.failover(svc1, svc1Addr, svc2, svc2Addr, fencer, false, false);
+ FailoverController.failover(svc1, svc2, false, false);
fail("Can't failover when access is denied");
} catch (FailoverFailedException ffe) {
assertTrue(ffe.getCause().getMessage().contains("Access denied"));
@@ -151,19 +112,13 @@ public class TestFailoverController {
@Test
public void testFailoverToUnreadyService() throws Exception {
- DummyService svc1 = new DummyService(HAServiceState.ACTIVE);
- DummyService svc2 = new DummyService(HAServiceState.STANDBY) {
- @Override
- public HAServiceStatus getServiceStatus() throws IOException {
- HAServiceStatus ret = new HAServiceStatus(HAServiceState.STANDBY);
- ret.setNotReadyToBecomeActive("injected not ready");
- return ret;
- }
- };
- NodeFencer fencer = setupFencer(AlwaysSucceedFencer.class.getName());
+ DummyHAService svc1 = new DummyHAService(HAServiceState.ACTIVE, svc1Addr);
+ DummyHAService svc2 = new DummyHAService(HAServiceState.STANDBY, svc2Addr);
+ Mockito.doReturn(STATE_NOT_READY).when(svc2.proxy).getServiceStatus();
+ svc1.fencer = svc2.fencer = setupFencer(AlwaysSucceedFencer.class.getName());
try {
- FailoverController.failover(svc1, svc1Addr, svc2, svc2Addr, fencer, false, false);
+ FailoverController.failover(svc1, svc2, false, false);
fail("Can't failover to a service that's not ready");
} catch (FailoverFailedException ffe) {
// Expected
@@ -172,95 +127,88 @@ public class TestFailoverController {
}
}
- assertEquals(HAServiceState.ACTIVE, svc1.getServiceState());
- assertEquals(HAServiceState.STANDBY, svc2.getServiceState());
+ assertEquals(HAServiceState.ACTIVE, svc1.state);
+ assertEquals(HAServiceState.STANDBY, svc2.state);
// Forcing it means we ignore readyToBecomeActive
- FailoverController.failover(svc1, svc1Addr, svc2, svc2Addr, fencer, false, true);
- assertEquals(HAServiceState.STANDBY, svc1.getServiceState());
- assertEquals(HAServiceState.ACTIVE, svc2.getServiceState());
+ FailoverController.failover(svc1, svc2, false, true);
+ assertEquals(HAServiceState.STANDBY, svc1.state);
+ assertEquals(HAServiceState.ACTIVE, svc2.state);
}
@Test
public void testFailoverToUnhealthyServiceFailsAndFailsback() throws Exception {
- DummyService svc1 = new DummyService(HAServiceState.ACTIVE);
- DummyService svc2 = new DummyService(HAServiceState.STANDBY) {
- @Override
- public void monitorHealth() throws HealthCheckFailedException {
- throw new HealthCheckFailedException("Failed!");
- }
- };
- NodeFencer fencer = setupFencer(AlwaysSucceedFencer.class.getName());
+ DummyHAService svc1 = new DummyHAService(HAServiceState.ACTIVE, svc1Addr);
+ DummyHAService svc2 = new DummyHAService(HAServiceState.STANDBY, svc2Addr);
+ Mockito.doThrow(new HealthCheckFailedException("Failed!"))
+ .when(svc2.proxy).monitorHealth();
+ svc1.fencer = svc2.fencer = setupFencer(AlwaysSucceedFencer.class.getName());
try {
- FailoverController.failover(svc1, svc1Addr, svc2, svc2Addr, fencer, false, false);
+ FailoverController.failover(svc1, svc2, false, false);
fail("Failover to unhealthy service");
} catch (FailoverFailedException ffe) {
// Expected
}
- assertEquals(HAServiceState.ACTIVE, svc1.getServiceState());
- assertEquals(HAServiceState.STANDBY, svc2.getServiceState());
+ assertEquals(HAServiceState.ACTIVE, svc1.state);
+ assertEquals(HAServiceState.STANDBY, svc2.state);
}
@Test
public void testFailoverFromFaultyServiceSucceeds() throws Exception {
- DummyService svc1 = new DummyService(HAServiceState.ACTIVE) {
- @Override
- public void transitionToStandby() throws ServiceFailedException {
- throw new ServiceFailedException("Failed!");
- }
- };
- DummyService svc2 = new DummyService(HAServiceState.STANDBY);
- NodeFencer fencer = setupFencer(AlwaysSucceedFencer.class.getName());
+ DummyHAService svc1 = new DummyHAService(HAServiceState.ACTIVE, svc1Addr);
+ Mockito.doThrow(new ServiceFailedException("Failed!"))
+ .when(svc1.proxy).transitionToStandby();
+
+ DummyHAService svc2 = new DummyHAService(HAServiceState.STANDBY, svc2Addr);
+ svc1.fencer = svc2.fencer = setupFencer(AlwaysSucceedFencer.class.getName());
AlwaysSucceedFencer.fenceCalled = 0;
try {
- FailoverController.failover(svc1, svc1Addr, svc2, svc2Addr, fencer, false, false);
+ FailoverController.failover(svc1, svc2, false, false);
} catch (FailoverFailedException ffe) {
fail("Faulty active prevented failover");
}
// svc1 still thinks it's active, that's OK, it was fenced
assertEquals(1, AlwaysSucceedFencer.fenceCalled);
- assertEquals("svc1:1234", AlwaysSucceedFencer.fencedSvc);
- assertEquals(HAServiceState.ACTIVE, svc1.getServiceState());
- assertEquals(HAServiceState.ACTIVE, svc2.getServiceState());
+ assertSame(svc1, AlwaysSucceedFencer.fencedSvc);
+ assertEquals(HAServiceState.ACTIVE, svc1.state);
+ assertEquals(HAServiceState.ACTIVE, svc2.state);
}
@Test
public void testFailoverFromFaultyServiceFencingFailure() throws Exception {
- DummyService svc1 = new DummyService(HAServiceState.ACTIVE) {
- @Override
- public void transitionToStandby() throws ServiceFailedException {
- throw new ServiceFailedException("Failed!");
- }
- };
- DummyService svc2 = new DummyService(HAServiceState.STANDBY);
- NodeFencer fencer = setupFencer(AlwaysFailFencer.class.getName());
+ DummyHAService svc1 = new DummyHAService(HAServiceState.ACTIVE, svc1Addr);
+ Mockito.doThrow(new ServiceFailedException("Failed!"))
+ .when(svc1.proxy).transitionToStandby();
+
+ DummyHAService svc2 = new DummyHAService(HAServiceState.STANDBY, svc2Addr);
+ svc1.fencer = svc2.fencer = setupFencer(AlwaysFailFencer.class.getName());
AlwaysFailFencer.fenceCalled = 0;
try {
- FailoverController.failover(svc1, svc1Addr, svc2, svc2Addr, fencer, false, false);
+ FailoverController.failover(svc1, svc2, false, false);
fail("Failed over even though fencing failed");
} catch (FailoverFailedException ffe) {
// Expected
}
assertEquals(1, AlwaysFailFencer.fenceCalled);
- assertEquals("svc1:1234", AlwaysFailFencer.fencedSvc);
- assertEquals(HAServiceState.ACTIVE, svc1.getServiceState());
- assertEquals(HAServiceState.STANDBY, svc2.getServiceState());
+ assertSame(svc1, AlwaysFailFencer.fencedSvc);
+ assertEquals(HAServiceState.ACTIVE, svc1.state);
+ assertEquals(HAServiceState.STANDBY, svc2.state);
}
@Test
public void testFencingFailureDuringFailover() throws Exception {
- DummyService svc1 = new DummyService(HAServiceState.ACTIVE);
- DummyService svc2 = new DummyService(HAServiceState.STANDBY);
- NodeFencer fencer = setupFencer(AlwaysFailFencer.class.getName());
+ DummyHAService svc1 = new DummyHAService(HAServiceState.ACTIVE, svc1Addr);
+ DummyHAService svc2 = new DummyHAService(HAServiceState.STANDBY, svc2Addr);
+ svc1.fencer = svc2.fencer = setupFencer(AlwaysFailFencer.class.getName());
AlwaysFailFencer.fenceCalled = 0;
try {
- FailoverController.failover(svc1, svc1Addr, svc2, svc2Addr, fencer, true, false);
+ FailoverController.failover(svc1, svc2, true, false);
fail("Failed over even though fencing requested and failed");
} catch (FailoverFailedException ffe) {
// Expected
@@ -269,90 +217,83 @@ public class TestFailoverController {
// If fencing was requested and it failed we don't try to make
// svc2 active anyway, and we don't failback to svc1.
assertEquals(1, AlwaysFailFencer.fenceCalled);
- assertEquals("svc1:1234", AlwaysFailFencer.fencedSvc);
- assertEquals(HAServiceState.STANDBY, svc1.getServiceState());
- assertEquals(HAServiceState.STANDBY, svc2.getServiceState());
+ assertSame(svc1, AlwaysFailFencer.fencedSvc);
+ assertEquals(HAServiceState.STANDBY, svc1.state);
+ assertEquals(HAServiceState.STANDBY, svc2.state);
}
- private HAServiceProtocol getProtocol(String target)
- throws IOException {
- InetSocketAddress addr = NetUtils.createSocketAddr(target);
- Configuration conf = new Configuration();
- // Lower the timeout so we quickly fail to connect
- conf.setInt(CommonConfigurationKeysPublic.IPC_CLIENT_CONNECT_MAX_RETRIES_KEY, 1);
- return new HAServiceProtocolClientSideTranslatorPB(addr, conf);
- }
-
@Test
public void testFailoverFromNonExistantServiceWithFencer() throws Exception {
- HAServiceProtocol svc1 = getProtocol("localhost:1234");
- DummyService svc2 = new DummyService(HAServiceState.STANDBY);
- NodeFencer fencer = setupFencer(AlwaysSucceedFencer.class.getName());
+ DummyHAService svc1 = spy(new DummyHAService(null, svc1Addr));
+ // Getting a proxy to a dead server will throw IOException on call,
+ // not on creation of the proxy.
+ HAServiceProtocol errorThrowingProxy = Mockito.mock(HAServiceProtocol.class,
+ new ThrowsException(new IOException("Could not connect to host")));
+ Mockito.doReturn(errorThrowingProxy).when(svc1).getProxy();
+ DummyHAService svc2 = new DummyHAService(HAServiceState.STANDBY, svc2Addr);
+ svc1.fencer = svc2.fencer = setupFencer(AlwaysSucceedFencer.class.getName());
try {
- FailoverController.failover(svc1, svc1Addr, svc2, svc2Addr, fencer, false, false);
+ FailoverController.failover(svc1, svc2, false, false);
} catch (FailoverFailedException ffe) {
fail("Non-existant active prevented failover");
}
// Don't check svc1 because we can't reach it, but that's OK, it's been fenced.
- assertEquals(HAServiceState.ACTIVE, svc2.getServiceState());
+ assertEquals(HAServiceState.ACTIVE, svc2.state);
}
@Test
public void testFailoverToNonExistantServiceFails() throws Exception {
- DummyService svc1 = new DummyService(HAServiceState.ACTIVE);
- HAServiceProtocol svc2 = getProtocol("localhost:1234");
- NodeFencer fencer = setupFencer(AlwaysSucceedFencer.class.getName());
+ DummyHAService svc1 = new DummyHAService(HAServiceState.ACTIVE, svc1Addr);
+ DummyHAService svc2 = spy(new DummyHAService(null, svc2Addr));
+ Mockito.doThrow(new IOException("Failed to connect"))
+ .when(svc2).getProxy(Mockito.<Configuration>any(),
+ Mockito.anyInt());
+ svc1.fencer = svc2.fencer = setupFencer(AlwaysSucceedFencer.class.getName());
try {
- FailoverController.failover(svc1, svc1Addr, svc2, svc2Addr, fencer, false, false);
+ FailoverController.failover(svc1, svc2, false, false);
fail("Failed over to a non-existant standby");
} catch (FailoverFailedException ffe) {
// Expected
}
- assertEquals(HAServiceState.ACTIVE, svc1.getServiceState());
+ assertEquals(HAServiceState.ACTIVE, svc1.state);
}
@Test
public void testFailoverToFaultyServiceFailsbackOK() throws Exception {
- DummyService svc1 = spy(new DummyService(HAServiceState.ACTIVE));
- DummyService svc2 = new DummyService(HAServiceState.STANDBY) {
- @Override
- public void transitionToActive() throws ServiceFailedException {
- throw new ServiceFailedException("Failed!");
- }
- };
- NodeFencer fencer = setupFencer(AlwaysSucceedFencer.class.getName());
+ DummyHAService svc1 = spy(new DummyHAService(HAServiceState.ACTIVE, svc1Addr));
+ DummyHAService svc2 = new DummyHAService(HAServiceState.STANDBY, svc2Addr);
+ Mockito.doThrow(new ServiceFailedException("Failed!"))
+ .when(svc2.proxy).transitionToActive();
+ svc1.fencer = svc2.fencer = setupFencer(AlwaysSucceedFencer.class.getName());
try {
- FailoverController.failover(svc1, svc1Addr, svc2, svc2Addr, fencer, false, false);
+ FailoverController.failover(svc1, svc2, false, false);
fail("Failover to already active service");
} catch (FailoverFailedException ffe) {
// Expected
}
// svc1 went standby then back to active
- verify(svc1).transitionToStandby();
- verify(svc1).transitionToActive();
- assertEquals(HAServiceState.ACTIVE, svc1.getServiceState());
- assertEquals(HAServiceState.STANDBY, svc2.getServiceState());
+ verify(svc1.proxy).transitionToStandby();
+ verify(svc1.proxy).transitionToActive();
+ assertEquals(HAServiceState.ACTIVE, svc1.state);
+ assertEquals(HAServiceState.STANDBY, svc2.state);
}
@Test
public void testWeDontFailbackIfActiveWasFenced() throws Exception {
- DummyService svc1 = new DummyService(HAServiceState.ACTIVE);
- DummyService svc2 = new DummyService(HAServiceState.STANDBY) {
- @Override
- public void transitionToActive() throws ServiceFailedException {
- throw new ServiceFailedException("Failed!");
- }
- };
- NodeFencer fencer = setupFencer(AlwaysSucceedFencer.class.getName());
+ DummyHAService svc1 = new DummyHAService(HAServiceState.ACTIVE, svc1Addr);
+ DummyHAService svc2 = new DummyHAService(HAServiceState.STANDBY, svc2Addr);
+ Mockito.doThrow(new ServiceFailedException("Failed!"))
+ .when(svc2.proxy).transitionToActive();
+ svc1.fencer = svc2.fencer = setupFencer(AlwaysSucceedFencer.class.getName());
try {
- FailoverController.failover(svc1, svc1Addr, svc2, svc2Addr, fencer, true, false);
+ FailoverController.failover(svc1, svc2, true, false);
fail("Failed over to service that won't transition to active");
} catch (FailoverFailedException ffe) {
// Expected
@@ -360,24 +301,21 @@ public class TestFailoverController {
// We failed to failover and did not failback because we fenced
// svc1 (we forced it), therefore svc1 and svc2 should be standby.
- assertEquals(HAServiceState.STANDBY, svc1.getServiceState());
- assertEquals(HAServiceState.STANDBY, svc2.getServiceState());
+ assertEquals(HAServiceState.STANDBY, svc1.state);
+ assertEquals(HAServiceState.STANDBY, svc2.state);
}
@Test
public void testWeFenceOnFailbackIfTransitionToActiveFails() throws Exception {
- DummyService svc1 = new DummyService(HAServiceState.ACTIVE);
- DummyService svc2 = new DummyService(HAServiceState.STANDBY) {
- @Override
- public void transitionToActive() throws ServiceFailedException, IOException {
- throw new IOException("Failed!");
- }
- };
- NodeFencer fencer = setupFencer(AlwaysSucceedFencer.class.getName());
+ DummyHAService svc1 = new DummyHAService(HAServiceState.ACTIVE, svc1Addr);
+ DummyHAService svc2 = new DummyHAService(HAServiceState.STANDBY, svc2Addr);
+ Mockito.doThrow(new ServiceFailedException("Failed!"))
+ .when(svc2.proxy).transitionToActive();
+ svc1.fencer = svc2.fencer = setupFencer(AlwaysSucceedFencer.class.getName());
AlwaysSucceedFencer.fenceCalled = 0;
try {
- FailoverController.failover(svc1, svc1Addr, svc2, svc2Addr, fencer, false, false);
+ FailoverController.failover(svc1, svc2, false, false);
fail("Failed over to service that won't transition to active");
} catch (FailoverFailedException ffe) {
// Expected
@@ -386,25 +324,22 @@ public class TestFailoverController {
// We failed to failover. We did not fence svc1 because it cooperated
// and we didn't force it, so we failed back to svc1 and fenced svc2.
// Note svc2 still thinks it's active, that's OK, we fenced it.
- assertEquals(HAServiceState.ACTIVE, svc1.getServiceState());
+ assertEquals(HAServiceState.ACTIVE, svc1.state);
assertEquals(1, AlwaysSucceedFencer.fenceCalled);
- assertEquals("svc2:5678", AlwaysSucceedFencer.fencedSvc);
+ assertSame(svc2, AlwaysSucceedFencer.fencedSvc);
}
@Test
public void testFailureToFenceOnFailbackFailsTheFailback() throws Exception {
- DummyService svc1 = new DummyService(HAServiceState.ACTIVE);
- DummyService svc2 = new DummyService(HAServiceState.STANDBY) {
- @Override
- public void transitionToActive() throws ServiceFailedException, IOException {
- throw new IOException("Failed!");
- }
- };
- NodeFencer fencer = setupFencer(AlwaysFailFencer.class.getName());
+ DummyHAService svc1 = new DummyHAService(HAServiceState.ACTIVE, svc1Addr);
+ DummyHAService svc2 = new DummyHAService(HAServiceState.STANDBY, svc2Addr);
+ Mockito.doThrow(new IOException("Failed!"))
+ .when(svc2.proxy).transitionToActive();
+ svc1.fencer = svc2.fencer = setupFencer(AlwaysFailFencer.class.getName());
AlwaysFailFencer.fenceCalled = 0;
try {
- FailoverController.failover(svc1, svc1Addr, svc2, svc2Addr, fencer, false, false);
+ FailoverController.failover(svc1, svc2, false, false);
fail("Failed over to service that won't transition to active");
} catch (FailoverFailedException ffe) {
// Expected
@@ -413,35 +348,30 @@ public class TestFailoverController {
// We did not fence svc1 because it cooperated and we didn't force it,
// we failed to failover so we fenced svc2, we failed to fence svc2
// so we did not failback to svc1, ie it's still standby.
- assertEquals(HAServiceState.STANDBY, svc1.getServiceState());
+ assertEquals(HAServiceState.STANDBY, svc1.state);
assertEquals(1, AlwaysFailFencer.fenceCalled);
- assertEquals("svc2:5678", AlwaysFailFencer.fencedSvc);
+ assertSame(svc2, AlwaysFailFencer.fencedSvc);
}
@Test
public void testFailbackToFaultyServiceFails() throws Exception {
- DummyService svc1 = new DummyService(HAServiceState.ACTIVE) {
- @Override
- public void transitionToActive() throws ServiceFailedException {
- throw new ServiceFailedException("Failed!");
- }
- };
- DummyService svc2 = new DummyService(HAServiceState.STANDBY) {
- @Override
- public void transitionToActive() throws ServiceFailedException {
- throw new ServiceFailedException("Failed!");
- }
- };
- NodeFencer fencer = setupFencer(AlwaysSucceedFencer.class.getName());
+ DummyHAService svc1 = new DummyHAService(HAServiceState.ACTIVE, svc1Addr);
+ Mockito.doThrow(new ServiceFailedException("Failed!"))
+ .when(svc1.proxy).transitionToActive();
+ DummyHAService svc2 = new DummyHAService(HAServiceState.STANDBY, svc2Addr);
+ Mockito.doThrow(new ServiceFailedException("Failed!"))
+ .when(svc2.proxy).transitionToActive();
+
+ svc1.fencer = svc2.fencer = setupFencer(AlwaysSucceedFencer.class.getName());
try {
- FailoverController.failover(svc1, svc1Addr, svc2, svc2Addr, fencer, false, false);
+ FailoverController.failover(svc1, svc2, false, false);
fail("Failover to already active service");
} catch (FailoverFailedException ffe) {
// Expected
}
- assertEquals(HAServiceState.STANDBY, svc1.getServiceState());
- assertEquals(HAServiceState.STANDBY, svc2.getServiceState());
+ assertEquals(HAServiceState.STANDBY, svc1.state);
+ assertEquals(HAServiceState.STANDBY, svc2.state);
}
}
Modified: hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestHAAdmin.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestHAAdmin.java?rev=1305196&r1=1305195&r2=1305196&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestHAAdmin.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestHAAdmin.java Mon Mar 26 01:54:22 2012
@@ -22,14 +22,15 @@ import static org.junit.Assert.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
+import java.net.InetSocketAddress;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;
import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.ha.HAServiceProtocol.HAServiceState;
import org.junit.Before;
import org.junit.Test;
-import org.mockito.Mockito;
import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
@@ -40,15 +41,14 @@ public class TestHAAdmin {
private HAAdmin tool;
private ByteArrayOutputStream errOutBytes = new ByteArrayOutputStream();
private String errOutput;
- private HAServiceProtocol mockProtocol;
-
+
@Before
public void setup() throws IOException {
- mockProtocol = Mockito.mock(HAServiceProtocol.class);
tool = new HAAdmin() {
@Override
- protected HAServiceProtocol getProtocol(String target) throws IOException {
- return mockProtocol;
+ protected HAServiceTarget resolveTarget(String target) {
+ return new DummyHAService(HAServiceState.STANDBY,
+ new InetSocketAddress("dummy", 12345));
}
};
tool.setConf(new Configuration());
Modified: hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestNodeFencer.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestNodeFencer.java?rev=1305196&r1=1305195&r2=1305196&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestNodeFencer.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestNodeFencer.java Mon Mar 26 01:54:22 2012
@@ -26,26 +26,35 @@ import org.apache.hadoop.conf.Configurat
import org.apache.hadoop.conf.Configured;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.Mockito;
import com.google.common.collect.Lists;
public class TestNodeFencer {
+ private HAServiceTarget MOCK_TARGET;
+
+
@Before
public void clearMockState() {
AlwaysSucceedFencer.fenceCalled = 0;
AlwaysSucceedFencer.callArgs.clear();
AlwaysFailFencer.fenceCalled = 0;
AlwaysFailFencer.callArgs.clear();
+
+ MOCK_TARGET = Mockito.mock(HAServiceTarget.class);
+ Mockito.doReturn("my mock").when(MOCK_TARGET).toString();
+ Mockito.doReturn(new InetSocketAddress("host", 1234))
+ .when(MOCK_TARGET).getAddress();
}
@Test
public void testSingleFencer() throws BadFencingConfigurationException {
NodeFencer fencer = setupFencer(
AlwaysSucceedFencer.class.getName() + "(foo)");
- assertTrue(fencer.fence(new InetSocketAddress("host", 1234)));
+ assertTrue(fencer.fence(MOCK_TARGET));
assertEquals(1, AlwaysSucceedFencer.fenceCalled);
- assertEquals("host:1234", AlwaysSucceedFencer.fencedSvc);
+ assertSame(MOCK_TARGET, AlwaysSucceedFencer.fencedSvc);
assertEquals("foo", AlwaysSucceedFencer.callArgs.get(0));
}
@@ -54,7 +63,7 @@ public class TestNodeFencer {
NodeFencer fencer = setupFencer(
AlwaysSucceedFencer.class.getName() + "(foo)\n" +
AlwaysSucceedFencer.class.getName() + "(bar)\n");
- assertTrue(fencer.fence(new InetSocketAddress("host", 1234)));
+ assertTrue(fencer.fence(MOCK_TARGET));
// Only one call, since the first fencer succeeds
assertEquals(1, AlwaysSucceedFencer.fenceCalled);
assertEquals("foo", AlwaysSucceedFencer.callArgs.get(0));
@@ -68,12 +77,12 @@ public class TestNodeFencer {
" # the next one will always fail\n" +
" " + AlwaysFailFencer.class.getName() + "(foo) # <- fails\n" +
AlwaysSucceedFencer.class.getName() + "(bar) \n");
- assertTrue(fencer.fence(new InetSocketAddress("host", 1234)));
+ assertTrue(fencer.fence(MOCK_TARGET));
// One call to each, since top fencer fails
assertEquals(1, AlwaysFailFencer.fenceCalled);
- assertEquals("host:1234", AlwaysFailFencer.fencedSvc);
+ assertSame(MOCK_TARGET, AlwaysFailFencer.fencedSvc);
assertEquals(1, AlwaysSucceedFencer.fenceCalled);
- assertEquals("host:1234", AlwaysSucceedFencer.fencedSvc);
+ assertSame(MOCK_TARGET, AlwaysSucceedFencer.fencedSvc);
assertEquals("foo", AlwaysFailFencer.callArgs.get(0));
assertEquals("bar", AlwaysSucceedFencer.callArgs.get(0));
}
@@ -82,41 +91,41 @@ public class TestNodeFencer {
public void testArglessFencer() throws BadFencingConfigurationException {
NodeFencer fencer = setupFencer(
AlwaysSucceedFencer.class.getName());
- assertTrue(fencer.fence(new InetSocketAddress("host", 1234)));
+ assertTrue(fencer.fence(MOCK_TARGET));
// One call to each, since top fencer fails
assertEquals(1, AlwaysSucceedFencer.fenceCalled);
- assertEquals("host:1234", AlwaysSucceedFencer.fencedSvc);
+ assertSame(MOCK_TARGET, AlwaysSucceedFencer.fencedSvc);
assertEquals(null, AlwaysSucceedFencer.callArgs.get(0));
}
@Test
public void testShortNameShell() throws BadFencingConfigurationException {
NodeFencer fencer = setupFencer("shell(true)");
- assertTrue(fencer.fence(new InetSocketAddress("host", 1234)));
+ assertTrue(fencer.fence(MOCK_TARGET));
}
@Test
public void testShortNameSsh() throws BadFencingConfigurationException {
NodeFencer fencer = setupFencer("sshfence");
- assertFalse(fencer.fence(new InetSocketAddress("host", 1234)));
+ assertFalse(fencer.fence(MOCK_TARGET));
}
@Test
public void testShortNameSshWithUser() throws BadFencingConfigurationException {
NodeFencer fencer = setupFencer("sshfence(user)");
- assertFalse(fencer.fence(new InetSocketAddress("host", 1234)));
+ assertFalse(fencer.fence(MOCK_TARGET));
}
@Test
public void testShortNameSshWithPort() throws BadFencingConfigurationException {
NodeFencer fencer = setupFencer("sshfence(:123)");
- assertFalse(fencer.fence(new InetSocketAddress("host", 1234)));
+ assertFalse(fencer.fence(MOCK_TARGET));
}
@Test
public void testShortNameSshWithUserPort() throws BadFencingConfigurationException {
NodeFencer fencer = setupFencer("sshfence(user:123)");
- assertFalse(fencer.fence(new InetSocketAddress("host", 1234)));
+ assertFalse(fencer.fence(MOCK_TARGET));
}
public static NodeFencer setupFencer(String confStr)
@@ -133,12 +142,12 @@ public class TestNodeFencer {
public static class AlwaysSucceedFencer extends Configured
implements FenceMethod {
static int fenceCalled = 0;
- static String fencedSvc;
+ static HAServiceTarget fencedSvc;
static List<String> callArgs = Lists.newArrayList();
@Override
- public boolean tryFence(InetSocketAddress serviceAddr, String args) {
- fencedSvc = serviceAddr.getHostName() + ":" + serviceAddr.getPort();
+ public boolean tryFence(HAServiceTarget target, String args) {
+ fencedSvc = target;
callArgs.add(args);
fenceCalled++;
return true;
@@ -155,12 +164,12 @@ public class TestNodeFencer {
public static class AlwaysFailFencer extends Configured
implements FenceMethod {
static int fenceCalled = 0;
- static String fencedSvc;
+ static HAServiceTarget fencedSvc;
static List<String> callArgs = Lists.newArrayList();
@Override
- public boolean tryFence(InetSocketAddress serviceAddr, String args) {
- fencedSvc = serviceAddr.getHostName() + ":" + serviceAddr.getPort();
+ public boolean tryFence(HAServiceTarget target, String args) {
+ fencedSvc = target;
callArgs.add(args);
fenceCalled++;
return false;
Modified: hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestShellCommandFencer.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestShellCommandFencer.java?rev=1305196&r1=1305195&r2=1305196&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestShellCommandFencer.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestShellCommandFencer.java Mon Mar 26 01:54:22 2012
@@ -22,6 +22,7 @@ import static org.junit.Assert.*;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.ha.HAServiceProtocol.HAServiceState;
import org.apache.hadoop.util.StringUtils;
import org.junit.Before;
import org.junit.BeforeClass;
@@ -32,6 +33,9 @@ import static org.mockito.Mockito.spy;
public class TestShellCommandFencer {
private ShellCommandFencer fencer = createFencer();
+ private static final HAServiceTarget TEST_TARGET =
+ new DummyHAService(HAServiceState.ACTIVE,
+ new InetSocketAddress("host", 1234));
@BeforeClass
public static void setupLogSpy() {
@@ -57,11 +61,10 @@ public class TestShellCommandFencer {
*/
@Test
public void testBasicSuccessFailure() {
- InetSocketAddress addr = new InetSocketAddress("host", 1234);
- assertTrue(fencer.tryFence(addr, "echo"));
- assertFalse(fencer.tryFence(addr, "exit 1"));
+ assertTrue(fencer.tryFence(TEST_TARGET, "echo"));
+ assertFalse(fencer.tryFence(TEST_TARGET, "exit 1"));
// bad path should also fail
- assertFalse(fencer.tryFence(addr, "xxxxxxxxxxxx"));
+ assertFalse(fencer.tryFence(TEST_TARGET, "xxxxxxxxxxxx"));
}
@Test
@@ -98,8 +101,7 @@ public class TestShellCommandFencer {
*/
@Test
public void testStdoutLogging() {
- InetSocketAddress addr = new InetSocketAddress("host", 1234);
- assertTrue(fencer.tryFence(addr, "echo hello"));
+ assertTrue(fencer.tryFence(TEST_TARGET, "echo hello"));
Mockito.verify(ShellCommandFencer.LOG).info(
Mockito.endsWith("echo hello: host:1234 hello"));
}
@@ -110,8 +112,7 @@ public class TestShellCommandFencer {
*/
@Test
public void testStderrLogging() {
- InetSocketAddress addr = new InetSocketAddress("host", 1234);
- assertTrue(fencer.tryFence(addr, "echo hello >&2"));
+ assertTrue(fencer.tryFence(TEST_TARGET, "echo hello >&2"));
Mockito.verify(ShellCommandFencer.LOG).warn(
Mockito.endsWith("echo hello >&2: host:1234 hello"));
}
@@ -122,8 +123,7 @@ public class TestShellCommandFencer {
*/
@Test
public void testConfAsEnvironment() {
- InetSocketAddress addr = new InetSocketAddress("host", 1234);
- fencer.tryFence(addr, "echo $in_fencing_tests");
+ fencer.tryFence(TEST_TARGET, "echo $in_fencing_tests");
Mockito.verify(ShellCommandFencer.LOG).info(
Mockito.endsWith("echo $in...ing_tests: host:1234 yessir"));
}
@@ -136,8 +136,7 @@ public class TestShellCommandFencer {
*/
@Test(timeout=10000)
public void testSubprocessInputIsClosed() {
- InetSocketAddress addr = new InetSocketAddress("host", 1234);
- assertFalse(fencer.tryFence(addr, "read"));
+ assertFalse(fencer.tryFence(TEST_TARGET, "read"));
}
@Test
Modified: hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestSshFenceByTcpPort.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestSshFenceByTcpPort.java?rev=1305196&r1=1305195&r2=1305196&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestSshFenceByTcpPort.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestSshFenceByTcpPort.java Mon Mar 26 01:54:22 2012
@@ -23,6 +23,7 @@ import java.net.InetSocketAddress;
import org.apache.commons.logging.impl.Log4JLogger;
import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.ha.HAServiceProtocol.HAServiceState;
import org.apache.hadoop.ha.SshFenceByTcpPort.Args;
import org.apache.log4j.Level;
import org.junit.Assume;
@@ -34,12 +35,25 @@ public class TestSshFenceByTcpPort {
((Log4JLogger)SshFenceByTcpPort.LOG).getLogger().setLevel(Level.ALL);
}
- private String TEST_FENCING_HOST = System.getProperty(
+ private static String TEST_FENCING_HOST = System.getProperty(
"test.TestSshFenceByTcpPort.host", "localhost");
- private String TEST_FENCING_PORT = System.getProperty(
+ private static final String TEST_FENCING_PORT = System.getProperty(
"test.TestSshFenceByTcpPort.port", "8020");
- private final String TEST_KEYFILE = System.getProperty(
+ private static final String TEST_KEYFILE = System.getProperty(
"test.TestSshFenceByTcpPort.key");
+
+ private static final InetSocketAddress TEST_ADDR =
+ new InetSocketAddress(TEST_FENCING_HOST,
+ Integer.valueOf(TEST_FENCING_PORT));
+ private static final HAServiceTarget TEST_TARGET =
+ new DummyHAService(HAServiceState.ACTIVE, TEST_ADDR);
+
+ /**
+ * Connect to Google's DNS server - not running ssh!
+ */
+ private static final HAServiceTarget UNFENCEABLE_TARGET =
+ new DummyHAService(HAServiceState.ACTIVE,
+ new InetSocketAddress("8.8.8.8", 1234));
@Test(timeout=20000)
public void testFence() throws BadFencingConfigurationException {
@@ -49,8 +63,7 @@ public class TestSshFenceByTcpPort {
SshFenceByTcpPort fence = new SshFenceByTcpPort();
fence.setConf(conf);
assertTrue(fence.tryFence(
- new InetSocketAddress(TEST_FENCING_HOST,
- Integer.valueOf(TEST_FENCING_PORT)),
+ TEST_TARGET,
null));
}
@@ -65,8 +78,7 @@ public class TestSshFenceByTcpPort {
conf.setInt(SshFenceByTcpPort.CONF_CONNECT_TIMEOUT_KEY, 3000);
SshFenceByTcpPort fence = new SshFenceByTcpPort();
fence.setConf(conf);
- // Connect to Google's DNS server - not running ssh!
- assertFalse(fence.tryFence(new InetSocketAddress("8.8.8.8", 1234), ""));
+ assertFalse(fence.tryFence(UNFENCEABLE_TARGET, ""));
}
@Test