TakTuk

Adaptive large scale remote executions deployment
TakTuk


USER MANUAL


NAME

TakTuk::Pilot - Perl module that ease taktuk(1) execution and related I/O management


SYNOPSIS

  use TakTuk::Pilot;
  
  our @line_counter;
  
  sub output_callback(%) {
      my %parameters = @_;
      my $field = $parameters{fields};
      my $rank = $field->{rank};
      my $argument = $parameters{argument};
  
      $argument->[$rank] = 1 unless defined($argument->[$rank]);
      print "$field->{host}-$rank : ".
            "$argument->[$rank] > $field->{line}\n";
      $argument->[$rank]++;
  }
  
  sub user_input_callback(%) {
      my %parameters = @_;
      my $taktuk = $parameters{taktuk};
      my $descriptor = $parameters{filehandle};
      my $buffer;
  
      my $result = sysread($descriptor, $buffer, 1024);
      warn "Read error $!" if not defined($result);
      # basic parsing, we assume input is buffered on a line basis
      chomp($buffer);
  
      if (length($buffer)) {
          print "Executing $buffer\n";
          $taktuk->send_command("broadcast exec [ $buffer ]");
      }
      if (not $result) {
          print "Terminating\n";
          $taktuk->remove_descriptor(type=>'read',
                                     filehandle=>$descriptor);
          $taktuk->send_termination();
      }
  }
  
  die "This script requieres as arguments hostnames to contact\n"
      unless scalar(@ARGV);
  
  my $taktuk = TakTuk::Pilot->new();
  $taktuk->add_callback(callback=>\&output_callback, stream=>'output',
                        argument=>\@line_counter,
                        fields=>['host', 'rank', 'line']);
  $taktuk->add_descriptor(type=>'read', filehandle=>\*STDIN,
                          callback=>\&user_input_callback);
  $taktuk->run(command=>"taktuk -s -m ".join(" -m ", @ARGV));


DESCRIPTION

The TakTuk::Pilot Perl module ease the use of TakTuk from within a Perl program (see taktuk(1) for a detailed description of TakTuk). It transparently manages I/O exchanges as well as TakTuk data demultiplexing and decoding.


CONSTRUCTOR

new()

Creates a new TakTuk object on which the following method can be called.


METHODS

add_callback(%)

Adds a callback function associated to some TakTuk output stream to the calling TakTuk object. This callback function will be called by TakTuk::Pilot for each batch of output data incoming from the related stream. The hash passed as argument to this function call may contain the following fields:

  callback => reference to the callback fonction (mandatory)
  stream   => stream related to this callback, might be
              'default' (mandatory)
  fields   => reference to an array of fields names relevant
              to the user
  argument => scalar that should be passed to each callback
              function call

The callback function should accept a hash as argument. This hash will be populated with the following fields :

  taktuk   => reference to the taktuk object calling this
              callback
  argument => scalar given at callback addition or undef
  stream   => stream on which output data came
  fields   => reference to a hash containing a
              fieldname/value pair for each field requested
              upon callback addition
send_command($)

Sends to the calling TakTuk object the command passed as argument. Note that if the TakTuk object is not running, this command will be buffered and executed upon run.

send_termination()

Sends to the calling TakTuk object a termination command. As for send_command, if the TakTuk object is not running, this command will be issued upon run.

run(%)

Runs TakTuk, executing pending commands and waiting for TakTuk output. Note that this function is blocking: it waits for TakTuk outputs, possibly calls related callback functions and returns when TakTuk terminates. Thus, all TakTuk commands should be given either before calling run or within a callback function.

This commands takes a hash as argument that may contain the following fields:

  command => TakTuk command line to be executed
  timeout => optional timeout on the wait for TakTuk output

Upon occurence of the timeout (if one has been given), run will returns an ETMOUT error code. Note the in this case TakTuk execution will not be terminated and should be resumed at some point by calling continue.

continue()

Resumes a TakTuk execution interrupted by timeout occurence.

add_descriptor(%)

Because the call to run is blocking, waiting for TakTuk output, it might be interesting to let the TakTuk::Pilot module monitor I/O occurence related to other file descriptors. This is the intent of add_descriptor. This function takes a hash as parameter in which the following fields might be defined:

  type       => 'read', 'write' or 'exception', this is the
                type of I/O possiblities that should be
                monitored on the descriptor, as in select
                system call (mandatory).
  filehandle => file descriptor to monitor (mandatory).
  callback   => reference to the callback function that
                should be called when I/O is possible on the
                file descriptor.
  argument   => optional scalar value that will be passed
                with each call to the callback function

The callback function should also accept a hash as an argument in which the following fields will be defined:

  taktuk     => reference to the TakTuk object from which
                the function was called.
  type       => type of I/O occuring (as in add_callback)
  filehandle => the related file descriptor. Notice that the
                user is in charge of performing the I/O
                operation itslef (sysread or syswrite).
                Notice also that, because of the use of a
                select in TakTuk::Pilot, the use of buffered
                I/O on this descriptor is strongly discouraged
  argument   => the argument that was given to add_descriptor
remove_descriptor(%)

Function that should be called to remove from the TakTuk object a descriptor previously added with add_descriptor. It takes a hash as argument in which the following fields may be defined:

  type       => type of I/O (see add_descriptor)
  filehandle => file descriptor to remove
quiet() / verbose()

Change verbosity of TakTuk::Pilot on STDOUT (default is quiet). Should not be called when TakTuk is running.

create_session()

Call setsid in the TakTuk process created by run. The main purpose of this call is to prevent TakTuk from receiving signals sent to the process group to which the pilot belong. Should not be called when TakTuk is running.

pid()

Returns the pid of the process spawned to run TakTuk. Should only be called when TakTuk is running.

error_msg($)

Static function. Returns a character string that corresponds to the error code given as argument. The error code should be one of the values returned by other TakTuk::Pilot functions (add_callback, send_command, send_termination, ...).


ERRORS

When an error occur in one of these functions, it returns a non nul numeric error code. This code can take one of the following values:

TakTuk::Pilot::EARGCM

Field 'command' is missing in a call to run.

TakTuk::Pilot::EARGCB

Field 'callback' is missing in a call to add_callback or add_descriptor.

TakTuk::Pilot::EARGFH

Field 'filehandle' is missing in a call to add_descriptor or remove_descriptor.

TakTuk::Pilot::EARGTP

Field 'type' is missing in a call to add_descriptor or remove_descriptor.

TakTuk::Pilot::ETMOUT

A timeout occured in a call to run.

TakTuk::Pilot::ETKTRN

TakTuk is alredy running but run, verbose or quiet has been called.

TakTuk::Pilot::ETKTNR

TakTuk is not running but continue has been called.

TakTuk::Pilot::ESPIPE

A call to pipe failed in TakTuk::Pilot (the error should be in $!).

TakTuk::Pilot::ESFORK

A call to fork failed in TakTuk::Pilot (the error should be in $!).

TakTuk::Pilot::ESCLOS

A call to close failed in TakTuk::Pilot (the error should be in $!).

TakTuk::Pilot::ESELEC

A call to select failed in TakTuk::Pilot (the error should be in $!).

TakTuk::Pilot::ETPBUG

Internal bug detected in TakTuk::Pilot.


SEE ALSO

tatkuk(1), taktukcomm(3), TakTuk(3)


AUTHOR

The original concept of TakTuk has been proposed by Cyrille Martin in his PhD thesis. People involved in this work include Jacques Briat, Olivier Richard, Thierry Gautier and Guillaume Huard.

The author of the version 3 (perl version) and current maintainer of the package is Guillaume Huard.


COPYRIGHT

The TakTuk communication interface library is provided under the terms of the GNU General Public License version 2 or later.

POLARIS INRIA Project team