SLIDER-572 add startup delay for the chaos monkey
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 5f150e6..074644d 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
@@ -121,6 +121,14 @@
int DEFAULT_CHAOS_MONKEY_INTERVAL_HOURS = 0;
int DEFAULT_CHAOS_MONKEY_INTERVAL_MINUTES = 0;
+ String CHAOS_MONKEY_DELAY = "internal.chaos.monkey.delay";
+ String CHAOS_MONKEY_DELAY_DAYS = CHAOS_MONKEY_DELAY + ".days";
+ String CHAOS_MONKEY_DELAY_HOURS = CHAOS_MONKEY_DELAY + ".hours";
+ String CHAOS_MONKEY_DELAY_MINUTES = CHAOS_MONKEY_DELAY + ".minutes";
+ String CHAOS_MONKEY_DELAY_SECONDS = CHAOS_MONKEY_DELAY + ".seconds";
+
+ int DEFAULT_CHAOS_MONKEY_STARTUP_DELAY = 0;
+
/**
* Prefix for all chaos monkey probabilities
*/
@@ -133,7 +141,8 @@
/**
* Probability of a monkey check killing the AM: {@value}
*/
- String CHAOS_MONKEY_PROBABILITY_AM_FAILURE = CHAOS_MONKEY_PROBABILITY +".amfailure";
+ String CHAOS_MONKEY_PROBABILITY_AM_FAILURE =
+ CHAOS_MONKEY_PROBABILITY + ".amfailure";
/**
* Default probability of a monkey check killing the AM: {@value}
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 6503c9b..de8fc2c 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
@@ -282,7 +282,7 @@
* @param defHours
* @param defMins
* @param defSecs
- * @return
+ * @return the aggregate time range in seconds
*/
public long getTimeRange(String basekey,
int defDays,
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 39a2572..855ecd7 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
@@ -1101,14 +1101,6 @@
}
-/*
-
- @Override
- protected RegistryOperationsService createRegistryOperationsInstance() {
- return new ResourceManagerRegistryService("YarnRegistry");
- }
-*/
-
/**
* TODO: purge this once RM is doing the work
* @throws IOException
@@ -1133,7 +1125,7 @@
if (instance == null) {
return false;
}
- // this is where component registrations will go
+ // this is where component registrations go
log.info("Registering component {}", id);
String cid = RegistryPathUtils.encodeYarnID(id.toString());
ServiceRecord container = new ServiceRecord();
@@ -2185,8 +2177,16 @@
"Chaos monkey not configured with a time interval...not enabling");
return false;
}
- log.info("Adding Chaos Monkey scheduled every {} seconds ({} hours)",
- monkeyInterval, monkeyInterval/(60*60));
+
+ long monkeyDelay = internals.getTimeRange(
+ InternalKeys.CHAOS_MONKEY_DELAY,
+ 0,
+ 0,
+ 0,
+ (int)monkeyInterval);
+
+ log.info("Adding Chaos Monkey scheduled every {} seconds ({} hours -delay {}",
+ monkeyInterval, monkeyInterval/(60*60), monkeyDelay);
monkey = new ChaosMonkeyService(metrics, actionQueues);
initAndAddService(monkey);
@@ -2204,7 +2204,7 @@
containerKillProbability);
// and schedule it
- if (monkey.schedule(monkeyInterval, TimeUnit.SECONDS)) {
+ if (monkey.schedule(monkeyDelay, monkeyInterval, TimeUnit.SECONDS)) {
log.info("Chaos Monkey is running");
return true;
} else {
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 f7b1eb7..80f981c 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
@@ -92,13 +92,14 @@
/**
* Schedule the monkey
- * @param time interval
+ *
+ * @param delay initial delay
* @param timeUnit time unit
* @return true if it was scheduled (i.e. 1+ action) and interval > 0
*/
- public boolean schedule(long time, TimeUnit timeUnit) {
- if (time > 0 && !chaosEntries.isEmpty()) {
- queues.schedule(getChaosAction(time, timeUnit));
+ public boolean schedule(long delay, long interval, TimeUnit timeUnit) {
+ if (interval > 0 && !chaosEntries.isEmpty()) {
+ queues.schedule(getChaosAction(delay, interval, timeUnit));
return true;
} else {
return false;
@@ -107,15 +108,18 @@
/**
* Get the chaos action
- * @param time interval
+ *
+ * @param delay
* @param timeUnit time unit
* @return the action to schedule
*/
- public RenewingAction<MonkeyPlayAction> getChaosAction(long time, TimeUnit timeUnit) {
+ public RenewingAction<MonkeyPlayAction> getChaosAction(long delay,
+ long interval,
+ TimeUnit timeUnit) {
RenewingAction<MonkeyPlayAction> action = new RenewingAction<MonkeyPlayAction>(
new MonkeyPlayAction(this, 0, TimeUnit.MILLISECONDS),
- time,
- time,
+ delay,
+ interval,
timeUnit,
0
);
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
index 26d07ee..d31c9f6 100644
--- 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
@@ -78,7 +78,7 @@
assert 0 == monkey.targetCount;
monkey.addTarget("target", counter, ChaosMonkeyService.PERCENT_100)
assert 1 == monkey.targetCount;
- assert monkey.schedule(1, TimeUnit.SECONDS)
+ assert monkey.schedule(0, 1, TimeUnit.SECONDS)
assert 1 == queues.scheduledActions.size()
}
@@ -96,7 +96,7 @@
public void testMonkeyScheduleProb0Actions() throws Throwable {
ChaosCounter counter = new ChaosCounter()
monkey.addTarget("target", counter, 0)
- assert !monkey.schedule(1, TimeUnit.SECONDS)
+ assert !monkey.schedule(0, 1, TimeUnit.SECONDS)
assert 0 == queues.scheduledActions.size()
}