Skip to content

Commit

Permalink
Implement delete target backup for Greenplum (#1350)
Browse files Browse the repository at this point in the history
  • Loading branch information
usernamedt committed Oct 3, 2022
1 parent 07c2734 commit 8ecfcbb
Show file tree
Hide file tree
Showing 17 changed files with 477 additions and 149 deletions.
37 changes: 30 additions & 7 deletions cmd/gp/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,34 +49,57 @@ func runDeleteBefore(cmd *cobra.Command, args []string) {
folder, err := internal.ConfigureFolder()
tracelog.ErrorLogger.FatalOnError(err)

deleteHandler, err := greenplum.NewDeleteHandler(folder)
delArgs := greenplum.DeleteArgs{Confirmed: confirmed}
deleteHandler, err := greenplum.NewDeleteHandler(folder, delArgs)
tracelog.ErrorLogger.FatalOnError(err)

deleteHandler.HandleDeleteBefore(args, confirmed)
deleteHandler.HandleDeleteBefore(args)
}

func runDeleteRetain(cmd *cobra.Command, args []string) {
folder, err := internal.ConfigureFolder()
tracelog.ErrorLogger.FatalOnError(err)

deleteHandler, err := greenplum.NewDeleteHandler(folder)
delArgs := greenplum.DeleteArgs{Confirmed: confirmed}
deleteHandler, err := greenplum.NewDeleteHandler(folder, delArgs)
tracelog.ErrorLogger.FatalOnError(err)

deleteHandler.HandleDeleteRetain(args, confirmed)
deleteHandler.HandleDeleteRetain(args)
}

func runDeleteEverything(cmd *cobra.Command, args []string) {
folder, err := internal.ConfigureFolder()
tracelog.ErrorLogger.FatalOnError(err)

deleteHandler, err := greenplum.NewDeleteHandler(folder)
delArgs := greenplum.DeleteArgs{Confirmed: confirmed}
deleteHandler, err := greenplum.NewDeleteHandler(folder, delArgs)
tracelog.ErrorLogger.FatalOnError(err)

deleteHandler.HandleDeleteEverything(args, confirmed)
deleteHandler.HandleDeleteEverything(args)
}

func runDeleteTarget(cmd *cobra.Command, args []string) {
tracelog.ErrorLogger.Fatalf("wal-g delete target is not supported for greenplum (yet)")
folder, err := internal.ConfigureFolder()
tracelog.ErrorLogger.FatalOnError(err)

findFullBackup := false
modifier := internal.ExtractDeleteTargetModifierFromArgs(args)
if modifier == internal.FindFullDeleteModifier {
findFullBackup = true
// remove the extracted modifier from args
args = args[1:]
}

delArgs := greenplum.DeleteArgs{Confirmed: confirmed, FindFull: findFullBackup}
deleteHandler, err := greenplum.NewDeleteHandler(folder, delArgs)
tracelog.ErrorLogger.FatalOnError(err)

targetBackupSelector, err := internal.CreateTargetDeleteBackupSelector(
cmd, args, deleteTargetUserData, greenplum.NewGenericMetaFetcher())
tracelog.ErrorLogger.FatalOnError(err)

target := deleteHandler.FindTargetBySelector(targetBackupSelector)
deleteHandler.DeleteTarget(target)
}

func init() {
Expand Down
3 changes: 2 additions & 1 deletion cmd/mysql/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,8 @@ func runDeleteTarget(cmd *cobra.Command, args []string) {
backupSelector, err := internal.NewBackupNameSelector(bname, true) //todo: add selection by userdata
tracelog.ErrorLogger.PrintOnError(err)

deleteHandler.HandleDeleteTarget(backupSelector, confirmed, false)
target := deleteHandler.FindTargetBySelector(backupSelector)
deleteHandler.HandleDeleteTarget(target, confirmed, false)
}

func runDeleteBefore(cmd *cobra.Command, args []string) {
Expand Down
4 changes: 3 additions & 1 deletion cmd/pg/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,9 @@ func runDeleteTarget(cmd *cobra.Command, args []string) {
tracelog.ErrorLogger.FatalOnError(err)
targetBackupSelector, err := internal.CreateTargetDeleteBackupSelector(cmd, args, deleteTargetUserData, postgres.NewGenericMetaFetcher())
tracelog.ErrorLogger.FatalOnError(err)
deleteHandler.HandleDeleteTarget(targetBackupSelector, confirmed, findFullBackup)

target := deleteHandler.FindTargetBySelector(targetBackupSelector)
deleteHandler.HandleDeleteTarget(target, confirmed, findFullBackup)
}

func runDeleteGarbage(cmd *cobra.Command, args []string) {
Expand Down
1 change: 1 addition & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ services:
&& mkdir -p /export/deletewithoutconfirm
&& mkdir -p /export/deleteendtoendbucket
&& mkdir -p /export/deletetargetbucket
&& mkdir -p /export/gpdeletetargetbucket
&& mkdir -p /export/deletegarbagebucket
&& mkdir -p /export/mysqlfullxtrabackupbucket
&& mkdir -p /export/mysqlfullxtrabackupwithrangesbucket
Expand Down
2 changes: 1 addition & 1 deletion docker/gp_tests/scripts/configs/common_config.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"AWS_ENDPOINT": "http://s3:9000",
"PGDATABASE": "postgres",
"AWS_S3_FORCE_PATH_STYLE": "true",
"WALG_COMPRESSION_METHOD": "brotli",
"WALG_COMPRESSION_METHOD": "lz4",
"WALG_PGP_KEY_PATH": "/tmp/PGP_KEY",
"WALG_GP_SEG_POLL_INTERVAL": "5s",
"WALG_GP_SEG_UPD_INTERVAL": "1s",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
"WALG_DELTA_MAX_STEPS": "100",
"WALE_S3_PREFIX": "s3://gpdeletetargetbucket",
"WALG_LOG_LEVEL": "DEVEL"
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
"WALG_DELTA_MAX_STEPS": "100",
"WALE_S3_PREFIX": "s3://gpdeletetargetbucket",
"WALG_LOG_LEVEL": "DEVEL"
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
"WALG_DELTA_MAX_STEPS": "1",
"WALE_S3_PREFIX": "s3://gpdeletetargetbucket",
"WALG_LOG_LEVEL": "DEVEL"
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
#!/bin/bash
set -e -x
CONFIG_FILE="/tmp/configs/delete_target_delta_find_full_test_config.json"

COMMON_CONFIG="/tmp/configs/common_config.json"
TMP_CONFIG="/tmp/configs/tmp_config.json"
cat ${CONFIG_FILE} > ${TMP_CONFIG}
echo "," >> ${TMP_CONFIG}
cat ${COMMON_CONFIG} >> ${TMP_CONFIG}
/tmp/pg_scripts/wrap_config_file.sh ${TMP_CONFIG}
source /tmp/tests/test_functions/util.sh

bootstrap_gp_cluster
sleep 3
setup_wal_archiving
enable_pitr_extension

wal-g --config=${TMP_CONFIG} delete everything FORCE --confirm

# create full backup and incremental
for i in 1 2
do
insert_data
wal-g --config=${TMP_CONFIG} backup-push
done

# remember the backup-list output
# later in the test we create new backups which should be deleted so lists should be identical
wal-g --config=${TMP_CONFIG} backup-list
lines_before_delete=`wal-g --config=${TMP_CONFIG} backup-list | wc -l`
wal-g --config=${TMP_CONFIG} backup-list | tail -n 2 > /tmp/list_before_delete

# create one full and two increments
for i in 1 2 3
do
if [ $i -eq 1 ]; then
modifier='--full'
else
modifier=''
fi
insert_data
wal-g --config=${TMP_CONFIG} backup-push ${modifier}
done

# get the name of the second incremental backup
SECOND_INCREMENT=$(wal-g --config=${TMP_CONFIG} backup-list | awk 'NR==5 {print $1}')

# make two increments from the SECOND_INCREMENT
insert_data
wal-g --config=${TMP_CONFIG} backup-push

insert_data
wal-g --config=${TMP_CONFIG} backup-push

# delete the SECOND_INCREMENT with FIND_FULL, should leave only the first full backup w/ first increment
wal-g --config=${TMP_CONFIG} delete target FIND_FULL ${SECOND_INCREMENT} --confirm

wal-g --config=${TMP_CONFIG} backup-list

lines_after_delete=`wal-g --config=${TMP_CONFIG} backup-list | wc -l`
wal-g --config=${TMP_CONFIG} backup-list | tail -n 2 > /tmp/list_after_delete

if [ $(($lines_before_delete)) -ne $lines_after_delete ];
then
echo $(($lines_before_delete)) > /tmp/before_delete
echo $lines_after_delete > /tmp/after_delete
echo "Wrong number of deleted lines"
diff /tmp/before_delete /tmp/after_delete
fi

diff /tmp/list_before_delete /tmp/list_after_delete
cleanup
rm ${TMP_CONFIG}
72 changes: 72 additions & 0 deletions docker/gp_tests/scripts/tests/delete_target_delta_test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#!/bin/bash
set -e -x
CONFIG_FILE="/tmp/configs/delete_target_delta_test_config.json"

COMMON_CONFIG="/tmp/configs/common_config.json"
TMP_CONFIG="/tmp/configs/tmp_config.json"
cat ${CONFIG_FILE} > ${TMP_CONFIG}
echo "," >> ${TMP_CONFIG}
cat ${COMMON_CONFIG} >> ${TMP_CONFIG}
/tmp/pg_scripts/wrap_config_file.sh ${TMP_CONFIG}
source /tmp/tests/test_functions/util.sh

bootstrap_gp_cluster
sleep 3
setup_wal_archiving
enable_pitr_extension

wal-g --config=${TMP_CONFIG} delete everything FORCE --confirm

# create full backup and incremental
for i in 1 2
do
insert_data
wal-g --config=${TMP_CONFIG} backup-push
done

# remember the name of the first increment
FIRST_INCREMENT=$(wal-g --config=${TMP_CONFIG} backup-list | awk 'END {print $1}')

# make the second full backup
wal-g --config=${TMP_CONFIG} backup-push --full

# make the increment from the second full backup
insert_data
wal-g --config=${TMP_CONFIG} backup-push

# remember the backup-list output with two full backups and two increments.
# later in the test we create new backups which should be deleted so lists should be identical
lines_before_delete=`wal-g --config=${TMP_CONFIG} backup-list | wc -l`
wal-g --config=${TMP_CONFIG} backup-list | tail -n 4 > /tmp/list_before_delete

# now make increment from the FIRST_INCREMENT, which will be deleted later
insert_data
wal-g --config=${TMP_CONFIG} backup-push --delta-from-name ${FIRST_INCREMENT}
INCREMENT_TO_DELETE=$(wal-g --config=${TMP_CONFIG} backup-list | awk 'END {print $1}')

# make the increment from the INCREMENT_TO_DELETE
insert_data
wal-g --config=${TMP_CONFIG} backup-push --delta-from-name ${INCREMENT_TO_DELETE}

# make one more increment from the INCREMENT_TO_DELETE
insert_data
wal-g --config=${TMP_CONFIG} backup-push --delta-from-name ${INCREMENT_TO_DELETE}

# delete the INCREMENT_TO_DELETE, should leave only the first full backup w/ first increment and the second full backup w/ first increment
wal-g --config=${TMP_CONFIG} delete target ${INCREMENT_TO_DELETE} --confirm

lines_after_delete=`wal-g --config=${TMP_CONFIG} backup-list | wc -l`
wal-g --config=${TMP_CONFIG} backup-list | tail -n 4 > /tmp/list_after_delete

if [ $(($lines_before_delete)) -ne $lines_after_delete ];
then
echo $(($lines_before_delete)) > /tmp/before_delete
echo $lines_after_delete > /tmp/after_delete
echo "Wrong number of deleted lines"
diff /tmp/before_delete /tmp/after_delete
fi


diff /tmp/list_before_delete /tmp/list_after_delete
cleanup
rm ${TMP_CONFIG}
47 changes: 47 additions & 0 deletions docker/gp_tests/scripts/tests/delete_target_test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#!/bin/bash
set -e -x
CONFIG_FILE="/tmp/configs/delete_target_test_config.json"

COMMON_CONFIG="/tmp/configs/common_config.json"
TMP_CONFIG="/tmp/configs/tmp_config.json"
cat ${CONFIG_FILE} > ${TMP_CONFIG}
echo "," >> ${TMP_CONFIG}
cat ${COMMON_CONFIG} >> ${TMP_CONFIG}
/tmp/pg_scripts/wrap_config_file.sh ${TMP_CONFIG}
source /tmp/tests/test_functions/util.sh

bootstrap_gp_cluster
sleep 3
setup_wal_archiving
enable_pitr_extension

wal-g --config=${TMP_CONFIG} delete everything FORCE --confirm

for i in 1 2 3 4 5
do
insert_data
wal-g --config=${TMP_CONFIG} backup-push
done

lines_before_delete=`wal-g --config=${TMP_CONFIG} backup-list | wc -l`
wal-g --config=${TMP_CONFIG} backup-list | tail -n 3 > /tmp/list_before_delete

FULL_BACKUP=$(wal-g --config=${TMP_CONFIG} backup-list | awk 'NR==2{print $1}')

wal-g --config=${TMP_CONFIG} delete target ${FULL_BACKUP} --confirm

lines_after_delete=`wal-g --config=${TMP_CONFIG} backup-list | wc -l`
wal-g --config=${TMP_CONFIG} backup-list | tail -n 3 > /tmp/list_after_delete

if [ $(($lines_before_delete-2)) -ne $lines_after_delete ];
then
echo $(($lines_before_delete-2)) > /tmp/before_delete
echo $lines_after_delete > /tmp/after_delete
echo "Wrong number of deleted lines"
diff /tmp/before_delete /tmp/after_delete
fi


diff /tmp/list_before_delete /tmp/list_after_delete
cleanup
rm ${TMP_CONFIG}
Empty file modified docker/gp_tests/scripts/tests/delta_backup_test.sh
100644 → 100755
Empty file.
12 changes: 7 additions & 5 deletions internal/databases/greenplum/backup.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,18 +38,20 @@ func (backup *Backup) GetSentinel() (BackupSentinelDto, error) {
return sentinelDto, nil
}

func (backup *Backup) GetSegmentBackup(backupID string, contentID int) (*postgres.Backup, error) {
func (backup *Backup) GetSegmentBackup(backupID string, contentID int) (SegBackup, error) {
selector, err := internal.NewUserDataBackupSelector(NewSegmentUserDataFromID(backupID).String(), postgres.NewGenericMetaFetcher())
if err != nil {
return nil, err
return SegBackup{}, err
}
segBackupsFolder := backup.rootFolder.GetSubFolder(FormatSegmentStoragePrefix(contentID))

backupName, err := selector.Select(segBackupsFolder)
if err != nil {
return nil, fmt.Errorf("failed to select matching backup for id %s from subfolder %s: %w", backupID, segBackupsFolder.GetPath(), err)
return SegBackup{}, fmt.Errorf(
"failed to select matching backup for id %s from subfolder %s: %w",
backupID, segBackupsFolder.GetPath(), err)
}

segmentBackup := postgres.NewBackup(segBackupsFolder.GetSubFolder(utility.BaseBackupPath), backupName)
return &segmentBackup, nil
pgBackup := postgres.NewBackup(segBackupsFolder.GetSubFolder(utility.BaseBackupPath), backupName)
return ToGpSegBackup(pgBackup), nil
}

0 comments on commit 8ecfcbb

Please sign in to comment.