~ubuntu-branches/ubuntu/utopic/nordugrid-arc/utopic

« back to all changes in this revision

Viewing changes to src/services/a-rex/infoproviders/Boinc.pm

  • Committer: Package Import Robot
  • Author(s): Mattias Ellert
  • Date: 2014-05-01 20:51:02 UTC
  • mfrom: (1.1.11)
  • Revision ID: package-import@ubuntu.com-20140501205102-icy9t3348uxobyx7
Tags: 4.1.0-1
* 4.1.0 Release
* Call dh_autoreconf to support ppc64le (Closes: #744639)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package Boinc;
 
2
 
 
3
use strict;
 
4
use DBI;
 
5
use POSIX qw(ceil floor);
 
6
use Sys::Hostname;
 
7
our @ISA = ('Exporter');
 
8
our @EXPORT_OK = ('cluster_info',
 
9
              'queue_info',
 
10
              'jobs_info',
 
11
              'users_info');
 
12
use LogUtils ( 'start_logging', 'error', 'warning', 'debug' ); 
 
13
 
 
14
##########################################
 
15
# Saved private variables
 
16
##########################################
 
17
 
 
18
our (%lrms_queue);
 
19
our $running = undef; # total running jobs in a queue
 
20
 
 
21
# the queue passed in the latest call to queue_info, jobs_info or users_info
 
22
my $currentqueue = undef;
 
23
 
 
24
# Resets queue-specific global variables if
 
25
# the queue has changed since the last call
 
26
sub init_globals($) {
 
27
    my $qname = shift;
 
28
    if (not defined $currentqueue or $currentqueue ne $qname) {
 
29
        $currentqueue = $qname;
 
30
        %lrms_queue = ();
 
31
        $running = undef;
 
32
    }
 
33
}
 
34
 
 
35
##########################################
 
36
# Private subs
 
37
##########################################
 
38
sub db_conn(){
 
39
    my $dbh = DBI->connect('DBI:mysql:ATLAS;host=localhost','','',{RaiseError=>1});
 
40
    return $dbh;
 
41
}
 
42
 
 
43
sub get_total_cpus(){
 
44
    my $dbh = db_conn();
 
45
    my $sth = $dbh->prepare('select sum(p_ncpus) from host where expavg_credit>0');
 
46
    $sth->execute();
 
47
    my $result = $sth->fetchrow_array();
 
48
    if(defined($result)){return $result;}
 
49
    else{ return 0;}
 
50
}
 
51
sub get_max_cpus(){
 
52
    my $dbh = db_conn();
 
53
    my $sth = $dbh->prepare('select sum(p_ncpus) from host');
 
54
    $sth->execute();
 
55
    my $result = $sth->fetchrow_array();
 
56
    if(defined($result)){return $result;}
 
57
    else{ return 0;}
 
58
}
 
59
sub get_jobs_in_que(){
 
60
    my $dbh = db_conn();
 
61
    my $sth = $dbh->prepare('select count(*) from result where server_state=2');
 
62
    $sth->execute();
 
63
    my $result = $sth->fetchrow_array();
 
64
    if(defined($result)){return $result;}
 
65
    else{ return 0;}
 
66
}
 
67
sub get_jobs_in_run(){
 
68
    my $dbh = db_conn();
 
69
    my $sth = $dbh->prepare('select count(*) from result where server_state=4');
 
70
    $sth->execute();
 
71
    my $result = $sth->fetchrow_array();
 
72
    if(defined($result)){return $result;}
 
73
    else{ return 0;}
 
74
}
 
75
 
 
76
############################################
 
77
# Public subs
 
78
#############################################
 
79
 
 
80
sub cluster_info ($) {
 
81
    my ($config) = shift;
 
82
 
 
83
    my (%lrms_cluster);
 
84
 
 
85
    $lrms_cluster{lrms_type} = "boinc";
 
86
    $lrms_cluster{lrms_version} = "1";
 
87
 
 
88
    # only enforcing per-process cputime limit
 
89
    $lrms_cluster{has_total_cputime_limit} = 0;
 
90
 
 
91
    my ($total_cpus) = get_total_cpus();
 
92
    my ($max_cpus) = get_max_cpus();
 
93
    $lrms_cluster{totalcpus} = $total_cpus;
 
94
 
 
95
    $lrms_cluster{cpudistribution} = $lrms_cluster{totalcpus}."cpu:1";
 
96
 
 
97
    my $que_jobs = get_jobs_in_que();
 
98
    my $run_jobs = get_jobs_in_run();
 
99
    $lrms_cluster{usedcpus} = $run_jobs;
 
100
 
 
101
    $lrms_cluster{runningjobs} = $lrms_cluster{usedcpus};
 
102
 
 
103
    $lrms_cluster{queuedcpus} = $max_cpus-$total_cpus;
 
104
    $lrms_cluster{queuedjobs} = $que_jobs;
 
105
    $lrms_cluster{queue} = [ ];
 
106
    return %lrms_cluster;
 
107
}
 
108
 
 
109
sub queue_info ($$) {
 
110
    my ($config) = shift;
 
111
    my ($qname) = shift;
 
112
 
 
113
    init_globals($qname);
 
114
 
 
115
    my ($total_cpus) = get_total_cpus();
 
116
    my ($max_cpus) = get_max_cpus();
 
117
    my $que_jobs = get_jobs_in_que();
 
118
    my $running = get_jobs_in_run();
 
119
    if (defined $running) {
 
120
        # job_info was already called, we know exactly how many grid jobs
 
121
        # are running
 
122
        $lrms_queue{running} = $running;
 
123
 
 
124
    } else {
 
125
        # assuming that the submitted grid jobs are cpu hogs, approximate
 
126
        # the number of running jobs with the number of running processes
 
127
 
 
128
        $lrms_queue{running}= 0;
 
129
    }
 
130
    $lrms_queue{totalcpus} = $total_cpus;
 
131
 
 
132
    $lrms_queue{status} = $lrms_queue{totalcpus}-$lrms_queue{running};
 
133
 
 
134
    # reserve negative numbers for error states
 
135
    # Fork is not real LRMS, and cannot be in error state
 
136
    if ($lrms_queue{status}<0) {
 
137
        debug("lrms_queue{status} = $lrms_queue{status}");
 
138
        $lrms_queue{status} = 0;
 
139
    }
 
140
 
 
141
    my $job_limit;
 
142
    $job_limit = 1000;
 
143
 
 
144
    $lrms_queue{maxrunning} = $job_limit;
 
145
    $lrms_queue{maxuserrun} = $job_limit;
 
146
    $lrms_queue{maxqueuable} = $job_limit;
 
147
 
 
148
    $lrms_queue{maxcputime} = "";
 
149
 
 
150
    $lrms_queue{queued} = $que_jobs;
 
151
    $lrms_queue{mincputime} = "";
 
152
    $lrms_queue{defaultcput} = "";
 
153
    $lrms_queue{minwalltime} = "";
 
154
    $lrms_queue{defaultwallt} = "";
 
155
    $lrms_queue{maxwalltime} = $lrms_queue{maxcputime};
 
156
 
 
157
    return %lrms_queue;
 
158
}
 
159
 
 
160
 
 
161
sub jobs_info ($$@) {
 
162
    my ($config) = shift;
 
163
    my ($qname) = shift;
 
164
    my ($jids) = shift;
 
165
 
 
166
    init_globals($qname);
 
167
 
 
168
    my (%lrms_jobs);
 
169
 
 
170
    foreach my $id (@$jids){
 
171
        $lrms_jobs{$id}{nodes} = [ hostname ];
 
172
        $lrms_jobs{$id}{mem} = 2000000000;
 
173
        $lrms_jobs{$id}{walltime} = "";
 
174
        $lrms_jobs{$id}{cputime} = "";
 
175
        $lrms_jobs{$id}{status} = 'R';
 
176
        $lrms_jobs{$id}{comment} = [ "LRMS: Running under boinc" ];
 
177
 
 
178
        $lrms_jobs{$id}{reqwalltime} = "";
 
179
        $lrms_jobs{$id}{reqcputime} = "";   
 
180
        $lrms_jobs{$id}{rank} = "0";
 
181
        $lrms_jobs{$id}{cpus} = "1"; 
 
182
    }
 
183
 
 
184
    return %lrms_jobs;
 
185
}
 
186
 
 
187
 
 
188
sub users_info($$@) {
 
189
    my ($config) = shift;
 
190
    my ($qname) = shift;
 
191
    my ($accts) = shift;
 
192
 
 
193
    init_globals($qname);
 
194
 
 
195
    my (%lrms_users);
 
196
 
 
197
    # freecpus
 
198
    # queue length
 
199
 
 
200
    if ( ! exists $lrms_queue{status} ) {
 
201
        %lrms_queue = queue_info( $config, $qname );
 
202
    }
 
203
    
 
204
    foreach my $u ( @{$accts} ) {
 
205
        $lrms_users{$u}{freecpus} = $lrms_queue{maxuserrun} - $lrms_queue{running};        
 
206
        $lrms_users{$u}{queuelength} = "$lrms_queue{queued}";
 
207
    }
 
208
    return %lrms_users;
 
209
}
 
210
              
 
211
1;