#! /usr/bin/env perl

# 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.


use POSIX qw(strftime);

if(scalar(@ARGV) != 4 && scalar(@ARGV) != 2){
	print "Usage : agitator.pl <sleep before kill in minutes> <sleep before tup in minutes> [<min kill> <max kill>]\n";
	exit(1);
}

$ACCUMULO_HOME="../../..";

$sleep1 = $ARGV[0];
$sleep2 = $ARGV[1];

if(scalar(@ARGV) == 4){
	$minKill = $ARGV[2];
	$maxKill = $ARGV[3];
}else{
	$minKill = 1;
	$maxKill = 1;
}

if($minKill > $maxKill){
	die("minKill > maxKill $minKill > $maxKill");
}

@slavesRaw = `cat $ACCUMULO_HOME/conf/slaves`;
chomp(@slavesRaw);

for $slave (@slavesRaw){
	if($slave eq "" || substr($slave,0,1) eq "#"){
		next;
	}

	push(@slaves, $slave);
}


if(scalar(@slaves) < $maxKill){
	print STDERR "WARN setting maxKill to ".scalar(@slaves)."\n";
	$maxKill = scalar(@slaves);
}

if ($minKill > $maxKill){
    print STDERR "WARN setting minKill to equal maxKill\n";
    $minKill = $maxKill;
}

while(1){

	$numToKill = int(rand($maxKill - $minKill + 1)) + $minKill;
	%killed = {};

	for($i = 0; $i < $numToKill; $i++){
		$server = "";	
		while($server eq "" || $killed{$server} != undef){
			$index = int(rand(scalar(@slaves)));
			$server = $slaves[$index];
		}

		$killed{$server} = 1;

		$t = strftime "%Y%m%d %H:%M:%S", localtime;
	
		$rn = rand(1);
		$kill_tserver = 0;
		$kill_logger = 0;
		if($rn <.33){
			$kill_tserver = 1;
			$kill_logger = 1;
		}elsif($rn < .66){
			$kill_tserver = 1;
			$kill_logger = 0;
		}else{
			$kill_tserver = 0;
			$kill_logger = 1;
		}
	
		print STDERR "$t Killing $server $kill_tserver $kill_logger\n";
	        if($kill_tserver) {
			system("$ACCUMULO_HOME/bin/stop-server.sh $server \"accumulo-start.*.jar\" tserver KILL");
		}

	        if($kill_logger) {
			system("$ACCUMULO_HOME/bin/stop-server.sh $server \"accumulo-start.*.jar\" logger KILL");
		}
	}

	sleep($sleep2 * 60);
	$t = strftime "%Y%m%d %H:%M:%S", localtime;
	print STDERR "$t Running tup\n";
	system("$ACCUMULO_HOME/bin/tup.sh");

	sleep($sleep1 * 60);
}

