<?php

$no_http_headers = true;

/* display ALL errors */
include_once(dirname(__FILE__) . "/../lib/functions.php");
error_no_deprecated();

if (!isset($called_by_script_server)) {
	include(dirname(__FILE__) . "/../include/global.php");
	array_shift($_SERVER["argv"]);
	call_user_func_array("ss_alert_stutterjobs", $_SERVER["argv"]);
}

function ss_alert_stutterjobs($action='query', $clusterid=0, $effic=50, $runtime=1800, $cpusecs=30, $cpuwindow=1200) {
	$alert_jobs = array();

	/* get the jobs that have an efficiency of < $effic and a runtime of > $runtime */
	$jobs = db_fetch_assoc("SELECT gj.clusterid, clustername, gj.jobid, gj.indexid, 
		gj.submit_time, gj.queue, gj.user, round(gj.efficiency,2) AS efficiency, round(gj.run_time/3600,2) AS run_time, gj.projectName
		FROM grid_jobs AS gj
		INNER JOIN grid_clusters AS gc
		ON gj.clusterid=gc.clusterid
		WHERE gj.stat='RUNNING' 
		AND gj.efficiency<=$effic 
		AND gj.run_time>$runtime" . ($clusterid > 0 ? " AND gj.clusterid=$clusterid":""));

	if (sizeof($jobs)) {
	foreach($jobs as $job) {
		//echo "JobID " . $job['jobid'] . "\n";
		$rusage = db_fetch_assoc("SELECT stime+utime AS cputime, UNIX_TIMESTAMP(update_time) AS update_time
			FROM grid_jobs_rusage 
			WHERE clusterid=" . $job['clusterid'] . "
			AND jobid=" . $job['jobid'] . "
			AND indexid=" . $job['indexid'] . "
			AND submit_time='" . $job['submit_time'] . "'
			ORDER BY update_time ASC");

		if (sizeof($rusage)) {
			$prev_time = '';
			$prev_cpu  = '';
			$first = true;
			$in_alert = false;
			foreach($rusage as $r) {
				if ($first) {
					$first = false;
					$prev_time = $r['update_time'];
					$prev_cpu  = $r['cputime'];
				}elseif ($r['update_time'] - $prev_time >= $cpuwindow) {
					if ($r['cputime'] - $prev_cpu < $cpusecs) {
						$job['alert_time'] = date("Y-m-d H:i:s", $r['update_time']);
						$job['alert_secs'] = $r['cputime'] - $prev_cpu;
						$in_alert = true;
					}

					$prev_time = $r['update_time'];
					$prev_cpu  = $r['cputime'];
				}
			}

			if ($in_alert) {
				$alert_jobs[] = $job;
				//echo "Delta Time: " . ($r['update_time'] - $prev_time) . "\n";
				//echo "Delta CPU: " . ($r['cputime'] - $prev_cpu) . "\n";
			}
		}
	}
	}

	if ($action == 'query') {
		print sizeof($alert_jobs) . "\n";
	}elseif (sizeof($alert_jobs)) {
		print "ClusterID, Cluster Name, JobID, JobIndex, Submit Time, Submit Queue, User, Efficiency, Run Hours, Project Name, Last Idle, Idle Seconds\n";
		foreach($alert_jobs as $j) {
			print '"' . $j['clusterid'] . '","' . $j['clustername'] . '","' . $j['jobid'] . '","' . $j['indexid'] . '","' . $j['submit_time'] . '","' . $j['queue'] . '","' . $j['user'] . '","' . $j['efficiency'] . '","' . $j['run_time'] . '","' . $j['projectName'] . '","' . $j['alert_time'] . '","' . $j['alert_secs'] . "\"\n";
		}
	}else{
		exit(0);
	}
}
