mirror of
https://github.com/cloudnative-pg/plugin-barman-cloud.git
synced 2026-09-04 22:22:21 +02:00
refactor: extract the empty WAL archive decision into a helper
The WAL archive hook and the restore job hook each derived, inline, whether to verify the archive destination before proceeding. Pull each decision into a small function so the operator-decision-versus-fallback logic can be exercised on its own. Behavior is unchanged: archiving still fails on a marker-file stat error, and restore still falls back to the Cluster annotation alone. Signed-off-by: Armando Ruocco <armando.ruocco@enterprisedb.com>
This commit is contained in:
parent
7efb2cdf56
commit
6fddc14398
@ -157,19 +157,13 @@ func (w WALServiceImplementation) Archive(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Step 2: Check if the archive location is safe to perform archiving.
|
// Step 2: Check if the archive location is safe to perform archiving.
|
||||||
// The operator owns the marker file's lifecycle, so a non-nil decision
|
checkEmptyWalArchive, err := resolveArchiveEmptyWalArchiveCheck(
|
||||||
// already accounts for it and is obeyed as-is. A nil value means an
|
request.CheckEmptyWalArchive,
|
||||||
// operator that predates this field; fall back to checking the marker
|
configuration.Cluster,
|
||||||
// file and Cluster annotation directly.
|
emptyWalArchiveFile,
|
||||||
var checkEmptyWalArchive bool
|
)
|
||||||
if request.CheckEmptyWalArchive != nil {
|
if err != nil {
|
||||||
checkEmptyWalArchive = *request.CheckEmptyWalArchive
|
return nil, err
|
||||||
} else {
|
|
||||||
checkFileExisting, err := fileutils.FileExists(emptyWalArchiveFile)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("while checking for empty wal archive check file %q: %w", emptyWalArchiveFile, err)
|
|
||||||
}
|
|
||||||
checkEmptyWalArchive = utils.IsEmptyWalArchiveCheckEnabled(&configuration.Cluster.ObjectMeta) && checkFileExisting
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if checkEmptyWalArchive {
|
if checkEmptyWalArchive {
|
||||||
@ -234,6 +228,31 @@ func (w WALServiceImplementation) Archive(
|
|||||||
return &wal.WALArchiveResult{}, nil
|
return &wal.WALArchiveResult{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// resolveArchiveEmptyWalArchiveCheck reports whether the WAL archive
|
||||||
|
// destination must be verified before archiving this segment.
|
||||||
|
//
|
||||||
|
// The operator owns the marker file's lifecycle, so when it sets the decision
|
||||||
|
// (non-nil) that value already accounts for the marker and is obeyed as-is. A
|
||||||
|
// nil value comes from an operator that predates this field, so we fall back to
|
||||||
|
// the previous logic: the Cluster annotation combined with the on-disk marker
|
||||||
|
// file.
|
||||||
|
func resolveArchiveEmptyWalArchiveCheck(
|
||||||
|
operatorDecision *bool,
|
||||||
|
cluster *cnpgv1.Cluster,
|
||||||
|
markerFilePath string,
|
||||||
|
) (bool, error) {
|
||||||
|
if operatorDecision != nil {
|
||||||
|
return *operatorDecision, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
markerFilePresent, err := fileutils.FileExists(markerFilePath)
|
||||||
|
if err != nil {
|
||||||
|
return false, fmt.Errorf("while checking for empty wal archive check file %q: %w", markerFilePath, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return utils.IsEmptyWalArchiveCheckEnabled(&cluster.ObjectMeta) && markerFilePresent, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Restore implements the WALService interface
|
// Restore implements the WALService interface
|
||||||
func (w WALServiceImplementation) Restore(
|
func (w WALServiceImplementation) Restore(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
|
|||||||
@ -290,24 +290,26 @@ func (impl *JobHookImpl) checkBackupDestination(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if we're ok to restore from the desired destination. Unlike
|
if resolveRestoreEmptyWalArchiveCheck(operatorCheckEmptyWalArchive, cluster) {
|
||||||
// archiving, restore is a one-shot operation that has never been gated
|
|
||||||
// on the first-archive marker file, so the only fallback needed here
|
|
||||||
// (for an operator that predates this field) is the Cluster annotation.
|
|
||||||
var checkEmptyWalArchive bool
|
|
||||||
if operatorCheckEmptyWalArchive != nil {
|
|
||||||
checkEmptyWalArchive = *operatorCheckEmptyWalArchive
|
|
||||||
} else {
|
|
||||||
checkEmptyWalArchive = utils.IsEmptyWalArchiveCheckEnabled(&cluster.ObjectMeta)
|
|
||||||
}
|
|
||||||
|
|
||||||
if checkEmptyWalArchive {
|
|
||||||
return common.CheckBackupDestination(ctx, barmanConfiguration, walArchiver, serverName)
|
return common.CheckBackupDestination(ctx, barmanConfiguration, walArchiver, serverName)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// resolveRestoreEmptyWalArchiveCheck reports whether the destination must be
|
||||||
|
// verified before restoring. When the operator sets the decision (non-nil) it
|
||||||
|
// is obeyed as-is; a nil value comes from an operator that predates this field,
|
||||||
|
// so we fall back to the Cluster annotation. Unlike archiving, restore is a
|
||||||
|
// one-shot operation that has never been gated on the first-archive marker
|
||||||
|
// file, so the annotation is the only fallback needed.
|
||||||
|
func resolveRestoreEmptyWalArchiveCheck(operatorDecision *bool, cluster *cnpgv1.Cluster) bool {
|
||||||
|
if operatorDecision != nil {
|
||||||
|
return *operatorDecision
|
||||||
|
}
|
||||||
|
return utils.IsEmptyWalArchiveCheckEnabled(&cluster.ObjectMeta)
|
||||||
|
}
|
||||||
|
|
||||||
// restoreCustomWalDir moves the current pg_wal data to the specified custom wal dir and applies the symlink
|
// restoreCustomWalDir moves the current pg_wal data to the specified custom wal dir and applies the symlink
|
||||||
// returns indicating if any changes were made and any error encountered in the process
|
// returns indicating if any changes were made and any error encountered in the process
|
||||||
func (impl JobHookImpl) restoreCustomWalDir(ctx context.Context) (bool, error) {
|
func (impl JobHookImpl) restoreCustomWalDir(ctx context.Context) (bool, error) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user