You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@slider.apache.org by sm...@apache.org on 2014/08/13 20:19:45 UTC
[1/9] git commit: SLIDER-202: add codahale metrics
Repository: incubator-slider
Updated Branches:
refs/heads/feature/SLIDER-285_Restart_AM 70519f785 -> eadb3c731
SLIDER-202: add codahale metrics
Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/8d4217e7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/8d4217e7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/8d4217e7
Branch: refs/heads/feature/SLIDER-285_Restart_AM
Commit: 8d4217e7988e561d6e9432f86a76c86adcfaee87
Parents: d38b31a
Author: Steve Loughran <st...@apache.org>
Authored: Tue Aug 12 20:43:00 2014 +0100
Committer: Steve Loughran <st...@apache.org>
Committed: Tue Aug 12 20:43:00 2014 +0100
----------------------------------------------------------------------
pom.xml | 8 ++++++++
slider-core/pom.xml | 46 +++++-----------------------------------------
2 files changed, 13 insertions(+), 41 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8d4217e7/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 253d40f..ed823c4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -143,11 +143,14 @@
<jackson.version>1.9.13</jackson.version>
<jcommander.version>1.30</jcommander.version>
+
<jersey.version>1.9</jersey.version>
<servlet-api.version>2.5</servlet-api.version>
<jsr311-api.version>1.1.1</jsr311-api.version>
+
<junit.version>4.11</junit.version>
<log4j.version>1.2.17</log4j.version>
+ <metrics.version>3.0.1</metrics.version>
<mockito.version>1.8.5</mockito.version>
<!-- ProtocolBuffer version, used to verify the protoc version and -->
@@ -1174,6 +1177,11 @@
<version>${jersey.version}</version>
</dependency>
+ <dependency>
+ <groupId>com.codahale.metrics</groupId>
+ <artifactId>metrics-core</artifactId>
+ <version>${metrics.version}</version>
+ </dependency>
<!-- ======================================================== -->
<!-- Mocking -->
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8d4217e7/slider-core/pom.xml
----------------------------------------------------------------------
diff --git a/slider-core/pom.xml b/slider-core/pom.xml
index a44e3bc..d403034 100644
--- a/slider-core/pom.xml
+++ b/slider-core/pom.xml
@@ -309,48 +309,7 @@
<artifactId>hadoop-minicluster</artifactId>
<scope>test</scope>
</dependency>
-<!--
-
- <dependency>
- <groupId>org.apache.hbase</groupId>
- <artifactId>hbase-client</artifactId>
- <scope>test</scope>
- </dependency>
-
- <dependency>
- <groupId>org.apache.hbase</groupId>
- <artifactId>hbase-server</artifactId>
- <scope>test</scope>
- </dependency>
-
--->
-
-<!--
-
- <dependency>
- <groupId>org.apache.accumulo</groupId>
- <artifactId>accumulo-core</artifactId>
- <scope>test</scope>
- </dependency>
-
- <dependency>
- <groupId>org.apache.accumulo</groupId>
- <artifactId>accumulo-minicluster</artifactId>
- <scope>test</scope>
- </dependency>
-
- <dependency>
- <groupId>org.apache.accumulo</groupId>
- <artifactId>accumulo-start</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.accumulo</groupId>
- <artifactId>accumulo-trace</artifactId>
- <scope>test</scope>
- </dependency>
--->
<dependency>
<groupId>junit</groupId>
@@ -398,6 +357,11 @@
<artifactId>commons-logging</artifactId>
</dependency>
+ <dependency>
+ <groupId>com.codahale.metrics</groupId>
+ <artifactId>metrics-core</artifactId>
+ </dependency>
+
<!-- ======================================================== -->
<!-- service registry -->
<!-- ======================================================== -->
[2/9] git commit: SLIDER-202 initial chaos monkey
Posted by sm...@apache.org.
SLIDER-202 initial chaos monkey
Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/c951e251
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/c951e251
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/c951e251
Branch: refs/heads/feature/SLIDER-285_Restart_AM
Commit: c951e2519e3d4327bce04bc2ee826d3140f8c0ed
Parents: 8d4217e
Author: Steve Loughran <st...@apache.org>
Authored: Wed Aug 13 10:18:01 2014 +0100
Committer: Steve Loughran <st...@apache.org>
Committed: Wed Aug 13 10:18:01 2014 +0100
----------------------------------------------------------------------
.../server/appmaster/SliderAppMaster.java | 6 ++
.../server/appmaster/monkey/ChaosEntry.java | 35 ++++++++++++
.../appmaster/monkey/ChaosMonkeyService.java | 60 ++++++++++++++++++++
.../server/appmaster/monkey/ChaosTarget.java | 24 ++++++++
4 files changed, 125 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/c951e251/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
index 9a2851a..1135a58 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
@@ -18,6 +18,7 @@
package org.apache.slider.server.appmaster;
+import com.codahale.metrics.MetricRegistry;
import com.google.protobuf.BlockingService;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
@@ -196,6 +197,11 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
public static final int NUM_RPC_HANDLERS = 5;
public static final int SCHEDULED_EXECUTOR_POOL_SIZE = 1;
+ /**
+ * Singleton of metrics registry
+ */
+ public static final MetricRegistry metrics = new MetricRegistry();
+
/** YARN RPC to communicate with the Resource Manager or Node Manager */
private YarnRPC yarnRPC;
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/c951e251/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
new file mode 100644
index 0000000..779cca1
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
@@ -0,0 +1,35 @@
+/*
+ * 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.slider.server.appmaster.monkey;
+
+/**
+ * Entry in the chaos list
+ */
+public class ChaosEntry {
+
+ public final String name;
+ public final ChaosTarget target;
+ public final long probability;
+
+ public ChaosEntry(String name, ChaosTarget target, long probability) {
+ this.name = name;
+ this.target = target;
+ this.probability = probability;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/c951e251/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
new file mode 100644
index 0000000..7c5638c
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
@@ -0,0 +1,60 @@
+/*
+ * 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.slider.server.appmaster.monkey;
+
+import com.codahale.metrics.MetricRegistry;
+import com.google.common.base.Preconditions;
+import org.apache.hadoop.service.AbstractService;
+import org.apache.slider.server.appmaster.actions.QueueAccess;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ChaosMonkeyService extends AbstractService {
+ protected static final Logger log =
+ LoggerFactory.getLogger(ChaosMonkeyService.class);
+ private final MetricRegistry metrics;
+ private final QueueAccess queues;
+
+ private static final List<ChaosEntry> chaosEntries =
+ new ArrayList<ChaosEntry>();
+
+ public ChaosMonkeyService(MetricRegistry metrics, QueueAccess queues) {
+ super("ChaosMonkeyService");
+ this.metrics = metrics;
+ this.queues = queues;
+ }
+
+
+ @Override
+ protected void serviceStart() throws Exception {
+ super.serviceStart();
+
+ }
+
+
+ public synchronized void addTarget(ChaosTarget target, long probability) {
+ Preconditions.checkArgument(target != null, "null target");
+ Preconditions.checkArgument(probability > 0, "negative probability");
+ Preconditions.checkArgument(probability > 10000, "probability over 100%");
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/c951e251/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosTarget.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosTarget.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosTarget.java
new file mode 100644
index 0000000..1c3a9ac
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosTarget.java
@@ -0,0 +1,24 @@
+/*
+ * 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.slider.server.appmaster.monkey;
+
+public interface ChaosTarget {
+
+ public void chaosAction();
+}
[3/9] git commit: SLIDER-202 Monkey implemented but not
conditional/integrated
Posted by sm...@apache.org.
SLIDER-202 Monkey implemented but not conditional/integrated
Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/b111268a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/b111268a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/b111268a
Branch: refs/heads/feature/SLIDER-285_Restart_AM
Commit: b111268af07a75797c9f56b3ab96c0dd052a62a8
Parents: c951e25
Author: Steve Loughran <st...@apache.org>
Authored: Wed Aug 13 12:00:27 2014 +0100
Committer: Steve Loughran <st...@apache.org>
Committed: Wed Aug 13 12:00:27 2014 +0100
----------------------------------------------------------------------
.../server/appmaster/SliderAppMaster.java | 52 +++++++++++----
.../server/appmaster/actions/ActionHalt.java | 4 +-
.../appmaster/actions/ActionKillContainer.java | 51 +++++++++++++++
.../server/appmaster/monkey/ChaosEntry.java | 53 ++++++++++++++-
.../server/appmaster/monkey/ChaosKillAM.java | 48 ++++++++++++++
.../appmaster/monkey/ChaosKillContainer.java | 68 ++++++++++++++++++++
.../appmaster/monkey/ChaosMonkeyService.java | 41 ++++++++----
.../appmaster/monkey/MonkeyPlayAction.java | 48 ++++++++++++++
.../slider/server/appmaster/state/AppState.java | 14 +++-
.../standalone/TestStandaloneAgentAM.groovy | 2 +-
10 files changed, 346 insertions(+), 35 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
index 1135a58..ee0e59e 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
@@ -97,6 +97,7 @@ import org.apache.slider.providers.ProviderService;
import org.apache.slider.providers.SliderProviderFactory;
import org.apache.slider.providers.slideram.SliderAMClientProvider;
import org.apache.slider.providers.slideram.SliderAMProviderService;
+import org.apache.slider.server.appmaster.actions.ActionKillContainer;
import org.apache.slider.server.appmaster.actions.QueueExecutor;
import org.apache.slider.server.appmaster.actions.ActionHalt;
import org.apache.slider.server.appmaster.actions.QueueService;
@@ -104,6 +105,9 @@ import org.apache.slider.server.appmaster.actions.ActionStopSlider;
import org.apache.slider.server.appmaster.actions.AsyncAction;
import org.apache.slider.server.appmaster.actions.RenewingAction;
import org.apache.slider.server.appmaster.actions.ResetFailureWindow;
+import org.apache.slider.server.appmaster.monkey.ChaosKillAM;
+import org.apache.slider.server.appmaster.monkey.ChaosKillContainer;
+import org.apache.slider.server.appmaster.monkey.ChaosMonkeyService;
import org.apache.slider.server.appmaster.operations.AsyncRMOperationHandler;
import org.apache.slider.server.appmaster.operations.ProviderNotifyingOperationHandler;
import org.apache.slider.server.appmaster.rpc.RpcBinder;
@@ -112,7 +116,6 @@ import org.apache.slider.server.appmaster.rpc.SliderClusterProtocolPBImpl;
import org.apache.slider.server.appmaster.operations.AbstractRMOperation;
import org.apache.slider.server.appmaster.state.AppState;
import org.apache.slider.server.appmaster.state.ContainerAssignment;
-import org.apache.slider.server.appmaster.operations.ContainerReleaseOperation;
import org.apache.slider.server.appmaster.state.ProviderAppState;
import org.apache.slider.server.appmaster.operations.RMOperationHandler;
import org.apache.slider.server.appmaster.state.RoleInstance;
@@ -147,7 +150,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
-import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
@@ -301,6 +303,11 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
private ContainerId appMasterContainerID;
/**
+ * Monkey Service -may be null
+ */
+ private ChaosMonkeyService monkey;
+
+ /**
* ProviderService of this cluster
*/
@SuppressWarnings("FieldAccessedSynchronizedAndUnsynchronized")
@@ -780,6 +787,8 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
// starts the node review process
launchProviderService(instanceDefinition, confDir);
+ // chaos monkey
+ maybeStartMonkey();
try {
//now block waiting to be told to exit the process
@@ -1103,7 +1112,7 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
}
//for all the operations, exec them
- rmOperationHandler.execute(operations);
+ executeRMOperations(operations);
log.info("Diagnostics: " + getContainerDiagnosticInfo());
}
@@ -1221,7 +1230,7 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
// tell the provider
providerRMOperationHandler.execute(allOperations);
//now apply the operations
- rmOperationHandler.execute(allOperations);
+ executeRMOperations(allOperations);
return !allOperations.isEmpty();
} catch (TriggerClusterTeardownException e) {
@@ -1237,7 +1246,7 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
*/
private void releaseAllContainers() {
//now apply the operations
- rmOperationHandler.execute(appState.releaseAllContainers());
+ executeRMOperations(appState.releaseAllContainers());
}
/**
@@ -1441,19 +1450,17 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
//throws NoSuchNodeException if it is missing
RoleInstance instance =
appState.getLiveInstanceByContainerID(containerID);
- List<AbstractRMOperation> opsList =
- new LinkedList<>();
- ContainerReleaseOperation release =
- new ContainerReleaseOperation(instance.getId());
- opsList.add(release);
- //now apply the operations
- rmOperationHandler.execute(opsList);
+ queue(new ActionKillContainer(instance.getId(), 0, TimeUnit.MILLISECONDS));
Messages.KillContainerResponseProto.Builder builder =
Messages.KillContainerResponseProto.newBuilder();
builder.setSuccess(true);
return builder.build();
}
+ public void executeRMOperations(List<AbstractRMOperation> operations) {
+ rmOperationHandler.execute(operations);
+ }
+
@Override
public Messages.AMSuicideResponseProto amSuicide(
Messages.AMSuicideRequestProto request)
@@ -1462,7 +1469,8 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
String text = request.getText();
int delay = request.getDelay();
log.info("AM Suicide with signal {}, message {} delay = {}", signal, text, delay);
- ActionHalt action = new ActionHalt(signal, text, delay);
+ ActionHalt action = new ActionHalt(signal, text, delay,
+ TimeUnit.MILLISECONDS);
schedule(action);
return Messages.AMSuicideResponseProto.getDefaultInstance();
}
@@ -1537,7 +1545,7 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
containerId);
RoleInstance activeContainer = appState.getActiveContainer(containerId);
if (activeContainer != null) {
- rmOperationHandler.execute(appState.releaseContainer(containerId));
+ executeRMOperations(appState.releaseContainer(containerId));
// ask for more containers if needed
log.info("Container released; triggering review");
reviewRequestAndReleaseNodes();
@@ -1725,6 +1733,22 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
signalAMComplete(exitCode, exception.toString());
}
+ public boolean maybeStartMonkey() {
+ monkey = new ChaosMonkeyService(metrics, actionQueues);
+ int amKillProbability = 100;
+ int containerKillProbability = 200;
+ monkey.addTarget("AM killer",
+ new ChaosKillAM(this, actionQueues, -1),
+ amKillProbability);
+ monkey.addTarget("Container killer",
+ new ChaosKillContainer(this, actionQueues),
+ amKillProbability);
+ initAndAddService(monkey);
+ // and schedule it
+ schedule(monkey.getChaosAction(60, TimeUnit.SECONDS));
+ return true;
+ }
+
/**
* This is the main entry point for the service launcher.
* @param args command line arguments.
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionHalt.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionHalt.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionHalt.java
index b46a791..c21e249 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionHalt.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionHalt.java
@@ -22,6 +22,8 @@ import org.apache.hadoop.util.ExitUtil;
import org.apache.slider.server.appmaster.SliderAppMaster;
import org.apache.slider.server.appmaster.state.AppState;
+import java.util.concurrent.TimeUnit;
+
/**
* Exit a JVM halt.
* @see ExitUtil#halt(int, String)
@@ -34,7 +36,7 @@ public class ActionHalt extends AsyncAction {
public ActionHalt(
int status,
String text,
- long delay) {
+ long delay, TimeUnit timeUnit) {
super("Halt", delay, ActionAttributes.HALTS_CLUSTER);
this.status = status;
this.text = text;
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionKillContainer.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionKillContainer.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionKillContainer.java
new file mode 100644
index 0000000..7668bd5
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionKillContainer.java
@@ -0,0 +1,51 @@
+/*
+ * 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.slider.server.appmaster.actions;
+
+import org.apache.hadoop.yarn.api.records.ContainerId;
+import org.apache.slider.server.appmaster.SliderAppMaster;
+import org.apache.slider.server.appmaster.operations.AbstractRMOperation;
+import org.apache.slider.server.appmaster.operations.ContainerReleaseOperation;
+import org.apache.slider.server.appmaster.state.AppState;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+public class ActionKillContainer extends AsyncAction {
+
+ private final ContainerId containerId;
+
+ public ActionKillContainer(ContainerId containerId, long delay,
+ TimeUnit timeUnit) {
+ super("kill container", delay, timeUnit);
+ this.containerId = containerId;
+ }
+
+ @Override
+ public void execute(SliderAppMaster appMaster,
+ QueueAccess queueService,
+ AppState appState) throws Exception {
+ List<AbstractRMOperation> opsList = new LinkedList<>();
+ ContainerReleaseOperation release = new ContainerReleaseOperation(containerId);
+ opsList.add(release);
+ //now apply the operations
+ appMaster.executeRMOperations(opsList);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
index 779cca1..13bda57 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
@@ -18,18 +18,67 @@
package org.apache.slider.server.appmaster.monkey;
+import com.codahale.metrics.Counter;
+import com.codahale.metrics.MetricRegistry;
+import com.google.common.base.Preconditions;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
/**
* Entry in the chaos list
*/
public class ChaosEntry {
-
+
+ protected static final Logger log =
+ LoggerFactory.getLogger(ChaosEntry.class);
public final String name;
public final ChaosTarget target;
public final long probability;
- public ChaosEntry(String name, ChaosTarget target, long probability) {
+ private final MetricRegistry metrics;
+ private final Counter invocationCounter;
+
+
+ /**
+ * Constructor -includes validaton of all arguments
+ * @param name
+ * @param target
+ * @param probability
+ */
+ public ChaosEntry(String name, ChaosTarget target, long probability,
+ MetricRegistry metrics) {
+ Preconditions.checkArgument(!StringUtils.isEmpty(name), "missing name");
+ Preconditions.checkArgument(target != null, "null target");
+ Preconditions.checkArgument(probability > 0, "negative probability");
+ Preconditions.checkArgument(probability < 10000, "probability over 100%");
this.name = name;
this.target = target;
this.probability = probability;
+ this.metrics = metrics;
+ invocationCounter =
+ metrics.counter(MetricRegistry.name(ChaosEntry.class, name));
+ }
+
+ /**
+ * Trigger the chaos action
+ */
+ public void invokeChaos() {
+ log.info("Invoking {}", name);
+ invocationCounter.inc();
+ target.chaosAction();
+ }
+
+ /**
+ * Invoke Chaos if the trigger value is in range of the probability
+ * @param trigger trigger value, 0-10K
+ * @return true if the chaos method was invoked
+ */
+ public boolean maybeInvokeChaos(long trigger) {
+ if (probability < 0) {
+ invokeChaos();
+ return true;
+ }
+ return false;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillAM.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillAM.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillAM.java
new file mode 100644
index 0000000..c464ac3
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillAM.java
@@ -0,0 +1,48 @@
+/*
+ * 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.slider.server.appmaster.monkey;
+
+import org.apache.slider.server.appmaster.SliderAppMaster;
+import org.apache.slider.server.appmaster.actions.ActionHalt;
+import org.apache.slider.server.appmaster.actions.QueueAccess;
+
+import java.util.concurrent.TimeUnit;
+
+public class ChaosKillAM implements ChaosTarget {
+
+ private final SliderAppMaster appMaster;
+ private final QueueAccess queues;
+ private final int exitCode;
+
+ public ChaosKillAM(SliderAppMaster appMaster,
+ QueueAccess queues, int exitCode) {
+ this.appMaster = appMaster;
+ this.queues = queues;
+ this.exitCode = exitCode;
+ }
+
+ /**
+ * Trigger a delayed halt
+ */
+ @Override
+ public void chaosAction() {
+ queues.schedule(new ActionHalt(exitCode, "Chaos invoked halt", 1000,
+ TimeUnit.MILLISECONDS));
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillContainer.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillContainer.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillContainer.java
new file mode 100644
index 0000000..0ffcc8a
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillContainer.java
@@ -0,0 +1,68 @@
+/*
+ * 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.slider.server.appmaster.monkey;
+
+import org.apache.slider.server.appmaster.SliderAppMaster;
+import org.apache.slider.server.appmaster.actions.ActionKillContainer;
+import org.apache.slider.server.appmaster.actions.QueueAccess;
+import org.apache.slider.server.appmaster.state.RoleInstance;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Kill a container
+ */
+public class ChaosKillContainer implements ChaosTarget {
+ protected static final Logger log =
+ LoggerFactory.getLogger(ChaosKillContainer.class);
+ private final SliderAppMaster appMaster;
+ private final QueueAccess queues;
+ private final Random random = new Random();
+
+ public ChaosKillContainer(SliderAppMaster appMaster,
+ QueueAccess queues) {
+ this.appMaster = appMaster;
+ this.queues = queues;
+ }
+
+ /**
+ * Trigger a container kill halt
+ */
+
+ @Override
+ public void chaosAction() {
+ List<RoleInstance> liveContainers =
+ appMaster.getAppState().cloneLiveContainerInfoList();
+ int size = liveContainers.size();
+ if (size == 0) {
+ log.info("No containers to kill");
+ return;
+ }
+ int target = random.nextInt(size);
+ RoleInstance roleInstance = liveContainers.get(target);
+ log.info("Killing {}", roleInstance);
+
+ queues.schedule(new ActionKillContainer(roleInstance.getId(),
+ 100, TimeUnit.MILLISECONDS));
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
index 7c5638c..c525d02 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
@@ -19,15 +19,20 @@
package org.apache.slider.server.appmaster.monkey;
import com.codahale.metrics.MetricRegistry;
-import com.google.common.base.Preconditions;
import org.apache.hadoop.service.AbstractService;
+import org.apache.slider.server.appmaster.actions.AsyncAction;
import org.apache.slider.server.appmaster.actions.QueueAccess;
+import org.apache.slider.server.appmaster.actions.RenewingAction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.TimeUnit;
+/**
+ * A chaos monkey service which will invoke ChaosTarget events
+ */
public class ChaosMonkeyService extends AbstractService {
protected static final Logger log =
LoggerFactory.getLogger(ChaosMonkeyService.class);
@@ -36,25 +41,33 @@ public class ChaosMonkeyService extends AbstractService {
private static final List<ChaosEntry> chaosEntries =
new ArrayList<ChaosEntry>();
-
+
public ChaosMonkeyService(MetricRegistry metrics, QueueAccess queues) {
super("ChaosMonkeyService");
this.metrics = metrics;
this.queues = queues;
}
-
- @Override
- protected void serviceStart() throws Exception {
- super.serviceStart();
-
+
+ public synchronized void addTarget(String name,
+ ChaosTarget target,
+ long probability) {
+
+ chaosEntries.add(new ChaosEntry(name, target, probability, metrics));
+ }
+
+ public void play() {
+
}
-
-
- public synchronized void addTarget(ChaosTarget target, long probability) {
- Preconditions.checkArgument(target != null, "null target");
- Preconditions.checkArgument(probability > 0, "negative probability");
- Preconditions.checkArgument(probability > 10000, "probability over 100%");
+
+ public RenewingAction<MonkeyPlayAction> getChaosAction(long time, TimeUnit timeUnit) {
+ RenewingAction<MonkeyPlayAction> action = new RenewingAction<>(
+ new MonkeyPlayAction(this, 0, TimeUnit.MILLISECONDS),
+ time,
+ time,
+ timeUnit,
+ 0
+ );
+ return action;
}
-
}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/MonkeyPlayAction.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/MonkeyPlayAction.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/MonkeyPlayAction.java
new file mode 100644
index 0000000..20e4466
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/MonkeyPlayAction.java
@@ -0,0 +1,48 @@
+/*
+ * 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.slider.server.appmaster.monkey;
+
+import org.apache.slider.server.appmaster.SliderAppMaster;
+import org.apache.slider.server.appmaster.actions.AsyncAction;
+import org.apache.slider.server.appmaster.actions.QueueAccess;
+import org.apache.slider.server.appmaster.state.AppState;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Queueable action which calls {@link ChaosMonkeyService#play()} when
+ * executed.
+ */
+public class MonkeyPlayAction extends AsyncAction {
+
+ private final ChaosMonkeyService monkey;
+
+ public MonkeyPlayAction(ChaosMonkeyService monkey, long delay,
+ TimeUnit timeUnit) {
+ super("chaos monkey", delay, timeUnit);
+ this.monkey = monkey;
+ }
+
+ @Override
+ public void execute(SliderAppMaster appMaster,
+ QueueAccess queueService,
+ AppState appState) throws Exception {
+ monkey.play();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
index 48f97bb..d616678 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
@@ -101,7 +101,7 @@ public class AppState {
* Flag set to indicate the application is live -this only happens
* after the buildInstance operation
*/
- boolean applicationLive = false;
+ private boolean applicationLive = false;
/**
* The definition of the instance. Flexing updates the resources section
@@ -811,6 +811,10 @@ public class AppState {
return activeContainers.remove(id);
}
+ /**
+ * Clone the live container list. This is synchronized.
+ * @return a snapshot of the live node list
+ */
public synchronized List<RoleInstance> cloneLiveContainerInfoList() {
List<RoleInstance> allRoleInstances;
Collection<RoleInstance> values = getLiveNodes().values();
@@ -818,8 +822,12 @@ public class AppState {
return allRoleInstances;
}
-
-
+ /**
+ * Lookup live instance by string value of container ID
+ * @param containerId container ID
+ * @return the role instance for that container
+ * @throws NoSuchNodeException if it does not exist
+ */
public synchronized RoleInstance getLiveInstanceByContainerID(String containerId)
throws NoSuchNodeException {
Collection<RoleInstance> nodes = getLiveNodes().values();
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentAM.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentAM.groovy b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentAM.groovy
index 8498ee2..73e9b07 100644
--- a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentAM.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentAM.groovy
@@ -37,10 +37,10 @@ import org.junit.Test
@CompileStatic
@Slf4j
class TestStandaloneAgentAM extends AgentMiniClusterTestBase {
+
@Test
public void testStandaloneAgentAM() throws Throwable {
-
describe "create a masterless AM then get the service and look it up via the AM"
//launch fake master
[8/9] git commit: Merge branch 'feature/SLIDER-202_chaos_monkey' into
develop
Posted by sm...@apache.org.
Merge branch 'feature/SLIDER-202_chaos_monkey' into develop
Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/9b20e47b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/9b20e47b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/9b20e47b
Branch: refs/heads/feature/SLIDER-285_Restart_AM
Commit: 9b20e47b50d6e3f51467c0517f3b0d21242f1f17
Parents: d38b31a 53028ea
Author: Steve Loughran <st...@apache.org>
Authored: Wed Aug 13 18:10:32 2014 +0100
Committer: Steve Loughran <st...@apache.org>
Committed: Wed Aug 13 18:10:32 2014 +0100
----------------------------------------------------------------------
pom.xml | 8 +
slider-core/pom.xml | 46 +-----
.../api/ClusterDescriptionOperations.java | 12 +-
.../org/apache/slider/api/InternalKeys.java | 137 ++++++++++++++++
.../java/org/apache/slider/api/OptionKeys.java | 69 +-------
.../org/apache/slider/api/ResourceKeys.java | 26 +--
.../org/apache/slider/client/SliderClient.java | 7 +-
.../apache/slider/common/tools/SliderUtils.java | 8 +-
.../slider/core/build/InstanceBuilder.java | 3 +-
.../apache/slider/core/conf/MapOperations.java | 54 ++++++-
.../apache/slider/providers/ProviderUtils.java | 9 +-
.../providers/agent/AgentClientProvider.java | 8 +-
.../providers/agent/AgentProviderService.java | 7 +-
.../slideram/SliderAMClientProvider.java | 4 +-
.../server/appmaster/SliderAppMaster.java | 157 ++++++++++++------
.../server/appmaster/actions/ActionHalt.java | 4 +-
.../appmaster/actions/ActionKillContainer.java | 67 ++++++++
.../server/appmaster/actions/QueueService.java | 8 +-
.../server/appmaster/monkey/ChaosEntry.java | 86 ++++++++++
.../server/appmaster/monkey/ChaosKillAM.java | 48 ++++++
.../appmaster/monkey/ChaosKillContainer.java | 75 +++++++++
.../appmaster/monkey/ChaosMonkeyService.java | 86 ++++++++++
.../server/appmaster/monkey/ChaosTarget.java | 24 +++
.../appmaster/monkey/MonkeyPlayAction.java | 48 ++++++
.../slider/server/appmaster/state/AppState.java | 14 +-
.../TestStandaloneAMMonkeyRestart.groovy | 94 +++++++++++
.../standalone/TestStandaloneAgentAM.groovy | 2 +-
.../TestMockAppStateContainerFailure.groovy | 2 +-
.../TestMockAppStateDynamicRoles.groovy | 2 +-
.../TestMockAppStateFlexDynamicRoles.groovy | 2 +-
.../appstate/TestMockAppStateFlexing.groovy | 2 +-
.../TestMockAppStateRMOperations.groovy | 2 +-
.../TestMockAppStateRebuildOnAMRestart.groovy | 2 +-
.../TestMockAppStateRolePlacement.groovy | 2 +-
.../appstate/TestMockAppStateRoleRelease.groovy | 2 +-
.../TestMockContainerResourceAllocations.groovy | 2 +-
.../model/mock/BaseMockAppStateTest.groovy | 8 +-
.../model/mock/MockRMOperationHandler.groovy | 7 +-
.../model/monkey/TestMockMonkey.groovy | 160 +++++++++++++++++++
.../apache/slider/test/SliderTestBase.groovy | 7 +-
.../agent/TestAgentProviderService.java | 9 +-
.../accumulo/AccumuloClientProvider.java | 3 +-
.../accumulo/AccumuloProviderService.java | 9 +-
.../providers/hbase/HBaseClientProvider.java | 3 +-
.../providers/hbase/HBaseProviderService.java | 4 +-
.../TestRegionServerFailureThreshold.groovy | 5 +-
...reezeReconfigureThawLiveRegionService.groovy | 4 +-
47 files changed, 1097 insertions(+), 251 deletions(-)
----------------------------------------------------------------------
[9/9] git commit: Merge branch 'develop' into
feature/SLIDER-285_Restart_AM
Posted by sm...@apache.org.
Merge branch 'develop' into feature/SLIDER-285_Restart_AM
Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/eadb3c73
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/eadb3c73
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/eadb3c73
Branch: refs/heads/feature/SLIDER-285_Restart_AM
Commit: eadb3c731f84b9c807844ebbb66f64db33a7b5bc
Parents: 70519f7 9b20e47
Author: Sumit Mohanty <sm...@hortonworks.com>
Authored: Wed Aug 13 11:19:17 2014 -0700
Committer: Sumit Mohanty <sm...@hortonworks.com>
Committed: Wed Aug 13 11:19:17 2014 -0700
----------------------------------------------------------------------
pom.xml | 8 +
slider-core/pom.xml | 46 +-----
.../api/ClusterDescriptionOperations.java | 12 +-
.../org/apache/slider/api/InternalKeys.java | 137 ++++++++++++++++
.../java/org/apache/slider/api/OptionKeys.java | 69 +-------
.../org/apache/slider/api/ResourceKeys.java | 26 +--
.../org/apache/slider/client/SliderClient.java | 7 +-
.../apache/slider/common/tools/SliderUtils.java | 8 +-
.../slider/core/build/InstanceBuilder.java | 3 +-
.../apache/slider/core/conf/MapOperations.java | 54 ++++++-
.../apache/slider/providers/ProviderUtils.java | 9 +-
.../providers/agent/AgentClientProvider.java | 8 +-
.../providers/agent/AgentProviderService.java | 7 +-
.../slideram/SliderAMClientProvider.java | 4 +-
.../server/appmaster/SliderAppMaster.java | 157 ++++++++++++------
.../server/appmaster/actions/ActionHalt.java | 4 +-
.../appmaster/actions/ActionKillContainer.java | 67 ++++++++
.../server/appmaster/actions/QueueService.java | 8 +-
.../server/appmaster/monkey/ChaosEntry.java | 86 ++++++++++
.../server/appmaster/monkey/ChaosKillAM.java | 48 ++++++
.../appmaster/monkey/ChaosKillContainer.java | 75 +++++++++
.../appmaster/monkey/ChaosMonkeyService.java | 86 ++++++++++
.../server/appmaster/monkey/ChaosTarget.java | 24 +++
.../appmaster/monkey/MonkeyPlayAction.java | 48 ++++++
.../slider/server/appmaster/state/AppState.java | 14 +-
.../TestStandaloneAMMonkeyRestart.groovy | 94 +++++++++++
.../standalone/TestStandaloneAgentAM.groovy | 2 +-
.../TestMockAppStateContainerFailure.groovy | 2 +-
.../TestMockAppStateDynamicRoles.groovy | 2 +-
.../TestMockAppStateFlexDynamicRoles.groovy | 2 +-
.../appstate/TestMockAppStateFlexing.groovy | 2 +-
.../TestMockAppStateRMOperations.groovy | 2 +-
.../TestMockAppStateRebuildOnAMRestart.groovy | 2 +-
.../TestMockAppStateRolePlacement.groovy | 2 +-
.../appstate/TestMockAppStateRoleRelease.groovy | 2 +-
.../TestMockContainerResourceAllocations.groovy | 2 +-
.../model/mock/BaseMockAppStateTest.groovy | 8 +-
.../model/mock/MockRMOperationHandler.groovy | 7 +-
.../model/monkey/TestMockMonkey.groovy | 160 +++++++++++++++++++
.../apache/slider/test/SliderTestBase.groovy | 7 +-
.../agent/TestAgentProviderService.java | 9 +-
.../accumulo/AccumuloClientProvider.java | 3 +-
.../accumulo/AccumuloProviderService.java | 9 +-
.../providers/hbase/HBaseClientProvider.java | 3 +-
.../providers/hbase/HBaseProviderService.java | 4 +-
.../TestRegionServerFailureThreshold.groovy | 5 +-
...reezeReconfigureThawLiveRegionService.groovy | 4 +-
47 files changed, 1097 insertions(+), 251 deletions(-)
----------------------------------------------------------------------
[5/9] git commit: SLIDER-202: tweak mock tests to automatically get
name from test method unless overridden.
Posted by sm...@apache.org.
SLIDER-202: tweak mock tests to automatically get name from test method unless overridden.
Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/8ed52a90
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/8ed52a90
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/8ed52a90
Branch: refs/heads/feature/SLIDER-285_Restart_AM
Commit: 8ed52a90ef413931bf48e23a6d4565694a95bdb2
Parents: 1f6490d
Author: Steve Loughran <st...@apache.org>
Authored: Wed Aug 13 15:04:36 2014 +0100
Committer: Steve Loughran <st...@apache.org>
Committed: Wed Aug 13 15:04:36 2014 +0100
----------------------------------------------------------------------
.../model/appstate/TestMockAppStateContainerFailure.groovy | 2 +-
.../model/appstate/TestMockAppStateDynamicRoles.groovy | 2 +-
.../model/appstate/TestMockAppStateFlexDynamicRoles.groovy | 2 +-
.../appmaster/model/appstate/TestMockAppStateFlexing.groovy | 2 +-
.../model/appstate/TestMockAppStateRMOperations.groovy | 2 +-
.../model/appstate/TestMockAppStateRebuildOnAMRestart.groovy | 2 +-
.../model/appstate/TestMockAppStateRolePlacement.groovy | 2 +-
.../model/appstate/TestMockAppStateRoleRelease.groovy | 2 +-
.../appstate/TestMockContainerResourceAllocations.groovy | 2 +-
.../server/appmaster/model/mock/BaseMockAppStateTest.groovy | 8 +++++++-
10 files changed, 16 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateContainerFailure.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateContainerFailure.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateContainerFailure.groovy
index c0f41f4..068b876 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateContainerFailure.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateContainerFailure.groovy
@@ -43,7 +43,7 @@ class TestMockAppStateContainerFailure extends BaseMockAppStateTest
@Override
String getTestName() {
- return "TestAppStateContainerFailure"
+ return "TestMockAppStateContainerFailure"
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateDynamicRoles.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateDynamicRoles.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateDynamicRoles.groovy
index 1b01f76..136e1ea 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateDynamicRoles.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateDynamicRoles.groovy
@@ -42,7 +42,7 @@ class TestMockAppStateDynamicRoles extends BaseMockAppStateTest
@Override
String getTestName() {
- return "TestAppStateDynamicRoles"
+ return "TestMockAppStateDynamicRoles"
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexDynamicRoles.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexDynamicRoles.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexDynamicRoles.groovy
index aa330f8..5c9dce9 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexDynamicRoles.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexDynamicRoles.groovy
@@ -44,7 +44,7 @@ class TestMockAppStateFlexDynamicRoles extends BaseMockAppStateTest
@Override
String getTestName() {
- return "TestAppStateDynamicRoles"
+ return "TestMockAppStateFlexDynamicRoles"
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexing.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexing.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexing.groovy
index 80937dc..a7bf068 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexing.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexing.groovy
@@ -33,7 +33,7 @@ class TestMockAppStateFlexing extends BaseMockAppStateTest implements MockRoles
@Override
String getTestName() {
- return "TestMockFlexing"
+ return "TestMockAppStateFlexing"
}
@Test
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRMOperations.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRMOperations.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRMOperations.groovy
index 6a5df5c..f8e852e 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRMOperations.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRMOperations.groovy
@@ -40,7 +40,7 @@ class TestMockAppStateRMOperations extends BaseMockAppStateTest implements MockR
@Override
String getTestName() {
- return "TestMockRMOperations"
+ return "TestMockAppStateRMOperations"
}
@Test
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRebuildOnAMRestart.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRebuildOnAMRestart.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRebuildOnAMRestart.groovy
index c142c77..c2783f3 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRebuildOnAMRestart.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRebuildOnAMRestart.groovy
@@ -40,7 +40,7 @@ class TestMockAppStateRebuildOnAMRestart extends BaseMockAppStateTest
@Override
String getTestName() {
- return "TestAppStateRebuildOnAMRestart"
+ return "TestMockAppStateRebuildOnAMRestart"
}
@Test
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRolePlacement.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRolePlacement.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRolePlacement.groovy
index e7ddf79..17ebc31 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRolePlacement.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRolePlacement.groovy
@@ -43,7 +43,7 @@ class TestMockAppStateRolePlacement extends BaseMockAppStateTest
@Override
String getTestName() {
- return "TestAppStateRolePlacement"
+ return "TestMockAppStateRolePlacement"
}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRoleRelease.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRoleRelease.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRoleRelease.groovy
index de4d493..addfaa5 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRoleRelease.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRoleRelease.groovy
@@ -38,7 +38,7 @@ class TestMockAppStateRoleRelease extends BaseMockAppStateTest
@Override
String getTestName() {
- return "TestAppStateRolePlacement"
+ return "TestMockAppStateRoleRelease"
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockContainerResourceAllocations.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockContainerResourceAllocations.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockContainerResourceAllocations.groovy
index 0bf9a90..73d40ee 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockContainerResourceAllocations.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockContainerResourceAllocations.groovy
@@ -39,7 +39,7 @@ class TestMockContainerResourceAllocations extends BaseMockAppStateTest {
@Override
String getTestName() {
- "TestContainerResourceAllocations"
+ "TestMockContainerResourceAllocations"
}
@Test
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/BaseMockAppStateTest.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/BaseMockAppStateTest.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/BaseMockAppStateTest.groovy
index 289b7c5..f96a238 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/BaseMockAppStateTest.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/BaseMockAppStateTest.groovy
@@ -101,7 +101,13 @@ abstract class BaseMockAppStateTest extends SliderTestBase implements MockRoles
factory.newInstanceDefinition(0, 0, 0)
}
- abstract String getTestName();
+ /**
+ * Get the test name ... defaults to method name
+ * @return
+ */
+ String getTestName() {
+ methodName.methodName;
+ }
public RoleStatus getRole0Status() {
return appState.lookupRoleStatus(ROLE0)
[7/9] git commit: SLIDER-202: Chaos Monkey adds a (slow) minicluster
test.
Posted by sm...@apache.org.
SLIDER-202: Chaos Monkey adds a (slow) minicluster test.
Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/53028eaa
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/53028eaa
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/53028eaa
Branch: refs/heads/feature/SLIDER-285_Restart_AM
Commit: 53028eaae347899cef9e695e9ee8b41594c6377b
Parents: 52bd11b
Author: Steve Loughran <st...@apache.org>
Authored: Wed Aug 13 17:30:49 2014 +0100
Committer: Steve Loughran <st...@apache.org>
Committed: Wed Aug 13 17:30:49 2014 +0100
----------------------------------------------------------------------
.../org/apache/slider/api/InternalKeys.java | 49 +++++++---
.../apache/slider/common/tools/SliderUtils.java | 2 +-
.../server/appmaster/SliderAppMaster.java | 39 ++++----
.../TestStandaloneAMMonkeyRestart.groovy | 94 ++++++++++++++++++++
.../TestRegionServerFailureThreshold.groovy | 5 +-
5 files changed, 154 insertions(+), 35 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/53028eaa/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java b/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java
index 4045c0e..ad384e2 100644
--- a/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java
+++ b/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java
@@ -84,31 +84,54 @@ public interface InternalKeys {
* Flag to indicate whether or not the chaos monkey is enabled:
* {@value}
*/
- String INTERNAL_CHAOS_MONKEY_ENABLED = "internal.chaos.monkey.enabled";
- boolean DEFAULT_INTERNAL_CHAOS_MONKEY_ENABLED = false;
+ String CHAOS_MONKEY_ENABLED = "internal.chaos.monkey.enabled";
+ boolean DEFAULT_CHAOS_MONKEY_ENABLED = false;
/**
* Rate
*/
- String INTERNAL_CHAOS_MONKEY_RATE = "internal.chaos.monkey.rate";
-
- int DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_DAYS = 0;
- int DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_HOURS = 1;
- int DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_MINUTES = 0;
+ String CHAOS_MONKEY_INTERVAL = "internal.chaos.monkey.interval";
+ String CHAOS_MONKEY_INTERVAL_DAYS = CHAOS_MONKEY_INTERVAL + ".days";
+ String CHAOS_MONKEY_INTERVAL_HOURS = CHAOS_MONKEY_INTERVAL + ".hours";
+ String CHAOS_MONKEY_INTERVAL_MINUTES = CHAOS_MONKEY_INTERVAL + ".minutes";
+ String CHAOS_MONKEY_INTERVAL_SECONDS = CHAOS_MONKEY_INTERVAL + ".seconds";
- String INTERNAL_CHAOS_MONKEY_PROBABILITY =
+ int DEFAULT_CHAOS_MONKEY_INTERVAL_DAYS = 0;
+ int DEFAULT_CHAOS_MONKEY_INTERVAL_HOURS = 0;
+ int DEFAULT_CHAOS_MONKEY_INTERVAL_MINUTES = 0;
+
+ /**
+ * Prefix for all chaos monkey probabilities
+ */
+ String CHAOS_MONKEY_PROBABILITY =
"internal.chaos.monkey.probability";
/**
* Probabilies are out of 10000 ; 100==1%
*/
- String INTERNAL_CHAOS_MONKEY_PROBABILITY_AM_FAILURE = INTERNAL_CHAOS_MONKEY_PROBABILITY +".amfailure";
- int DEFAULT_CHAOS_MONKEY_PROBABILITY_AM_FAILURE = 10;
- String INTERNAL_CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE =
- INTERNAL_CHAOS_MONKEY_PROBABILITY + ".containerfailure";
- int DEFAULT_CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE = 100;
+ /**
+ * Probability of a monkey check killing the AM: {@value}
+ */
+ String CHAOS_MONKEY_PROBABILITY_AM_FAILURE = CHAOS_MONKEY_PROBABILITY +".amfailure";
+
+ /**
+ * Default probability of a monkey check killing the AM: {@value}
+ */
+ int DEFAULT_CHAOS_MONKEY_PROBABILITY_AM_FAILURE = 0;
+
+ /**
+ * Probability of a monkey check killing a container: {@value}
+ */
+
+ String CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE =
+ CHAOS_MONKEY_PROBABILITY + ".containerfailure";
+
+ /**
+ * Default probability of a monkey check killing the a container: {@value}
+ */
+ int DEFAULT_CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE = 0;
}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/53028eaa/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java b/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java
index d7f159c..7a80f24 100644
--- a/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java
+++ b/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java
@@ -1476,7 +1476,7 @@ public final class SliderUtils {
}
is = new ByteArrayInputStream(content);
} else {
- log.info("Size unknown. Reading {}", zipEntry.getName());
+ log.debug("Size unknown. Reading {}", zipEntry.getName());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while (true) {
int byteRead = zis.read();
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/53028eaa/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
index 1642cc5..7825e24 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
@@ -779,17 +779,16 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
// now do the registration
registerServiceInstance(clustername, appid);
- sliderAMProvider.start();
+ // chaos monkey
+ maybeStartMonkey();
+ // Start the Slider AM provider
+ sliderAMProvider.start();
-
- // launch the provider; this is expected to trigger a callback that
+ // launch the real provider; this is expected to trigger a callback that
// starts the node review process
launchProviderService(instanceDefinition, confDir);
- // chaos monkey
- maybeStartMonkey();
-
try {
//now block waiting to be told to exit the process
waitForAMCompletionSignal();
@@ -1459,7 +1458,6 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
rmOperationHandler.execute(operations);
}
-
/**
* Get the RM operations handler for direct scheduling of work.
*/
@@ -1739,42 +1737,45 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
}
signalAMComplete(exitCode, exception.toString());
}
-
- public boolean maybeStartMonkey() {
+
+ /**
+ * Start the chaos monkey
+ * @return true if it started
+ */
+ private boolean maybeStartMonkey() {
MapOperations internals = getGlobalInternalOptions();
Boolean enabled =
- internals.getOptionBool(InternalKeys.INTERNAL_CHAOS_MONKEY_ENABLED,
- InternalKeys.DEFAULT_INTERNAL_CHAOS_MONKEY_ENABLED);
+ internals.getOptionBool(InternalKeys.CHAOS_MONKEY_ENABLED,
+ InternalKeys.DEFAULT_CHAOS_MONKEY_ENABLED);
if (!enabled) {
log.info("Chaos monkey disabled");
}
long monkeyInterval = internals.getTimeRange(
- InternalKeys.INTERNAL_CHAOS_MONKEY_RATE,
- InternalKeys.DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_DAYS,
- InternalKeys.DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_HOURS,
- InternalKeys.DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_MINUTES,
+ InternalKeys.CHAOS_MONKEY_INTERVAL,
+ InternalKeys.DEFAULT_CHAOS_MONKEY_INTERVAL_DAYS,
+ InternalKeys.DEFAULT_CHAOS_MONKEY_INTERVAL_HOURS,
+ InternalKeys.DEFAULT_CHAOS_MONKEY_INTERVAL_MINUTES,
0);
log.info("Adding Chaos Monkey scheduled every {} seconds ({} hours)",
monkeyInterval, monkeyInterval/(60*60));
monkey = new ChaosMonkeyService(metrics, actionQueues);
int amKillProbability = internals.getOptionInt(
- InternalKeys.INTERNAL_CHAOS_MONKEY_PROBABILITY_AM_FAILURE,
+ InternalKeys.CHAOS_MONKEY_PROBABILITY_AM_FAILURE,
InternalKeys.DEFAULT_CHAOS_MONKEY_PROBABILITY_AM_FAILURE);
if (amKillProbability > 0) {
- log.info("Adding AM killer with probability %f", amKillProbability/100.0);
monkey.addTarget("AM killer",
new ChaosKillAM(actionQueues, -1), amKillProbability
);
}
int containerKillProbability = internals.getOptionInt(
- InternalKeys.INTERNAL_CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE,
+ InternalKeys.CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE,
InternalKeys.DEFAULT_CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE);
if (containerKillProbability > 0) {
monkey.addTarget("Container killer",
new ChaosKillContainer(appState, actionQueues, rmOperationHandler),
- amKillProbability
+ containerKillProbability
);
}
initAndAddService(monkey);
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/53028eaa/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAMMonkeyRestart.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAMMonkeyRestart.groovy b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAMMonkeyRestart.groovy
new file mode 100644
index 0000000..162bab0
--- /dev/null
+++ b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAMMonkeyRestart.groovy
@@ -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.slider.agent.standalone
+
+import groovy.transform.CompileStatic
+import groovy.util.logging.Slf4j
+import org.apache.hadoop.SleepJob
+import org.apache.hadoop.yarn.api.records.ApplicationReport
+import org.apache.hadoop.yarn.api.records.FinalApplicationStatus
+import org.apache.hadoop.yarn.api.records.YarnApplicationState
+import org.apache.hadoop.yarn.conf.YarnConfiguration
+import org.apache.slider.agent.AgentMiniClusterTestBase
+import org.apache.slider.api.InternalKeys
+import org.apache.slider.api.ResourceKeys
+import org.apache.slider.client.SliderClient
+import org.apache.slider.common.SliderXmlConfKeys
+import org.apache.slider.common.params.ActionAMSuicideArgs
+import org.apache.slider.common.params.Arguments
+import org.apache.slider.core.exceptions.ErrorStrings
+import org.apache.slider.core.main.ServiceLauncher
+import org.junit.Test
+
+/**
+ * kill a masterless AM and verify it shuts down. This test
+ * also sets the retry count to 1 to stop recreation attempts
+ */
+@CompileStatic
+@Slf4j
+
+class TestStandaloneAMMonkeyRestart extends AgentMiniClusterTestBase {
+
+
+ @Test
+ public void testStandaloneAMMonkeyRestart() throws Throwable {
+ describe "Run a Standalone AM with the Chaos monkey set to kill it"
+ // patch the configuration for AM restart
+ int threshold = 2;
+ YarnConfiguration conf = getRestartableConfiguration(threshold)
+
+ String clustername = createMiniCluster("", conf, 1, true)
+ ServiceLauncher<SliderClient> launcher =
+ createStandaloneAMWithArgs(clustername,
+ [
+ Arguments.ARG_OPTION, InternalKeys.CHAOS_MONKEY_ENABLED, "true",
+ Arguments.ARG_OPTION, InternalKeys.CHAOS_MONKEY_INTERVAL_SECONDS, "8",
+ Arguments.ARG_OPTION, InternalKeys.CHAOS_MONKEY_PROBABILITY_AM_FAILURE, "75000",
+ ],
+ true,
+ false)
+ SliderClient sliderClient = launcher.service
+ addToTeardown(sliderClient);
+
+ ApplicationReport report
+ report = waitForClusterLive(sliderClient, 30000)
+ describe "Waiting for the cluster to fail"
+ sleep(40000)
+ // end of process
+ report = sliderClient.applicationReport
+ log.info(report.diagnostics)
+ assert report.currentApplicationAttemptId.attemptId == threshold
+ assert YarnApplicationState.FAILED == report.yarnApplicationState
+ assert FinalApplicationStatus.FAILED == report.finalApplicationStatus
+ }
+
+ /**
+ * Get a restartable configuration
+ * @param restarts
+ * @return
+ */
+ public YarnConfiguration getRestartableConfiguration(int restarts) {
+ def conf = new YarnConfiguration(configuration)
+ conf.setInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS, restarts)
+ conf.setInt(SliderXmlConfKeys.KEY_AM_RESTART_LIMIT, restarts)
+ conf
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/53028eaa/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/failures/TestRegionServerFailureThreshold.groovy
----------------------------------------------------------------------
diff --git a/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/failures/TestRegionServerFailureThreshold.groovy b/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/failures/TestRegionServerFailureThreshold.groovy
index 1322fd3..b3aaa48 100644
--- a/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/failures/TestRegionServerFailureThreshold.groovy
+++ b/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/failures/TestRegionServerFailureThreshold.groovy
@@ -149,8 +149,9 @@ class TestRegionServerFailureThreshold extends HBaseMiniClusterTestBase {
}
}
} catch (BadClusterStateException e) {
- assert e.toString().contains(ErrorStrings.E_APPLICATION_NOT_RUNNING)
- assert e.exitCode == SliderExitCodes.EXIT_BAD_STATE
+ assertExceptionDetails(e,
+ SliderExitCodes.EXIT_BAD_STATE,
+ ErrorStrings.E_APPLICATION_NOT_RUNNING)
}
ApplicationReport report = client.applicationReport
log.info(report.diagnostics)
[4/9] git commit: SLIDER-314 factor out internal keys into class
InternalKeys
Posted by sm...@apache.org.
SLIDER-314 factor out internal keys into class InternalKeys
Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/1f6490d5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/1f6490d5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/1f6490d5
Branch: refs/heads/feature/SLIDER-285_Restart_AM
Commit: 1f6490d5f6ec8d73f5cdb6f04600aa180be25b81
Parents: b111268
Author: Steve Loughran <st...@apache.org>
Authored: Wed Aug 13 15:03:34 2014 +0100
Committer: Steve Loughran <st...@apache.org>
Committed: Wed Aug 13 15:03:34 2014 +0100
----------------------------------------------------------------------
.../api/ClusterDescriptionOperations.java | 12 +-
.../org/apache/slider/api/InternalKeys.java | 114 +++++++++++++++++++
.../java/org/apache/slider/api/OptionKeys.java | 69 +----------
.../org/apache/slider/client/SliderClient.java | 7 +-
.../slider/core/build/InstanceBuilder.java | 3 +-
.../apache/slider/providers/ProviderUtils.java | 9 +-
.../slideram/SliderAMClientProvider.java | 4 +-
.../server/appmaster/SliderAppMaster.java | 22 ++--
.../agent/TestAgentProviderService.java | 9 +-
.../accumulo/AccumuloClientProvider.java | 3 +-
.../accumulo/AccumuloProviderService.java | 9 +-
.../providers/hbase/HBaseClientProvider.java | 3 +-
.../providers/hbase/HBaseProviderService.java | 4 +-
...reezeReconfigureThawLiveRegionService.groovy | 4 +-
14 files changed, 166 insertions(+), 106 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-core/src/main/java/org/apache/slider/api/ClusterDescriptionOperations.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/api/ClusterDescriptionOperations.java b/slider-core/src/main/java/org/apache/slider/api/ClusterDescriptionOperations.java
index 7e73a92..21ece2b 100644
--- a/slider-core/src/main/java/org/apache/slider/api/ClusterDescriptionOperations.java
+++ b/slider-core/src/main/java/org/apache/slider/api/ClusterDescriptionOperations.java
@@ -64,15 +64,15 @@ public class ClusterDescriptionOperations {
MapOperations appOptions =
aggregateConf.getAppConfOperations().getGlobalOptions();
- cd.type = internalOptions.getOption(OptionKeys.INTERNAL_PROVIDER_NAME,
+ cd.type = internalOptions.getOption(InternalKeys.INTERNAL_PROVIDER_NAME,
SliderProviderFactory.DEFAULT_CLUSTER_TYPE);
- cd.dataPath = internalOptions.get(OptionKeys.INTERNAL_DATA_DIR_PATH);
+ cd.dataPath = internalOptions.get(InternalKeys.INTERNAL_DATA_DIR_PATH);
cd.name = internalOptions.get(OptionKeys.APPLICATION_NAME);
- cd.originConfigurationPath = internalOptions.get(OptionKeys.INTERNAL_SNAPSHOT_CONF_PATH);
- cd.generatedConfigurationPath = internalOptions.get(OptionKeys.INTERNAL_GENERATED_CONF_PATH);
- cd.setImagePath(internalOptions.get(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH));
- cd.setApplicationHome(internalOptions.get(OptionKeys.INTERNAL_APPLICATION_HOME));
+ cd.originConfigurationPath = internalOptions.get(InternalKeys.INTERNAL_SNAPSHOT_CONF_PATH);
+ cd.generatedConfigurationPath = internalOptions.get(InternalKeys.INTERNAL_GENERATED_CONF_PATH);
+ cd.setImagePath(internalOptions.get(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH));
+ cd.setApplicationHome(internalOptions.get(InternalKeys.INTERNAL_APPLICATION_HOME));
cd.setZkPath(appOptions.get(ZOOKEEPER_PATH));
cd.setZkHosts(appOptions.get(ZOOKEEPER_QUORUM));
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java b/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java
new file mode 100644
index 0000000..4045c0e
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java
@@ -0,0 +1,114 @@
+/*
+ * 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.slider.api;
+
+/**
+ * Keys for internal use, go into `internal.json` and not intended for normal
+ * use except when tuning Slider AM operations
+ */
+public interface InternalKeys {
+
+
+ /**
+ * Home dir of the app: {@value}
+ * If set, implies there is a home dir to use
+ */
+ String INTERNAL_APPLICATION_HOME = "internal.application.home";
+ /**
+ * Path to an image file containing the app: {@value}
+ */
+ String INTERNAL_APPLICATION_IMAGE_PATH = "internal.application.image.path";
+ /**
+ * Time in milliseconds to wait after forking any in-AM
+ * process before attempting to start up the containers: {@value}
+ *
+ * A shorter value brings the cluster up faster, but means that if the
+ * in AM process fails (due to a bad configuration), then time
+ * is wasted starting containers on a cluster that isn't going to come
+ * up
+ */
+ String INTERNAL_CONTAINER_STARTUP_DELAY = "internal.container.startup.delay";
+ /**
+ * internal temp directory: {@value}
+ */
+ String INTERNAL_AM_TMP_DIR = "internal.tmp.dir";
+ /**
+ * where a snapshot of the original conf dir is: {@value}
+ */
+ String INTERNAL_SNAPSHOT_CONF_PATH = "internal.snapshot.conf.path";
+ /**
+ * where a snapshot of the original conf dir is: {@value}
+ */
+ String INTERNAL_GENERATED_CONF_PATH = "internal.generated.conf.path";
+ /**
+ * where a snapshot of the original conf dir is: {@value}
+ */
+ String INTERNAL_PROVIDER_NAME = "internal.provider.name";
+ /**
+ * where a snapshot of the original conf dir is: {@value}
+ */
+ String INTERNAL_DATA_DIR_PATH = "internal.data.dir.path";
+ /**
+ * Time in milliseconds to wait after forking any in-AM
+ * process before attempting to start up the containers: {@value}
+ *
+ * A shorter value brings the cluster up faster, but means that if the
+ * in AM process fails (due to a bad configuration), then time
+ * is wasted starting containers on a cluster that isn't going to come
+ * up
+ */
+ int DEFAULT_INTERNAL_CONTAINER_STARTUP_DELAY = 5000;
+ /**
+ * Version of the app: {@value}
+ */
+ String KEYTAB_LOCATION = "internal.keytab.location";
+
+
+ /**
+ * Flag to indicate whether or not the chaos monkey is enabled:
+ * {@value}
+ */
+ String INTERNAL_CHAOS_MONKEY_ENABLED = "internal.chaos.monkey.enabled";
+ boolean DEFAULT_INTERNAL_CHAOS_MONKEY_ENABLED = false;
+
+
+ /**
+ * Rate
+ */
+
+ String INTERNAL_CHAOS_MONKEY_RATE = "internal.chaos.monkey.rate";
+
+ int DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_DAYS = 0;
+ int DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_HOURS = 1;
+ int DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_MINUTES = 0;
+
+ String INTERNAL_CHAOS_MONKEY_PROBABILITY =
+ "internal.chaos.monkey.probability";
+ /**
+ * Probabilies are out of 10000 ; 100==1%
+ */
+
+ String INTERNAL_CHAOS_MONKEY_PROBABILITY_AM_FAILURE = INTERNAL_CHAOS_MONKEY_PROBABILITY +".amfailure";
+ int DEFAULT_CHAOS_MONKEY_PROBABILITY_AM_FAILURE = 10;
+ String INTERNAL_CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE =
+ INTERNAL_CHAOS_MONKEY_PROBABILITY + ".containerfailure";
+ int DEFAULT_CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE = 100;
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-core/src/main/java/org/apache/slider/api/OptionKeys.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/api/OptionKeys.java b/slider-core/src/main/java/org/apache/slider/api/OptionKeys.java
index 006e280..320cc4f 100644
--- a/slider-core/src/main/java/org/apache/slider/api/OptionKeys.java
+++ b/slider-core/src/main/java/org/apache/slider/api/OptionKeys.java
@@ -22,18 +22,7 @@ package org.apache.slider.api;
* Keys for entries in the <code>options</code> section
* of a cluster description.
*/
-public interface OptionKeys {
-
- /**
- * Home dir of the app: {@value}
- * If set, implies there is a home dir to use
- */
- String INTERNAL_APPLICATION_HOME = "internal.application.home";
-
- /**
- * Path to an image file containing the app: {@value}
- */
- String INTERNAL_APPLICATION_IMAGE_PATH = "internal.application.image.path";
+public interface OptionKeys extends InternalKeys {
/**
* Time in milliseconds to wait after forking any in-AM
@@ -44,72 +33,18 @@ public interface OptionKeys {
* is wasted starting containers on a cluster that isn't going to come
* up
*/
- String INTERNAL_CONTAINER_STARTUP_DELAY = "internal.container.startup.delay";
-
- /**
- * Time in milliseconds to wait after forking any in-AM
- * process before attempting to start up the containers: {@value}
- *
- * A shorter value brings the cluster up faster, but means that if the
- * in AM process fails (due to a bad configuration), then time
- * is wasted starting containers on a cluster that isn't going to come
- * up
- */
String APPLICATION_TYPE = "application.type";
- /**
- * Time in milliseconds to wait after forking any in-AM
- * process before attempting to start up the containers: {@value}
- *
- * A shorter value brings the cluster up faster, but means that if the
- * in AM process fails (due to a bad configuration), then time
- * is wasted starting containers on a cluster that isn't going to come
- * up
- */
- String APPLICATION_NAME = "application.name";
-
- /**
- * delay for container startup:{@value}
- */
- int DEFAULT_CONTAINER_STARTUP_DELAY = 5000;
- /**
- * Version of the app: {@value}
- */
- String KEYTAB_LOCATION = "internal.keytab.location";
+ String APPLICATION_NAME = "application.name";
/**
* Prefix for site.xml options: {@value}
*/
String SITE_XML_PREFIX = "site.";
- /**
- * internal temp directory: {@value}
- */
- String INTERNAL_AM_TMP_DIR = "internal.tmp.dir";
/**
- * where a snapshot of the original conf dir is: {@value}
- */
- String INTERNAL_SNAPSHOT_CONF_PATH = "internal.snapshot.conf.path";
-
- /**
- * where a snapshot of the original conf dir is: {@value}
- */
- String INTERNAL_GENERATED_CONF_PATH = "internal.generated.conf.path";
-
- /**
- * where a snapshot of the original conf dir is: {@value}
- */
- String INTERNAL_PROVIDER_NAME = "internal.provider.name";
-
-
- /**
- * where a snapshot of the original conf dir is: {@value}
- */
- String INTERNAL_DATA_DIR_PATH = "internal.data.dir.path";
-
- /**
* Zookeeper quorum host list: {@value}
*/
String ZOOKEEPER_QUORUM = "zookeeper.quorum";
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/client/SliderClient.java b/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
index 03f78be..1337570 100644
--- a/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
+++ b/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
@@ -35,6 +35,7 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.apache.hadoop.yarn.exceptions.YarnException;
import org.apache.slider.api.ClusterDescription;
import org.apache.slider.api.ClusterNode;
+import org.apache.slider.api.InternalKeys;
import org.apache.slider.api.OptionKeys;
import org.apache.slider.api.ResourceKeys;
import org.apache.slider.api.SliderClusterProtocol;
@@ -793,16 +794,16 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe
instanceDefinition.getAppConfOperations();
Path generatedConfDirPath =
createPathThatMustExist(internalOptions.getMandatoryOption(
- OptionKeys.INTERNAL_GENERATED_CONF_PATH));
+ InternalKeys.INTERNAL_GENERATED_CONF_PATH));
Path snapshotConfPath =
createPathThatMustExist(internalOptions.getMandatoryOption(
- OptionKeys.INTERNAL_SNAPSHOT_CONF_PATH));
+ InternalKeys.INTERNAL_SNAPSHOT_CONF_PATH));
// cluster Provider
AbstractClientProvider provider = createClientProvider(
internalOptions.getMandatoryOption(
- OptionKeys.INTERNAL_PROVIDER_NAME));
+ InternalKeys.INTERNAL_PROVIDER_NAME));
// make sure the conf dir is valid;
// now build up the image path
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-core/src/main/java/org/apache/slider/core/build/InstanceBuilder.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/build/InstanceBuilder.java b/slider-core/src/main/java/org/apache/slider/core/build/InstanceBuilder.java
index 0a33c36..937b777 100644
--- a/slider-core/src/main/java/org/apache/slider/core/build/InstanceBuilder.java
+++ b/slider-core/src/main/java/org/apache/slider/core/build/InstanceBuilder.java
@@ -24,6 +24,7 @@ import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.permission.FsPermission;
import org.apache.hadoop.hdfs.DFSConfigKeys;
+import org.apache.slider.api.InternalKeys;
import org.apache.slider.api.OptionKeys;
import org.apache.slider.api.StatusKeys;
import org.apache.slider.common.SliderXmlConfKeys;
@@ -139,7 +140,7 @@ public class InstanceBuilder {
instancePaths.dataPath.toUri());
- internalOps.set(OptionKeys.INTERNAL_PROVIDER_NAME, provider);
+ internalOps.set(InternalKeys.INTERNAL_PROVIDER_NAME, provider);
internalOps.set(OptionKeys.APPLICATION_NAME, clustername);
}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-core/src/main/java/org/apache/slider/providers/ProviderUtils.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/ProviderUtils.java b/slider-core/src/main/java/org/apache/slider/providers/ProviderUtils.java
index cb7d27a..db9f494 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/ProviderUtils.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/ProviderUtils.java
@@ -23,6 +23,7 @@ import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.yarn.api.ApplicationConstants;
import org.apache.hadoop.yarn.api.records.LocalResource;
import org.apache.slider.api.ClusterDescription;
+import org.apache.slider.api.InternalKeys;
import org.apache.slider.api.OptionKeys;
import org.apache.slider.api.ResourceKeys;
import org.apache.slider.api.RoleKeys;
@@ -282,9 +283,9 @@ public class ProviderUtils implements RoleKeys {
MapOperations globalOptions =
instanceDefinition.getInternalOperations().getGlobalOptions();
String applicationHome =
- globalOptions.get(OptionKeys.INTERNAL_APPLICATION_HOME);
+ globalOptions.get(InternalKeys.INTERNAL_APPLICATION_HOME);
String imagePath =
- globalOptions.get(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH);
+ globalOptions.get(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH);
return buildPathToHomeDir(imagePath, applicationHome, bindir, script);
}
@@ -350,8 +351,8 @@ public class ProviderUtils implements RoleKeys {
String script) throws FileNotFoundException {
String homedir = buildPathToHomeDir(
- internal.get(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH),
- internal.get(OptionKeys.INTERNAL_APPLICATION_HOME),
+ internal.get(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH),
+ internal.get(InternalKeys.INTERNAL_APPLICATION_HOME),
bindir,
script);
return buildScriptPath(bindir, script, homedir);
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-core/src/main/java/org/apache/slider/providers/slideram/SliderAMClientProvider.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/slideram/SliderAMClientProvider.java b/slider-core/src/main/java/org/apache/slider/providers/slideram/SliderAMClientProvider.java
index 6aeb801..c3870b8 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/slideram/SliderAMClientProvider.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/slideram/SliderAMClientProvider.java
@@ -28,7 +28,7 @@ import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.yarn.api.records.LocalResource;
import org.apache.hadoop.yarn.api.records.Resource;
-import org.apache.slider.api.OptionKeys;
+import org.apache.slider.api.InternalKeys;
import org.apache.slider.api.ResourceKeys;
import org.apache.slider.api.RoleKeys;
import org.apache.slider.common.SliderKeys;
@@ -123,7 +123,7 @@ public class SliderAMClientProvider extends AbstractClientProvider implements
dataPath = instanceDefinition.getInternalOperations()
.getGlobalOptions()
.getMandatoryOption(
- OptionKeys.INTERNAL_DATA_DIR_PATH);
+ InternalKeys.INTERNAL_DATA_DIR_PATH);
Path path = new Path(dataPath);
sliderFileSystem.verifyDirectoryWriteAccess(path);
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
index ee0e59e..e6c7aba 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
@@ -56,7 +56,7 @@ import org.apache.hadoop.yarn.security.client.ClientToAMTokenSecretManager;
import org.apache.hadoop.yarn.util.ConverterUtils;
import org.apache.hadoop.yarn.webapp.WebApps;
import org.apache.slider.api.ClusterDescription;
-import org.apache.slider.api.OptionKeys;
+import org.apache.slider.api.InternalKeys;
import org.apache.slider.api.ResourceKeys;
import org.apache.slider.api.RoleKeys;
import org.apache.slider.api.SliderClusterProtocol;
@@ -529,10 +529,9 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
serviceConf.set(SliderAmIpFilter.WS_CONTEXT_ROOT, WS_CONTEXT_ROOT + "|" + WS_AGENT_CONTEXT_ROOT);
//get our provider
- MapOperations globalInternalOptions =
- instanceDefinition.getInternalOperations().getGlobalOptions();
+ MapOperations globalInternalOptions = getGlobalInternalOptions();
String providerType = globalInternalOptions.getMandatoryOption(
- OptionKeys.INTERNAL_PROVIDER_NAME);
+ InternalKeys.INTERNAL_PROVIDER_NAME);
log.info("Cluster provider type is {}", providerType);
SliderProviderFactory factory =
SliderProviderFactory.createSliderProviderFactory(
@@ -751,7 +750,7 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
}
String rolesTmpSubdir = appMasterContainerID.toString() + "/roles";
- String amTmpDir = globalInternalOptions.getMandatoryOption(OptionKeys.INTERNAL_AM_TMP_DIR);
+ String amTmpDir = globalInternalOptions.getMandatoryOption(InternalKeys.INTERNAL_AM_TMP_DIR);
Path tmpDirPath = new Path(amTmpDir);
Path launcherTmpDirPath = new Path(tmpDirPath, rolesTmpSubdir);
@@ -927,9 +926,18 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
* @return the generated configuration dir
*/
public String getGeneratedConfDir() {
+ return getGlobalInternalOptions().get(
+ InternalKeys.INTERNAL_GENERATED_CONF_PATH);
+ }
+
+ /**
+ * Get the global internal options for the AM
+ * @return a map to access the internals
+ */
+ public MapOperations getGlobalInternalOptions() {
return getInstanceDefinition()
.getInternalOperations().
- getGlobalOptions().get(OptionKeys.INTERNAL_GENERATED_CONF_PATH);
+ getGlobalOptions();
}
/**
@@ -1179,7 +1187,7 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
/**
* Schedule the failure window
- * @param resources
+ * @param resources the resource tree
* @throws BadConfigException if the window is out of range
*/
private void scheduleFailureWindowResets(ConfTree resources) throws
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java
----------------------------------------------------------------------
diff --git a/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java b/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java
index a9b9e99..22de0d2 100644
--- a/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java
+++ b/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java
@@ -27,13 +27,10 @@ import org.apache.hadoop.yarn.api.records.ContainerId;
import org.apache.hadoop.yarn.api.records.ContainerLaunchContext;
import org.apache.hadoop.yarn.api.records.LocalResource;
import org.apache.hadoop.yarn.api.records.LocalResourceType;
-import org.apache.hadoop.yarn.api.records.NodeId;
-import org.apache.hadoop.yarn.api.records.Priority;
-import org.apache.hadoop.yarn.api.records.Resource;
-import org.apache.hadoop.yarn.api.records.Token;
import org.apache.slider.api.ClusterDescription;
import org.apache.slider.api.ClusterDescriptionKeys;
import org.apache.slider.api.ClusterNode;
+import org.apache.slider.api.InternalKeys;
import org.apache.slider.api.OptionKeys;
import org.apache.slider.common.SliderXmlConfKeys;
import org.apache.slider.common.tools.SliderFileSystem;
@@ -218,7 +215,7 @@ public class TestAgentProviderService {
public void testRegistration() throws IOException {
ConfTree tree = new ConfTree();
- tree.global.put(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH, ".");
+ tree.global.put(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH, ".");
AgentProviderService aps = new AgentProviderService();
ContainerLaunchContext ctx = createNiceMock(ContainerLaunchContext.class);
@@ -585,7 +582,7 @@ public class TestAgentProviderService {
InputStream metainfo_1 = new ByteArrayInputStream(metainfo_1_str.getBytes());
Metainfo metainfo = new MetainfoParser().parse(metainfo_1);
ConfTree tree = new ConfTree();
- tree.global.put(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH, ".");
+ tree.global.put(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH, ".");
AgentProviderService aps = new AgentProviderService();
ContainerLaunchContext ctx = createNiceMock(ContainerLaunchContext.class);
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloClientProvider.java
----------------------------------------------------------------------
diff --git a/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloClientProvider.java b/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloClientProvider.java
index db99360..7f99573 100644
--- a/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloClientProvider.java
+++ b/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloClientProvider.java
@@ -23,6 +23,7 @@ import org.apache.hadoop.fs.CommonConfigurationKeys;
import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.yarn.api.records.LocalResource;
+import org.apache.slider.api.InternalKeys;
import org.apache.slider.common.SliderKeys;
import org.apache.slider.common.SliderXmlConfKeys;
import org.apache.slider.api.OptionKeys;
@@ -135,7 +136,7 @@ public class AccumuloClientProvider extends AbstractClientProvider implements
propagateClientFSBinding(sitexml);
setDatabasePath(sitexml,
- globalInstanceOptions.getMandatoryOption(OptionKeys.INTERNAL_DATA_DIR_PATH));
+ globalInstanceOptions.getMandatoryOption(InternalKeys.INTERNAL_DATA_DIR_PATH));
String quorum =
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloProviderService.java
----------------------------------------------------------------------
diff --git a/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloProviderService.java b/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloProviderService.java
index c511efb..7dedd2c 100644
--- a/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloProviderService.java
+++ b/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloProviderService.java
@@ -26,6 +26,7 @@ import org.apache.hadoop.fs.Path;
import org.apache.hadoop.service.Service;
import org.apache.hadoop.yarn.api.ApplicationConstants;
import org.apache.hadoop.yarn.api.records.Container;
+import org.apache.slider.api.InternalKeys;
import org.apache.slider.common.SliderKeys;
import org.apache.slider.api.ClusterDescription;
import org.apache.slider.api.OptionKeys;
@@ -161,7 +162,7 @@ public class AccumuloProviderService extends AbstractProviderService implements
//Add binaries
//now add the image if it was set
String imageURI = instanceDefinition.getInternalOperations()
- .get(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH);
+ .get(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH);
fileSystem.maybeAddImagePath(launcher.getLocalResources(), imageURI);
CommandLineBuilder commandLine = new CommandLineBuilder();
@@ -333,8 +334,8 @@ public class AccumuloProviderService extends AbstractProviderService implements
//callback to AM to trigger cluster review is set up to happen after
//the init/verify action has succeeded
int delay = internalOperations.getGlobalOptions().getOptionInt(
- OptionKeys.INTERNAL_CONTAINER_STARTUP_DELAY,
- OptionKeys.DEFAULT_CONTAINER_STARTUP_DELAY);
+ InternalKeys.INTERNAL_CONTAINER_STARTUP_DELAY,
+ InternalKeys.DEFAULT_INTERNAL_CONTAINER_STARTUP_DELAY);
ProviderCompletedCallable completedCallable =
new ProviderCompletedCallable(execInProgress, null);
Service notifier = new WorkflowCallbackService<>(
@@ -364,7 +365,7 @@ public class AccumuloProviderService extends AbstractProviderService implements
String dataDir = cd.getInternalOperations()
.getGlobalOptions()
.getMandatoryOption(
- OptionKeys.INTERNAL_DATA_DIR_PATH);
+ InternalKeys.INTERNAL_DATA_DIR_PATH);
Path accumuloInited = new Path(dataDir, INSTANCE_ID);
FileSystem fs2 = FileSystem.get(accumuloInited.toUri(), getConf());
return fs2.exists(accumuloInited);
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseClientProvider.java
----------------------------------------------------------------------
diff --git a/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseClientProvider.java b/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseClientProvider.java
index cd104a2..76bf73a 100644
--- a/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseClientProvider.java
+++ b/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseClientProvider.java
@@ -21,6 +21,7 @@ package org.apache.slider.providers.hbase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.yarn.api.records.LocalResource;
+import org.apache.slider.api.InternalKeys;
import org.apache.slider.common.SliderKeys;
import org.apache.slider.common.SliderXmlConfKeys;
import org.apache.slider.api.OptionKeys;
@@ -122,7 +123,7 @@ public class HBaseClientProvider extends AbstractClientProvider implements
sitexml.put(KEY_HBASE_ROOTDIR,
globalInstanceOptions.getMandatoryOption(
- OptionKeys.INTERNAL_DATA_DIR_PATH)
+ InternalKeys.INTERNAL_DATA_DIR_PATH)
);
providerUtils.propagateOption(globalAppOptions, OptionKeys.ZOOKEEPER_PATH,
sitexml, KEY_ZNODE_PARENT);
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseProviderService.java
----------------------------------------------------------------------
diff --git a/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseProviderService.java b/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseProviderService.java
index f72967f..feffb08 100644
--- a/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseProviderService.java
+++ b/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseProviderService.java
@@ -22,9 +22,9 @@ package org.apache.slider.providers.hbase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.yarn.api.records.Container;
+import org.apache.slider.api.InternalKeys;
import org.apache.slider.common.SliderKeys;
import org.apache.slider.api.ClusterDescription;
-import org.apache.slider.api.OptionKeys;
import org.apache.slider.api.RoleKeys;
import org.apache.slider.api.StatusKeys;
import org.apache.slider.core.conf.AggregateConf;
@@ -152,7 +152,7 @@ public class HBaseProviderService extends AbstractProviderService implements
//Add binaries
//now add the image if it was set
String imageURI = instanceDefinition.getInternalOperations()
- .get(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH);
+ .get(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH);
coreFS.maybeAddImagePath(launcher.getLocalResources(), imageURI);
CommandLineBuilder cli = new CommandLineBuilder();
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/freezethaw/TestFreezeReconfigureThawLiveRegionService.groovy
----------------------------------------------------------------------
diff --git a/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/freezethaw/TestFreezeReconfigureThawLiveRegionService.groovy b/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/freezethaw/TestFreezeReconfigureThawLiveRegionService.groovy
index d50517c..f6748e0 100644
--- a/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/freezethaw/TestFreezeReconfigureThawLiveRegionService.groovy
+++ b/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/freezethaw/TestFreezeReconfigureThawLiveRegionService.groovy
@@ -25,9 +25,9 @@ import org.apache.hadoop.fs.FileSystem as HadoopFS
import org.apache.hadoop.fs.Path
import org.apache.hadoop.hbase.ClusterStatus
import org.apache.hadoop.yarn.conf.YarnConfiguration
+import org.apache.slider.api.InternalKeys
import org.apache.slider.core.main.ServiceLauncher
import org.apache.slider.api.ClusterDescription
-import org.apache.slider.api.OptionKeys
import org.apache.slider.core.build.InstanceIO
import org.apache.slider.providers.hbase.HBaseKeys
import org.apache.slider.common.tools.ConfigHelper
@@ -93,7 +93,7 @@ class TestFreezeReconfigureThawLiveRegionService
clusterDir)
def snapshotPath = instanceDefinition.internalOperations.get(
- OptionKeys.INTERNAL_SNAPSHOT_CONF_PATH)
+ InternalKeys.INTERNAL_SNAPSHOT_CONF_PATH)
assert snapshotPath != null
Path confdir = new Path(snapshotPath);
[6/9] git commit: SLIDER-202 monkey has mock tests and is set to run
in AM if enabled
Posted by sm...@apache.org.
SLIDER-202 monkey has mock tests and is set to run in AM if enabled
Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/52bd11b5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/52bd11b5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/52bd11b5
Branch: refs/heads/feature/SLIDER-285_Restart_AM
Commit: 52bd11b5d4d3a17f231e5343c0bfa6c39492fbb3
Parents: 8ed52a9
Author: Steve Loughran <st...@apache.org>
Authored: Wed Aug 13 15:06:11 2014 +0100
Committer: Steve Loughran <st...@apache.org>
Committed: Wed Aug 13 15:06:11 2014 +0100
----------------------------------------------------------------------
.../org/apache/slider/api/ResourceKeys.java | 26 +--
.../apache/slider/common/tools/SliderUtils.java | 6 +-
.../apache/slider/core/conf/MapOperations.java | 54 ++++++-
.../providers/agent/AgentClientProvider.java | 8 +-
.../providers/agent/AgentProviderService.java | 7 +-
.../server/appmaster/SliderAppMaster.java | 88 ++++++----
.../appmaster/actions/ActionKillContainer.java | 24 ++-
.../server/appmaster/actions/QueueService.java | 8 +-
.../server/appmaster/monkey/ChaosEntry.java | 12 +-
.../server/appmaster/monkey/ChaosKillAM.java | 12 +-
.../appmaster/monkey/ChaosKillContainer.java | 25 +--
.../appmaster/monkey/ChaosMonkeyService.java | 23 ++-
.../model/mock/MockRMOperationHandler.groovy | 7 +-
.../model/monkey/TestMockMonkey.groovy | 160 +++++++++++++++++++
.../apache/slider/test/SliderTestBase.groovy | 7 +-
15 files changed, 360 insertions(+), 107 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/api/ResourceKeys.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/api/ResourceKeys.java b/slider-core/src/main/java/org/apache/slider/api/ResourceKeys.java
index c2b78cc..3d54140 100644
--- a/slider-core/src/main/java/org/apache/slider/api/ResourceKeys.java
+++ b/slider-core/src/main/java/org/apache/slider/api/ResourceKeys.java
@@ -112,34 +112,14 @@ public interface ResourceKeys {
"yarn.container.failure.threshold";
/**
- * Minutes range of the container failure reset window.
- * This is combined with the hour and day values to
- * produce the full window.
+ * prefix for the time of the container failure reset window.
* {@value}
*/
- String CONTAINER_FAILURE_WINDOW_MINUTES =
- "yarn.container.failure.window.minutes";
-
-
- /**
- * Hours range of the container failure reset window
- * This is combined with the minute and day values to
- * produce the full window.
- * {@value}
- */
- String CONTAINER_FAILURE_WINDOW_HOURS =
- "yarn.container.failure.window.hours";
+ String CONTAINER_FAILURE_WINDOW =
+ "yarn.container.failure.window";
- /**
- * Hours range of the container failure reset window
- * This is combined with the hour and minute values to
- * produce the full window.
- * {@value}
- */
- String CONTAINER_FAILURE_WINDOW_DAYS =
- "yarn.container.failure.window.days";
int DEFAULT_CONTAINER_FAILURE_WINDOW_DAYS = 0;
int DEFAULT_CONTAINER_FAILURE_WINDOW_HOURS = 6;
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java b/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java
index edbf2b2..d7f159c 100644
--- a/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java
+++ b/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java
@@ -43,7 +43,7 @@ import org.apache.hadoop.yarn.api.records.Container;
import org.apache.hadoop.yarn.api.records.LocalResource;
import org.apache.hadoop.yarn.api.records.YarnApplicationState;
import org.apache.hadoop.yarn.conf.YarnConfiguration;
-import org.apache.slider.api.OptionKeys;
+import org.apache.slider.api.InternalKeys;
import org.apache.slider.api.RoleKeys;
import org.apache.slider.common.SliderKeys;
import org.apache.slider.common.SliderXmlConfKeys;
@@ -1303,8 +1303,8 @@ public final class SliderUtils {
SliderException, IOException {
Path imagePath;
String imagePathOption =
- internalOptions.get(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH);
- String appHomeOption = internalOptions.get(OptionKeys.INTERNAL_APPLICATION_HOME);
+ internalOptions.get(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH);
+ String appHomeOption = internalOptions.get(InternalKeys.INTERNAL_APPLICATION_HOME);
if (!isUnset(imagePathOption)) {
imagePath = fs.createPathThatMustExist(imagePathOption);
} else {
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/core/conf/MapOperations.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/conf/MapOperations.java b/slider-core/src/main/java/org/apache/slider/core/conf/MapOperations.java
index bb57b94..98a51bc 100644
--- a/slider-core/src/main/java/org/apache/slider/core/conf/MapOperations.java
+++ b/slider-core/src/main/java/org/apache/slider/core/conf/MapOperations.java
@@ -18,6 +18,7 @@
package org.apache.slider.core.conf;
+import com.google.common.base.Preconditions;
import org.apache.slider.common.tools.SliderUtils;
import org.apache.slider.core.exceptions.BadConfigException;
import org.slf4j.Logger;
@@ -61,12 +62,11 @@ public class MapOperations implements Map<String, String> {
this.name = name;
}
-
/**
- * Get a cluster option or value
+ * Get an option value
*
- * @param key
- * @param defVal
+ * @param key key
+ * @param defVal default value
* @return option in map or the default
*/
public String getOption(String key, String defVal) {
@@ -74,14 +74,27 @@ public class MapOperations implements Map<String, String> {
return val != null ? val : defVal;
}
+ /**
+ * Get a boolean option
+ *
+ * @param key option key
+ * @param defVal default value
+ * @return option true if the option equals "true", or the default value
+ * if the option was not defined at all.
+ */
+ public Boolean getOptionBool(String key, boolean defVal) {
+ String val = getOption(key, Boolean.toString(defVal));
+ return Boolean.valueOf(val);
+ }
/**
* Get a cluster option or value
*
- * @param key
+ * @param key option key
* @return the value
* @throws BadConfigException if the option is missing
*/
+
public String getMandatoryOption(String key) throws BadConfigException {
String val = options.get(key);
if (val == null) {
@@ -247,4 +260,35 @@ public class MapOperations implements Map<String, String> {
}
return builder.toString();
}
+
+ /**
+ * Get the time range of a set of keys
+ * @param basekey
+ * @param defDays
+ * @param defHours
+ * @param defMins
+ * @param defSecs
+ * @return
+ */
+ public long getTimeRange(String basekey,
+ int defDays,
+ int defHours,
+ int defMins,
+ int defSecs) {
+ Preconditions.checkArgument(basekey != null);
+ int days = getOptionInt(basekey + ".days", defDays);
+ int hours = getOptionInt(basekey + ".hours", defHours);
+
+ int minutes = getOptionInt(basekey + ".minutes", defMins);
+ int seconds = getOptionInt(basekey + ".seconds", defSecs);
+ // range check
+ Preconditions.checkState(days >= 0 && hours >= 0 && minutes >= 0
+ && seconds >= 0,
+ "Time range for %s has negative time component %s:%s:%s:%s",
+ basekey, days, hours, minutes, seconds);
+
+ // calculate total time, schedule the reset if expected
+ long totalMinutes = days * 24 * 60 + hours * 24 + minutes;
+ return totalMinutes * 60 + seconds;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java
index 2ce16c7..72b0a42 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java
@@ -21,7 +21,7 @@ package org.apache.slider.providers.agent;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
-import org.apache.slider.api.OptionKeys;
+import org.apache.slider.api.InternalKeys;
import org.apache.slider.api.ResourceKeys;
import org.apache.slider.common.SliderKeys;
import org.apache.slider.common.tools.SliderFileSystem;
@@ -109,7 +109,7 @@ public class AgentClientProvider extends AbstractClientProvider
getGlobalOptions().get(AgentKeys.PACKAGE_PATH);
if (SliderUtils.isUnset(appHome)) {
String agentImage = instanceDefinition.getInternalOperations().
- get(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH);
+ get(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH);
sliderFileSystem.verifyFileExists(new Path(agentImage));
}
}
@@ -174,12 +174,12 @@ public class AgentClientProvider extends AbstractClientProvider
String appHome = instanceDefinition.getAppConfOperations().
getGlobalOptions().get(AgentKeys.PACKAGE_PATH);
String agentImage = instanceDefinition.getInternalOperations().
- get(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH);
+ get(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH);
if (SliderUtils.isUnset(appHome) && SliderUtils.isUnset(agentImage)) {
throw new BadConfigException("Either agent package path " +
AgentKeys.PACKAGE_PATH + " or image root " +
- OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH
+ InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH
+ " must be provided.");
}
}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
index 59a6e29..0c57b79 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
@@ -32,6 +32,7 @@ import org.apache.hadoop.yarn.api.records.Priority;
import org.apache.slider.api.ClusterDescription;
import org.apache.slider.api.ClusterDescriptionKeys;
import org.apache.slider.api.ClusterNode;
+import org.apache.slider.api.InternalKeys;
import org.apache.slider.api.OptionKeys;
import org.apache.slider.api.StatusKeys;
import org.apache.slider.common.SliderKeys;
@@ -62,8 +63,6 @@ import org.apache.slider.providers.agent.application.metadata.Metainfo;
import org.apache.slider.providers.agent.application.metadata.OSPackage;
import org.apache.slider.providers.agent.application.metadata.OSSpecific;
import org.apache.slider.server.appmaster.actions.ProviderReportedContainerLoss;
-import org.apache.slider.server.appmaster.state.ContainerPriority;
-import org.apache.slider.server.appmaster.state.RoleStatus;
import org.apache.slider.server.appmaster.state.StateAccessForProviders;
import org.apache.slider.server.appmaster.web.rest.agent.AgentCommandType;
import org.apache.slider.server.appmaster.web.rest.agent.AgentRestOperations;
@@ -265,7 +264,7 @@ public class AgentProviderService extends AbstractProviderService implements
log.info("PYTHONPATH set to {}", pythonPath);
String agentImage = instanceDefinition.getInternalOperations().
- get(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH);
+ get(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH);
if (agentImage != null) {
LocalResource agentImageRes = fileSystem.createAmResource(new Path(agentImage), LocalResourceType.ARCHIVE);
launcher.addLocalResource(AgentKeys.AGENT_INSTALL_DIR, agentImageRes);
@@ -1169,7 +1168,7 @@ public class AgentProviderService extends AbstractProviderService implements
tokens.put("${DEFAULT_DATA_DIR}", getAmState()
.getInternalsSnapshot()
.getGlobalOptions()
- .getMandatoryOption(OptionKeys.INTERNAL_DATA_DIR_PATH));
+ .getMandatoryOption(InternalKeys.INTERNAL_DATA_DIR_PATH));
return tokens;
}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
index e6c7aba..1642cc5 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
@@ -19,6 +19,7 @@
package org.apache.slider.server.appmaster;
import com.codahale.metrics.MetricRegistry;
+import com.google.common.annotations.VisibleForTesting;
import com.google.protobuf.BlockingService;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
@@ -1195,31 +1196,19 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
ResetFailureWindow reset = new ResetFailureWindow();
ConfTreeOperations ops = new ConfTreeOperations(resources);
MapOperations globals = ops.getGlobalOptions();
- int days = globals.getOptionInt(ResourceKeys.CONTAINER_FAILURE_WINDOW_DAYS,
- ResourceKeys.DEFAULT_CONTAINER_FAILURE_WINDOW_DAYS);
- int hours = globals.getOptionInt(
- ResourceKeys.CONTAINER_FAILURE_WINDOW_HOURS,
- ResourceKeys.DEFAULT_CONTAINER_FAILURE_WINDOW_HOURS);
- int minutes = globals.getOptionInt(
- ResourceKeys.CONTAINER_FAILURE_WINDOW_MINUTES,
- ResourceKeys.DEFAULT_CONTAINER_FAILURE_WINDOW_MINUTES);
- // range check
- if (days < 0 || hours < 0 || minutes < 0) {
- throw new BadConfigException("Failure window contains negative values:"
- + "days=%d hours=%d, minutes=%d",
- days, hours, minutes);
- }
- // calculate total time, schedule the reset if expected
- int totalMinutes = days * 24 * 60 + hours * 24 + minutes;
- if (totalMinutes > 0) {
+ long seconds = globals.getTimeRange(ResourceKeys.CONTAINER_FAILURE_WINDOW,
+ ResourceKeys.DEFAULT_CONTAINER_FAILURE_WINDOW_DAYS,
+ ResourceKeys.DEFAULT_CONTAINER_FAILURE_WINDOW_HOURS,
+ ResourceKeys.DEFAULT_CONTAINER_FAILURE_WINDOW_MINUTES, 0);
+ if (seconds > 0) {
log.info(
- "Scheduling the failure window reset interval to every {} minutes",
- totalMinutes);
+ "Scheduling the failure window reset interval to every {} seconds",
+ seconds);
RenewingAction<ResetFailureWindow> renew = new RenewingAction<>(
- reset, totalMinutes, totalMinutes, TimeUnit.MINUTES, 0);
+ reset, seconds, seconds, TimeUnit.SECONDS, 0);
actionQueues.renewing("failures", renew);
} else {
- log.warn("Failure window reset interval is not set");
+ log.info("Failure window reset interval is not set");
}
}
@@ -1458,7 +1447,8 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
//throws NoSuchNodeException if it is missing
RoleInstance instance =
appState.getLiveInstanceByContainerID(containerID);
- queue(new ActionKillContainer(instance.getId(), 0, TimeUnit.MILLISECONDS));
+ queue(new ActionKillContainer(instance.getId(), 0, TimeUnit.MILLISECONDS,
+ rmOperationHandler));
Messages.KillContainerResponseProto.Builder builder =
Messages.KillContainerResponseProto.newBuilder();
builder.setSuccess(true);
@@ -1469,6 +1459,15 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
rmOperationHandler.execute(operations);
}
+
+ /**
+ * Get the RM operations handler for direct scheduling of work.
+ */
+ @VisibleForTesting
+ public RMOperationHandler getRmOperationHandler() {
+ return rmOperationHandler;
+ }
+
@Override
public Messages.AMSuicideResponseProto amSuicide(
Messages.AMSuicideRequestProto request)
@@ -1742,18 +1741,45 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
}
public boolean maybeStartMonkey() {
+ MapOperations internals = getGlobalInternalOptions();
+
+ Boolean enabled =
+ internals.getOptionBool(InternalKeys.INTERNAL_CHAOS_MONKEY_ENABLED,
+ InternalKeys.DEFAULT_INTERNAL_CHAOS_MONKEY_ENABLED);
+ if (!enabled) {
+ log.info("Chaos monkey disabled");
+ }
+
+ long monkeyInterval = internals.getTimeRange(
+ InternalKeys.INTERNAL_CHAOS_MONKEY_RATE,
+ InternalKeys.DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_DAYS,
+ InternalKeys.DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_HOURS,
+ InternalKeys.DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_MINUTES,
+ 0);
+ log.info("Adding Chaos Monkey scheduled every {} seconds ({} hours)",
+ monkeyInterval, monkeyInterval/(60*60));
monkey = new ChaosMonkeyService(metrics, actionQueues);
- int amKillProbability = 100;
- int containerKillProbability = 200;
- monkey.addTarget("AM killer",
- new ChaosKillAM(this, actionQueues, -1),
- amKillProbability);
- monkey.addTarget("Container killer",
- new ChaosKillContainer(this, actionQueues),
- amKillProbability);
+ int amKillProbability = internals.getOptionInt(
+ InternalKeys.INTERNAL_CHAOS_MONKEY_PROBABILITY_AM_FAILURE,
+ InternalKeys.DEFAULT_CHAOS_MONKEY_PROBABILITY_AM_FAILURE);
+ if (amKillProbability > 0) {
+ log.info("Adding AM killer with probability %f", amKillProbability/100.0);
+ monkey.addTarget("AM killer",
+ new ChaosKillAM(actionQueues, -1), amKillProbability
+ );
+ }
+ int containerKillProbability = internals.getOptionInt(
+ InternalKeys.INTERNAL_CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE,
+ InternalKeys.DEFAULT_CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE);
+ if (containerKillProbability > 0) {
+ monkey.addTarget("Container killer",
+ new ChaosKillContainer(appState, actionQueues, rmOperationHandler),
+ amKillProbability
+ );
+ }
initAndAddService(monkey);
// and schedule it
- schedule(monkey.getChaosAction(60, TimeUnit.SECONDS));
+ schedule(monkey.getChaosAction(monkeyInterval, TimeUnit.SECONDS));
return true;
}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionKillContainer.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionKillContainer.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionKillContainer.java
index 7668bd5..95edca4 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionKillContainer.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionKillContainer.java
@@ -18,10 +18,12 @@
package org.apache.slider.server.appmaster.actions;
+import com.google.common.base.Preconditions;
import org.apache.hadoop.yarn.api.records.ContainerId;
import org.apache.slider.server.appmaster.SliderAppMaster;
import org.apache.slider.server.appmaster.operations.AbstractRMOperation;
import org.apache.slider.server.appmaster.operations.ContainerReleaseOperation;
+import org.apache.slider.server.appmaster.operations.RMOperationHandler;
import org.apache.slider.server.appmaster.state.AppState;
import java.util.LinkedList;
@@ -31,13 +33,27 @@ import java.util.concurrent.TimeUnit;
public class ActionKillContainer extends AsyncAction {
private final ContainerId containerId;
-
- public ActionKillContainer(ContainerId containerId, long delay,
- TimeUnit timeUnit) {
+ private final RMOperationHandler operationHandler;
+ public ActionKillContainer(
+ ContainerId containerId,
+ long delay,
+ TimeUnit timeUnit,
+ RMOperationHandler operationHandler) {
super("kill container", delay, timeUnit);
+ this.operationHandler = operationHandler;
+ Preconditions.checkArgument(containerId != null);
+
this.containerId = containerId;
}
+ /**
+ * Get the container ID to kill
+ * @return
+ */
+ public ContainerId getContainerId() {
+ return containerId;
+ }
+
@Override
public void execute(SliderAppMaster appMaster,
QueueAccess queueService,
@@ -46,6 +62,6 @@ public class ActionKillContainer extends AsyncAction {
ContainerReleaseOperation release = new ContainerReleaseOperation(containerId);
opsList.add(release);
//now apply the operations
- appMaster.executeRMOperations(opsList);
+ operationHandler.execute(opsList);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/QueueService.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/QueueService.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/QueueService.java
index 1154a44..ac59096 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/QueueService.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/QueueService.java
@@ -55,18 +55,14 @@ implements Runnable, QueueAccess {
/**
* Immediate actions.
- * Package scoped for testing.
*/
- @VisibleForTesting
- final BlockingDeque<AsyncAction> actionQueue =
+ public final BlockingDeque<AsyncAction> actionQueue =
new LinkedBlockingDeque<>();
/**
* Actions to be scheduled in the future
- * Package scoped for testing.
*/
- @VisibleForTesting
- final DelayQueue<AsyncAction> scheduledActions = new DelayQueue<>();
+ public final DelayQueue<AsyncAction> scheduledActions = new DelayQueue<>();
/**
* Map of renewing actions by name ... this is to allow them to
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
index 13bda57..5905d2f 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
@@ -41,7 +41,7 @@ public class ChaosEntry {
/**
- * Constructor -includes validaton of all arguments
+ * Constructor -includes validation of all arguments
* @param name
* @param target
* @param probability
@@ -51,7 +51,8 @@ public class ChaosEntry {
Preconditions.checkArgument(!StringUtils.isEmpty(name), "missing name");
Preconditions.checkArgument(target != null, "null target");
Preconditions.checkArgument(probability > 0, "negative probability");
- Preconditions.checkArgument(probability < 10000, "probability over 100%");
+ Preconditions.checkArgument(probability <= ChaosMonkeyService.PERCENT_100,
+ "probability over 100%");
this.name = name;
this.target = target;
this.probability = probability;
@@ -71,11 +72,12 @@ public class ChaosEntry {
/**
* Invoke Chaos if the trigger value is in range of the probability
- * @param trigger trigger value, 0-10K
+ * @param value trigger value, 0-10K
* @return true if the chaos method was invoked
*/
- public boolean maybeInvokeChaos(long trigger) {
- if (probability < 0) {
+ public boolean maybeInvokeChaos(long value) {
+ log.debug("Probability {} trigger={}", probability, value);
+ if (value < probability) {
invokeChaos();
return true;
}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillAM.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillAM.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillAM.java
index c464ac3..3c1a914 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillAM.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillAM.java
@@ -18,21 +18,21 @@
package org.apache.slider.server.appmaster.monkey;
-import org.apache.slider.server.appmaster.SliderAppMaster;
import org.apache.slider.server.appmaster.actions.ActionHalt;
import org.apache.slider.server.appmaster.actions.QueueAccess;
import java.util.concurrent.TimeUnit;
+/**
+ * Kill the AM
+ */
public class ChaosKillAM implements ChaosTarget {
- private final SliderAppMaster appMaster;
+ public static final int DELAY = 1000;
private final QueueAccess queues;
private final int exitCode;
- public ChaosKillAM(SliderAppMaster appMaster,
- QueueAccess queues, int exitCode) {
- this.appMaster = appMaster;
+ public ChaosKillAM(QueueAccess queues, int exitCode) {
this.queues = queues;
this.exitCode = exitCode;
}
@@ -42,7 +42,7 @@ public class ChaosKillAM implements ChaosTarget {
*/
@Override
public void chaosAction() {
- queues.schedule(new ActionHalt(exitCode, "Chaos invoked halt", 1000,
+ queues.schedule(new ActionHalt(exitCode, "Chaos invoked halt", DELAY,
TimeUnit.MILLISECONDS));
}
}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillContainer.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillContainer.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillContainer.java
index 0ffcc8a..daf2590 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillContainer.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillContainer.java
@@ -18,9 +18,11 @@
package org.apache.slider.server.appmaster.monkey;
-import org.apache.slider.server.appmaster.SliderAppMaster;
+import com.google.common.base.Preconditions;
import org.apache.slider.server.appmaster.actions.ActionKillContainer;
import org.apache.slider.server.appmaster.actions.QueueAccess;
+import org.apache.slider.server.appmaster.operations.RMOperationHandler;
+import org.apache.slider.server.appmaster.state.AppState;
import org.apache.slider.server.appmaster.state.RoleInstance;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -35,24 +37,29 @@ import java.util.concurrent.TimeUnit;
public class ChaosKillContainer implements ChaosTarget {
protected static final Logger log =
LoggerFactory.getLogger(ChaosKillContainer.class);
- private final SliderAppMaster appMaster;
+ public static final int DELAY = 100;
+ private final AppState appState;
private final QueueAccess queues;
private final Random random = new Random();
+ private final RMOperationHandler operationHandler;
- public ChaosKillContainer(SliderAppMaster appMaster,
- QueueAccess queues) {
- this.appMaster = appMaster;
+ public ChaosKillContainer(AppState appState,
+ QueueAccess queues,
+ RMOperationHandler operationHandler) {
+ Preconditions.checkNotNull(appState);
+ Preconditions.checkNotNull(queues);
+ this.appState = appState;
this.queues = queues;
+ this.operationHandler = operationHandler;
}
/**
- * Trigger a container kill halt
+ * Trigger a container kill
*/
-
@Override
public void chaosAction() {
List<RoleInstance> liveContainers =
- appMaster.getAppState().cloneLiveContainerInfoList();
+ appState.cloneLiveContainerInfoList();
int size = liveContainers.size();
if (size == 0) {
log.info("No containers to kill");
@@ -63,6 +70,6 @@ public class ChaosKillContainer implements ChaosTarget {
log.info("Killing {}", roleInstance);
queues.schedule(new ActionKillContainer(roleInstance.getId(),
- 100, TimeUnit.MILLISECONDS));
+ DELAY, TimeUnit.MILLISECONDS, operationHandler));
}
}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
index c525d02..cd4b46b 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
@@ -20,7 +20,6 @@ package org.apache.slider.server.appmaster.monkey;
import com.codahale.metrics.MetricRegistry;
import org.apache.hadoop.service.AbstractService;
-import org.apache.slider.server.appmaster.actions.AsyncAction;
import org.apache.slider.server.appmaster.actions.QueueAccess;
import org.apache.slider.server.appmaster.actions.RenewingAction;
import org.slf4j.Logger;
@@ -28,6 +27,7 @@ import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
+import java.util.Random;
import java.util.concurrent.TimeUnit;
/**
@@ -36,8 +36,16 @@ import java.util.concurrent.TimeUnit;
public class ChaosMonkeyService extends AbstractService {
protected static final Logger log =
LoggerFactory.getLogger(ChaosMonkeyService.class);
+ public static final int PERCENT_1 = 100;
+ public static final double PERCENT_1D = 100.0;
+
+ /**
+ * the percentage value as multiplied up
+ */
+ public static final int PERCENT_100 = 100 * PERCENT_1;
private final MetricRegistry metrics;
private final QueueAccess queues;
+ private final Random random = new Random();
private static final List<ChaosEntry> chaosEntries =
new ArrayList<ChaosEntry>();
@@ -50,14 +58,19 @@ public class ChaosMonkeyService extends AbstractService {
public synchronized void addTarget(String name,
- ChaosTarget target,
- long probability) {
-
+ ChaosTarget target, long probability) {
+ log.info("Adding {} with probability {}", name, probability / PERCENT_1);
chaosEntries.add(new ChaosEntry(name, target, probability, metrics));
}
+ /**
+ * Iterate through all the entries and invoke chaos on those wanted
+ */
public void play() {
-
+ for (ChaosEntry chaosEntry : chaosEntries) {
+ long p = random.nextInt(PERCENT_100);
+ chaosEntry.maybeInvokeChaos(p);
+ }
}
public RenewingAction<MonkeyPlayAction> getChaosAction(long time, TimeUnit timeUnit) {
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/MockRMOperationHandler.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/MockRMOperationHandler.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/MockRMOperationHandler.groovy
index 8ccd463..0fdba6b 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/MockRMOperationHandler.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/MockRMOperationHandler.groovy
@@ -29,17 +29,20 @@ import org.apache.slider.server.appmaster.operations.RMOperationHandler
@Slf4j
class MockRMOperationHandler extends RMOperationHandler {
public List<AbstractRMOperation> operations = [];
-
+ int requests, releases;
+
@Override
public void releaseAssignedContainer(ContainerId containerId) {
operations.add(new ContainerReleaseOperation(containerId))
log.info("Releasing container ID " + containerId.getId())
+ releases++;
}
@Override
public void addContainerRequest(AMRMClient.ContainerRequest req) {
operations.add(new ContainerRequestOperation(req))
log.info("Requesting container role #" + req.priority);
+ requests++;
}
/**
@@ -47,5 +50,7 @@ class MockRMOperationHandler extends RMOperationHandler {
*/
public void clear() {
operations.clear()
+ releases = 0;
+ requests = 0;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/monkey/TestMockMonkey.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/monkey/TestMockMonkey.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/monkey/TestMockMonkey.groovy
new file mode 100644
index 0000000..c789011
--- /dev/null
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/monkey/TestMockMonkey.groovy
@@ -0,0 +1,160 @@
+/*
+ * 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.slider.server.appmaster.model.monkey
+
+import groovy.transform.CompileStatic
+import groovy.util.logging.Slf4j
+import org.apache.hadoop.yarn.conf.YarnConfiguration
+import org.apache.slider.server.appmaster.actions.ActionHalt
+import org.apache.slider.server.appmaster.actions.ActionKillContainer
+import org.apache.slider.server.appmaster.actions.QueueService
+import org.apache.slider.server.appmaster.model.mock.BaseMockAppStateTest
+import org.apache.slider.server.appmaster.model.mock.MockRMOperationHandler
+import org.apache.slider.server.appmaster.monkey.ChaosKillAM
+import org.apache.slider.server.appmaster.monkey.ChaosKillContainer
+import org.apache.slider.server.appmaster.monkey.ChaosMonkeyService
+import org.apache.slider.server.appmaster.monkey.ChaosTarget
+import org.apache.slider.server.appmaster.operations.ContainerReleaseOperation
+import org.apache.slider.server.appmaster.state.RoleInstance
+import org.junit.Before
+import org.junit.Test
+
+@CompileStatic
+@Slf4j
+class TestMockMonkey extends BaseMockAppStateTest {
+
+ /**
+ * This queue service is NOT started; tests need to poll the queue
+ * rather than expect them to execute
+ */
+ QueueService queues = new QueueService();
+ ChaosMonkeyService monkey = new ChaosMonkeyService(metricRegistry,
+ queues)
+
+ @Before
+ public void init() {
+ def configuration = new YarnConfiguration()
+ queues.init(configuration)
+ monkey.init(configuration)
+ }
+
+ @Test
+ public void testMonkeyStart() throws Throwable {
+ monkey.start()
+ monkey.stop()
+ }
+
+
+ @Test
+ public void testMonkeyPlay() throws Throwable {
+ ChaosCounter counter = new ChaosCounter()
+ monkey.addTarget("target", counter, ChaosMonkeyService.PERCENT_100)
+
+ monkey.play()
+ assert counter.count == 1
+ }
+
+ @Test
+ public void testMonkeyPlaySometimes() throws Throwable {
+ ChaosCounter counter = new ChaosCounter()
+ ChaosCounter counter2 = new ChaosCounter()
+ monkey.addTarget("target1", counter, ChaosMonkeyService.PERCENT_1 * 50)
+ monkey.addTarget("target2", counter2, ChaosMonkeyService.PERCENT_1 * 25)
+
+ for (int i = 0; i < 100; i++) {
+ monkey.play()
+ }
+ log.info("Counter1 = ${counter.count} counter2 = ${counter2.count}")
+ /*
+ * Relying on probability here to give approximate answers
+ */
+ assert counter.count > 25
+ assert counter.count < 75
+ assert counter2.count < counter.count
+ }
+
+ @Test
+ public void testAMKiller() throws Throwable {
+
+ def chaos = new ChaosKillAM(queues, -1)
+ chaos.chaosAction();
+ assert queues.scheduledActions.size() == 1
+ def action = queues.scheduledActions.take()
+ assert action instanceof ActionHalt
+ }
+
+
+ @Test
+ public void testContainerKillerEmptyApp() throws Throwable {
+
+
+ def chaos = new ChaosKillContainer(appState,
+ queues,
+ new MockRMOperationHandler())
+ chaos.chaosAction();
+ assert queues.scheduledActions.size() == 0
+ }
+
+
+
+ @Test
+ public void testContainerKiller() throws Throwable {
+ MockRMOperationHandler ops = new MockRMOperationHandler();
+ role0Status.desired = 1
+ List<RoleInstance> instances = createAndStartNodes()
+ assert instances.size() == 1
+ def instance = instances[0]
+
+ def chaos = new ChaosKillContainer(appState, queues, ops)
+ chaos.chaosAction();
+ assert queues.scheduledActions.size() == 1
+ def action = queues.scheduledActions.take()
+ ActionKillContainer killer = (ActionKillContainer) action
+ assert killer.containerId == instance.containerId;
+ killer.execute(null, queues, appState)
+ assert ops.releases == 1;
+
+ ContainerReleaseOperation operation = (ContainerReleaseOperation) ops.operations[0]
+ assert operation.containerId == instance.containerId
+ }
+
+
+
+ /**
+ * Chaos target that just implement a counter
+ */
+ private static class ChaosCounter implements ChaosTarget {
+ int count;
+
+ @Override
+ void chaosAction() {
+ count++;
+ }
+
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder(
+ "ChaosCounter{");
+ sb.append("count=").append(count);
+ sb.append('}');
+ return sb.toString();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/test/groovy/org/apache/slider/test/SliderTestBase.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/test/SliderTestBase.groovy b/slider-core/src/test/groovy/org/apache/slider/test/SliderTestBase.groovy
index d7b328f..28b484f 100644
--- a/slider-core/src/test/groovy/org/apache/slider/test/SliderTestBase.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/test/SliderTestBase.groovy
@@ -18,6 +18,7 @@
package org.apache.slider.test
+import com.codahale.metrics.MetricRegistry
import groovy.transform.CompileStatic
import org.apache.hadoop.fs.FileUtil
import org.apache.slider.common.SliderXMLConfKeysForTesting
@@ -38,7 +39,11 @@ import java.nio.file.Files
@CompileStatic
public abstract class SliderTestBase extends SliderTestUtils {
-
+ /**
+ * Singleton metric registry
+ */
+ public static final MetricRegistry metricRegistry = new MetricRegistry()
+
@Rule
public TestName methodName = new TestName();