File: extension.pl

package info (click to toggle)
oar 2.6.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 9,700 kB
  • sloc: perl: 34,517; sh: 6,041; ruby: 5,840; sql: 3,390; cpp: 2,277; makefile: 402; php: 365; ansic: 335; python: 275; exp: 23
file content (95 lines) | stat: -rwxr-xr-x 3,387 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/usr/bin/perl -w
# This hack looks at the database to see if there is room in the gantt to extend
# a job. If so, it then extend the walltime of the job.
# Warning: the WALLTIME_JOB_WALLTIME environement variables will not be updated 
# within the job.
# Also, arbitration between users might be needed, to allow extension or not 
# (fairness)
# This hack is thought to be run before each pass of the metascheduler (in a
# wrapper around it) so that there is not conflict with the scheduling.
use strict;
use warnings;

use DBI;
use Data::Dumper;

my $db_host = "localhost";
my $db_port = "5432";
my $db_user = "oar";
my $db_password = "oar";
my $db_name = "oar";
my $db_type = "Pg";

my $job_id = shift;
my $extension_duration = shift;
if (not defined($job_id) or not defined($extension_duration)) {
  die "I need 2 parameters: a job id and a extenstion duration\n";
}

my $dbh = DBI->connect("DBI:$db_type:database=$db_name;host=$db_host;port=$db_port", $db_user, $db_password, {'InactiveDestroy' => 1, 'PrintError' => 1}) or die;

my $req = <<EOS;
SELECT
  j.start_time, m.moldable_walltime, a.resource_id
FROM
  jobs j, moldable_job_descriptions m, assigned_resources a
WHERE
  job_id=$job_id AND
  j.job_id = m.moldable_job_id AND
  j.assigned_moldable_job=a.moldable_job_id AND
  j.state = 'Running'
EOS

my $sth = $dbh->prepare($req);

my $security_duration = 120;
my $extension_from;
my $extension_to;
my @extension_resources = ();
my $job_start_time;
my $job_walltime;
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
  $job_start_time = $ref->{start_time};
  $job_walltime = $ref->{moldable_walltime};
  push @extension_resources,$ref->{resource_id};
}
$extension_from = $job_start_time + $job_walltime;
$extension_to = $extension_from + $extension_duration;
print "Job $job_id started on ".localtime($job_start_time)." for ".($job_walltime/3600)." hours, try to postpone its end from ".localtime($extension_from)." to ".localtime($extension_to)."\n";

$req = <<EOS;
SELECT
  j.job_id, gp.start_time, j.initial_request
FROM 
  jobs j, moldable_job_descriptions m, gantt_jobs_predictions gp 
WHERE
  j.job_id = m.moldable_job_id AND
  gp.moldable_job_id = m.moldable_id AND
  gp.start_time > $extension_from AND
  gp.start_time - $security_duration <= $extension_to
EOS

my $conflict;
$sth = $dbh->prepare($req);
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
    print "Found conficting job: ".$ref->{job_id}.", starting on ".localtime($ref->{start_time}).": $ref->{initial_request}\n";
    $extension_to = $ref->{start_time} - $security_duration;
}

if ($conflict) {
    print "Reduice possible extension to ".($extension_to - $extension_from)."s\n";
} else {
    print "Requested extension is possible\n";
}

if ($extension_to > 0) {
  my $new_walltime = $job_walltime + $extension_to - $extension_from;
  $dbh->do("UPDATE moldable_job_descriptions SET moldable_walltime=$new_walltime FROM jobs WHERE jobs.job_id = moldable_job_id AND jobs.job_id = $job_id");
  $dbh->do("INSERT INTO event_logs (type,job_id,date,description,to_check) VALUES ('EXTERNAL',$job_id,EXTRACT(EPOCH FROM current_timestamp),'job extension succeeded with new walltime=${new_walltime}s','NO')");
  print "Job extension succeeded with new walltime=${new_walltime}s\n";
} else {
  print "No extension is currently possible for job $job_id\n"; 
}
$dbh->disconnect() or die;