LOCAL.pm 2.56 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
sub count_running_workers {
    my $self = shift @_;

Leo Gordon's avatar
Leo Gordon committed
27
    my $cmd = 'ps x | grep runWorker.pl | grep -v "grep runWorker.pl" | wc -l';
28 29 30 31 32 33 34
    my $run_count = qx/$cmd/;
    chomp($run_count);

    return $run_count;
}


35
sub status_of_all_our_workers { # returns a hashref
36 37
    my ($self) = @_;

Leo Gordon's avatar
Leo Gordon committed
38
    my $cmd = 'ps x -o state,pid,command -w -w | grep runWorker.pl | grep -v "grep runWorker.pl" ';
39 40 41 42 43 44 45 46 47 48 49

        # 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);

50 51 52 53 54 55 56 57 58 59 60
        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
61 62 63 64 65 66 67 68

        # 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;
}

69

70
sub check_worker_is_alive_and_mine {
71 72
    my ($self, $worker) = @_;

73 74 75 76 77
    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;
78 79
}

80

81
sub kill_worker {
82
    my $worker = pop @_;
83

84 85
    my $cmd = 'kill -9 '.$worker->process_id();
    system($cmd);
86 87
}

88

89
sub submit_workers {
90
    my ($self, $worker_cmd, $worker_count, $iteration, $rc_name, $rc_parameters) = @_;
91

Leo Gordon's avatar
Leo Gordon committed
92
    my $cmd = "$worker_cmd &";
93 94 95

    foreach (1..$worker_count) {
        print "SUBMITTING_CMD:\t\t$cmd\n";
Leo Gordon's avatar
Leo Gordon committed
96
        system( $cmd );
97 98 99 100
    }
}

1;