Changeset 184

Show
Ignore:
Timestamp:
09/08/10 21:25:28 (4 years ago)
Author:
depesz
Message:

add new option - customizable handling of pg_controldata errors

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/omnipitr/doc/changes.pod

    r182 r184  
    11=head1 OmniPITR 
     2 
     3=head2 2010-09-08 
     4 
     5=over 
     6 
     7=item * Add option to handle various ways of dealing with problems with calls to 
     8pg_controldata (--error-pgcontroldata) to omnipitr-restore 
     9 
     10=back 
    211 
    312=head2 2010-09-07 
  • trunk/omnipitr/lib/OmniPITR/Program.pm

    r182 r184  
    174174    my $self = shift; 
    175175 
     176    my $control_data = {}; 
     177 
     178    my $handle; 
     179    if (   ( !defined $self->{ 'error-pgcontroldata' } ) 
     180        || ( 'break' eq $self->{ 'error-pgcontroldata' } ) ) 
     181    { 
     182        $handle = sub { 
     183            $self->log->fatal( @_ ); 
     184        }; 
     185    } 
     186    elsif ( 'ignore' eq $self->{ 'error-pgcontroldata' } ) { 
     187        $handle = sub { 
     188            $self->log->error( @_ ); 
     189        }; 
     190    } 
     191    else { 
     192        $handle = sub { 
     193            $self->log->error( @_ ); 
     194            sleep 600 while 1; 
     195        }; 
     196    } 
     197 
    176198    $self->prepare_temp_directory(); 
    177199 
     
    181203    } 
    182204 
    183     my $control_data = {}; 
    184  
    185205    my @lines = split( /\s*\n/, $response->{ 'stdout' } ); 
    186206    for my $line ( @lines ) { 
    187207        unless ( $line =~ m{\A([^:]+):\s*(.*)\z} ) { 
    188             $self->log->fatal( 'Pg_controldata for %s contained unparseable line: [%s]. Full response: %s', $self->{ 'data-dir' }, $line, $response ); 
     208            $handle->( 'Pg_controldata for %s contained unparseable line: [%s]. Full response: %s', $self->{ 'data-dir' }, $line, $response ); 
     209            return undef; 
    189210        } 
    190211        $control_data->{ $1 } = $2; 
     
    192213 
    193214    unless ( $control_data->{ "Latest checkpoint's REDO location" } ) { 
    194         $self->log->fatal( 'Pg_controldata for %s did not contain latest checkpoint redo location. Full response: %s', $self->{ 'data-dir' }, $response ); 
     215        $handle->( 'Pg_controldata for %s did not contain latest checkpoint redo location. Full response: %s', $self->{ 'data-dir' }, $response ); 
     216        return undef; 
    195217    } 
    196218    unless ( $control_data->{ "Latest checkpoint's TimeLineID" } ) { 
    197         $self->log->fatal( 'Pg_controldata for %s did not contain latest checkpoint timeline ID. Full response: %s', $self->{ 'data-dir' }, $response ); 
     219        $handle->( 'Pg_controldata for %s did not contain latest checkpoint timeline ID. Full response: %s', $self->{ 'data-dir' }, $response ); 
     220        return undef; 
    198221    } 
    199222 
  • trunk/omnipitr/lib/OmniPITR/Program/Restore.pm

    r175 r184  
    246246    my $self = shift; 
    247247 
     248    if ( $self->{ 'pause-removal-till' } ) { 
     249        return if time() < $self->{ 'pause-removal-till' }; 
     250        delete $self->{ 'pause-removal-till' }; 
     251    } 
     252 
    248253    my $ret; 
    249     eval { 
    250         $ret = $self->SUPER::get_control_data(); 
    251     }; 
    252     return if $EVAL_ERROR; 
    253     return $ret; 
     254    eval { $ret = $self->SUPER::get_control_data(); }; 
     255    if (   ( !$EVAL_ERROR ) 
     256        && ( $ret ) ) 
     257    { 
     258        return $ret; 
     259    } 
     260 
     261    $self->{ 'pause-removal-till' } = time() + 5 * 60; 
     262    return; 
    254263} 
    255264 
     
    400409 
    401410    my %args = ( 
    402         'bzip2-path'         => 'bzip2', 
    403         'data-dir'           => '.', 
    404         'gzip-path'          => 'gzip', 
    405         'lzma-path'          => 'lzma', 
    406         'pgcontroldata-path' => 'pg_controldata', 
    407         'remove-at-a-time'   => 3, 
    408         'temp-dir'           => $ENV{ 'TMPDIR' } || '/tmp', 
     411        'bzip2-path'          => 'bzip2', 
     412        'data-dir'            => '.', 
     413        'gzip-path'           => 'gzip', 
     414        'lzma-path'           => 'lzma', 
     415        'pgcontroldata-path'  => 'pg_controldata', 
     416        'error-pgcontroldata' => 'break', 
     417        'remove-at-a-time'    => 3, 
     418        'temp-dir'            => $ENV{ 'TMPDIR' } || '/tmp', 
    409419    ); 
    410420 
     
    427437        'source|s=s', 
    428438        'temp-dir|t=s', 
     439        'error-pgcontroldata|ep=s', 
    429440        'verbose|v', 
    430441        ); 
     
    485496    $self->log->fatal( 'Given source (%s) is not writable',    $self->{ 'source' }->{ 'path' } ) unless -w $self->{ 'source' }->{ 'path' }; 
    486497 
     498    $self->log->fatal( 'Invalid error-pgcontroldata: %s.', $self->{ 'error-pgcontroldata' } ) unless $self->{ 'error-pgcontroldata' } =~ m{\A (?: break | ignore | hang ) \z}x; 
     499 
    487500    return; 
    488501}