mirror of
https://github.com/pgbackrest/pgbackrest.git
synced 2024-12-14 10:13:05 +02:00
c733319063
Contributed by Cynthia Shang.
98 lines
2.9 KiB
Perl
98 lines
2.9 KiB
Perl
####################################################################################################################################
|
|
# COMMON LOCK MODULE
|
|
####################################################################################################################################
|
|
package pgBackRest::Common::Lock;
|
|
|
|
use strict;
|
|
use warnings FATAL => qw(all);
|
|
use Carp qw(confess);
|
|
|
|
use Exporter qw(import);
|
|
our @EXPORT = qw();
|
|
use Fcntl qw(:DEFAULT :flock);
|
|
use File::Basename qw(dirname);
|
|
|
|
use pgBackRest::Common::Exception;
|
|
use pgBackRest::Common::Log;
|
|
use pgBackRest::Common::String;
|
|
use pgBackRest::Common::Wait;
|
|
use pgBackRest::Config::Config;
|
|
use pgBackRest::Storage::Helper;
|
|
|
|
####################################################################################################################################
|
|
# lockStopFileName
|
|
#
|
|
# Get the stop file name.
|
|
####################################################################################################################################
|
|
sub lockStopFileName
|
|
{
|
|
my $strStanza = shift;
|
|
|
|
return cfgOption(CFGOPT_LOCK_PATH) . (defined($strStanza) ? "/${strStanza}" : '/all') . '.stop';
|
|
}
|
|
|
|
####################################################################################################################################
|
|
# lockStopTest
|
|
#
|
|
# Test if a stop file exists for the current stanza or all stanzas.
|
|
####################################################################################################################################
|
|
sub lockStopTest
|
|
{
|
|
# Assign function parameters, defaults, and log debug info
|
|
my
|
|
(
|
|
$strOperation,
|
|
$bStanzaStopRequired,
|
|
) =
|
|
logDebugParam
|
|
(
|
|
__PACKAGE__ . '::lockStopTest', \@_,
|
|
{name => 'bStanzaStopRequired', optional => true, default => false}
|
|
);
|
|
|
|
my $bStopExists = false;
|
|
|
|
# Check the stanza first if it is specified
|
|
if (cfgOptionTest(CFGOPT_STANZA))
|
|
{
|
|
# Generate the stop file name
|
|
my $strStopFile = lockStopFileName(cfgOption(CFGOPT_STANZA));
|
|
|
|
if (-e $strStopFile)
|
|
{
|
|
# If the stop file exists and is required then set the flag to true
|
|
if ($bStanzaStopRequired)
|
|
{
|
|
$bStopExists = true;
|
|
}
|
|
else
|
|
{
|
|
confess &log(ERROR, 'stop file exists for stanza ' . cfgOption(CFGOPT_STANZA), ERROR_STOP);
|
|
}
|
|
}
|
|
}
|
|
|
|
# If not looking for a specific stanza stop file, then check all stanzas
|
|
if (!$bStanzaStopRequired)
|
|
{
|
|
# Now check all stanzas
|
|
my $strStopFile = lockStopFileName();
|
|
|
|
if (-e $strStopFile)
|
|
{
|
|
confess &log(ERROR, 'stop file exists for all stanzas', ERROR_STOP);
|
|
}
|
|
}
|
|
|
|
# Return from function and log return values if any
|
|
return logDebugReturn
|
|
(
|
|
$strOperation,
|
|
{name => 'bStopExists', value => $bStopExists}
|
|
);
|
|
}
|
|
|
|
push @EXPORT, qw(lockStopTest);
|
|
|
|
1;
|