LOCAL.pm 2.8 KB
Newer Older
1 2 3 4 5 6 7
# This is the 'Local' implementation of Meadow

package Bio::EnsEMBL::Hive::Meadow::LOCAL;

use strict;
use Sys::Hostname;

Leo Gordon's avatar
Leo Gordon committed
8
use base ('Bio::EnsEMBL::Hive::Meadow');
9

10

11
sub name {  # also called to check for availability; for the moment assume LOCAL meadow is always available
12

13
    return (split(/\./, hostname))[0];     # only take the first name
14 15 16
}


17 18 19 20 21 22
sub get_current_worker_process_id {
    my ($self) = @_;

    return $$;
}

23

24 25 26 27 28 29 30
sub count_pending_workers_by_rc_name {
    my ($self) = @_;

    return ({}, 0);     # LOCAL has no concept of pending workers
}


31 32 33
sub count_running_workers {
    my $self = shift @_;

Leo Gordon's avatar
Leo Gordon committed
34
    my $cmd = 'ps x | grep runWorker.pl | grep -v "grep runWorker.pl" | wc -l';
35 36 37 38 39 40 41
    my $run_count = qx/$cmd/;
    chomp($run_count);

    return $run_count;
}


42
sub status_of_all_our_workers { # returns a hashref
43 44
    my ($self) = @_;

Leo Gordon's avatar
Leo Gordon committed
45
    my $cmd = 'ps x -o state,pid,command -w -w | grep runWorker.pl | grep -v "grep runWorker.pl" ';
46 47 48 49 50 51 52 53 54 55 56

        # FIXME: if we want to incorporate Meadow->pipeline_name() filtering here,
        #        a dummy parameter to the runWorker.pl should probably be introduced
        #        for 'ps' to be able to externally differentiate between local workers
        #        working for different hives
        #        (but at the moment such a feature is unlikely to be be in demand).

    my %status_hash = ();
    foreach my $line (`$cmd`) {
        my ($pre_status, $worker_pid, $job_name) = split(/\s+/, $line);

57 58 59 60 61 62 63 64 65 66 67
        my $status = {
            'R' => 'RUN',   # running

            'S' => 'RUN',   # sleeping (sleeping for less than 20 sec on a Mac)
            'I' => 'RUN',   # Mac: idle (sleeping for more than 20 sec)

            'D' => 'RUN',   # Linux: uninterruptible sleep, usually IO
            'U' => 'RUN',   # Mac: uninterruptible wait

            'T' => 'SSUSP'  # stopped process
        }->{ substr($pre_status,0,1) }; # only take the first character because of Mac's additional modifiers
68 69 70 71 72 73 74 75

        # Note: you can locally 'kill -19' a worker to suspend it and 'kill -18' a worker to resume it

        $status_hash{$worker_pid} = $status;
    }
    return \%status_hash;
}

76

77
sub check_worker_is_alive_and_mine {
78 79
    my ($self, $worker) = @_;

80 81 82 83 84
    my $wpid = $worker->process_id();
    my $cmd = qq{ps x | grep $wpid | grep -v 'grep $wpid'};
    my $is_alive_and_mine = qx/$cmd/;

    return $is_alive_and_mine;
85 86
}

87

88
sub kill_worker {
89
    my $worker = pop @_;
90

91 92
    my $cmd = 'kill -9 '.$worker->process_id();
    system($cmd);
93 94
}

95

96
sub submit_workers {
97
    my ($self, $worker_cmd, $required_worker_count, $iteration, $rc_name, $rc_specific_submission_cmd_args, $submit_stdout_file, $submit_stderr_file) = @_;
98

Leo Gordon's avatar
Leo Gordon committed
99
    my $cmd = "$worker_cmd &";
100

101 102
    foreach (1..$required_worker_count) {
        print "SUBMITTING_CMD:\t\t$rc_specific_submission_cmd_args $cmd\n";
Leo Gordon's avatar
Leo Gordon committed
103
        system( $cmd );
104 105 106 107
    }
}

1;