#!/usr/bin/perl
use strict;
use warnings;

=head1 NAME

foreach_shard

=head1 SYNOPSIS

    bin/foreach_shard protected/ppcHelloWorld.pl [ ARG1 [ ARG2 ... ] ]

=head1 DESCRIPTION

Запускает команду, переданную в командной строке, для каждого шарда. Скрипту
дополнительным параметром указывается --shard-id N Несколько процессов
запускаются параллельно, foreach_shard завершается, когда завершатся они все.

Код выхода: если все подпроцессы завершились успешно (вышли с кодом 0), 0. Если
хотя бы один завершился неуспешно, код выхода одного из неуспешно завершившихся
подпроцессов.

=cut

use Yandex::Shell;

use my_inc '..', for => 'protected';
use Settings;
use ShardingTools;

my $cmd = join( ' ', map { yash_quote($_) } @ARGV );
die "Missing required argument: command\n" unless $cmd;

my @child_pids;
foreach my $shard ( ppc_shards() ) {
    if ( my $pid = fork() ) {
        push @child_pids, $pid;
    } else {
        print "shard $shard: starting\n";

        no warnings 'exec';
        my $system_result = system "$cmd --shard-id $shard";
        if ( $system_result == -1 ) {
            die "failed to start $cmd --shard-id $shard: $!";
        }

        my $child_exit_code = $system_result >> 8;
        print "shard $shard: finished (exit code: $child_exit_code)\n";
        exit $child_exit_code;
    }
}

my $exit_code = 0;
foreach my $pid (@child_pids) {
    waitpid($pid, 0);
    my $child_exit_code = $? >> 8;
    $exit_code = $child_exit_code if $child_exit_code;
}

exit $exit_code;
