From 18931f3912915c3097a590d5bb67764bd7b013a4 Mon Sep 17 00:00:00 2001 From: mlycore Date: Fri, 17 Nov 2023 19:10:25 +0800 Subject: [PATCH] refactor: optimize cancel backup Signed-off-by: mlycore --- pitr/cli/internal/cmd/backup.go | 80 ++++++++++++++++++---------- pitr/cli/internal/cmd/backup_test.go | 4 +- 2 files changed, 54 insertions(+), 30 deletions(-) diff --git a/pitr/cli/internal/cmd/backup.go b/pitr/cli/internal/cmd/backup.go index 45d292cb..1592a771 100644 --- a/pitr/cli/internal/cmd/backup.go +++ b/pitr/cli/internal/cmd/backup.go @@ -105,8 +105,11 @@ func init() { // 7. Double check backups all finished // nolint:gocognit func backup() error { - var err error - var lsBackup *model.LsBackup + var ( + err error + lsBackup *model.LsBackup + cancel bool + ) proxy, err := pkg.NewShardingSphereProxy(Username, Password, pkg.DefaultDBName, Host, Port) if err != nil { return xerr.NewCliErr(fmt.Sprintf("Connect shardingsphere proxy failed, err: %s", err)) @@ -119,14 +122,20 @@ func backup() error { defer func() { if err != nil { - logging.Warn("Try to unlock cluster ...") + if !cancel { + logging.Warn("Try to unlock cluster ...") + } if err := proxy.Unlock(); err != nil { logging.Error(fmt.Sprintf("Since backup failed, try to unlock cluster, but still failed. err: %s", err)) } if lsBackup != nil { - logging.Warn("Try to delete backup data ...") - deleteBackupFiles(ls, lsBackup) + if cancel { + deleteBackupFiles(ls, lsBackup, deleteModeQuiet) + } else { + logging.Warn("Try to delete backup data ...") + deleteBackupFiles(ls, lsBackup, deleteModeNormal) + } } } }() @@ -166,6 +175,7 @@ func backup() error { "Are you sure to continue? (Y/N)") err = getUserApproveInTerminal(prompt) if err != nil { + cancel = true return xerr.NewCliErr(fmt.Sprintf("%s", err)) } @@ -434,7 +444,14 @@ func doCheck(as pkg.IAgentServer, sn *model.StorageNode, backupID string, retrie return backupInfo.Status, nil } -func deleteBackupFiles(ls pkg.ILocalStorage, lsBackup *model.LsBackup) { +type deleteMode int + +const ( + deleteModeNormal deleteMode = iota + deleteModeQuiet +) + +func deleteBackupFiles(ls pkg.ILocalStorage, lsBackup *model.LsBackup, m deleteMode) { var ( dataNodeMap = make(map[string]*model.DataNode) totalNum = len(lsBackup.SsBackup.StorageNodes) @@ -456,7 +473,9 @@ func deleteBackupFiles(ls pkg.ILocalStorage, lsBackup *model.LsBackup) { sn := sn dn, ok := dataNodeMap[sn.IP] if !ok { - logging.Warn(fmt.Sprintf("SKIPPED! data node %s:%d not found in backup info.", sn.IP, sn.Port)) + if m != deleteModeQuiet { + logging.Warn(fmt.Sprintf("SKIPPED! data node %s:%d not found in backup info.", sn.IP, sn.Port)) + } continue } as := pkg.NewAgentServer(fmt.Sprintf("%s:%d", convertLocalhost(sn.IP), AgentPort)) @@ -464,36 +483,41 @@ func deleteBackupFiles(ls pkg.ILocalStorage, lsBackup *model.LsBackup) { go doDelete(as, sn, dn, resultCh, pw) } - time.Sleep(time.Millisecond * 100) - for pw.IsRenderInProgress() { - if pw.LengthActive() == 0 { - pw.Stop() - } + if m != deleteModeQuiet { + time.Sleep(time.Millisecond * 100) - } + for pw.IsRenderInProgress() { + if pw.LengthActive() == 0 { + pw.Stop() + } + time.Sleep(time.Millisecond * 100) + } - close(resultCh) + close(resultCh) - t := table.NewWriter() - t.SetOutputMirror(os.Stdout) - t.SetTitle("Delete Backup Files Result") - t.AppendHeader(table.Row{"#", "Node IP", "Node Port", "Result", "Message"}) - t.SetColumnConfigs([]table.ColumnConfig{{Number: 5, WidthMax: 50}}) - - idx := 0 - for result := range resultCh { - idx++ - t.AppendRow([]interface{}{idx, result.IP, result.Port, result.Status, result.Msg}) - t.AppendSeparator() - } + t := table.NewWriter() + t.SetOutputMirror(os.Stdout) + t.SetTitle("Delete Backup Files Result") + t.AppendHeader(table.Row{"#", "Node IP", "Node Port", "Result", "Message"}) + t.SetColumnConfigs([]table.ColumnConfig{{Number: 5, WidthMax: 50}}) - t.Render() + idx := 0 + for result := range resultCh { + idx++ + t.AppendRow([]interface{}{idx, result.IP, result.Port, result.Status, result.Msg}) + t.AppendSeparator() + } + + t.Render() + } if err := ls.DeleteByName(filename); err != nil { logging.Warn("Delete backup info file failed") } - logging.Info("Delete backup files finished") + if m != deleteModeQuiet { + logging.Info("Delete backup files finished") + } } func doDelete(as pkg.IAgentServer, sn *model.StorageNode, dn *model.DataNode, resultCh chan *model.DeleteBackupResult, pw progress.Writer) { diff --git a/pitr/cli/internal/cmd/backup_test.go b/pitr/cli/internal/cmd/backup_test.go index 4bced1fd..0a503c76 100644 --- a/pitr/cli/internal/cmd/backup_test.go +++ b/pitr/cli/internal/cmd/backup_test.go @@ -439,7 +439,7 @@ var _ = Describe("test backup mock", func() { It("should delete failed", func() { ls.EXPECT().DeleteByName(gomock.Any()).Return(errors.New("failed")) - deleteBackupFiles(ls, bak) + deleteBackupFiles(ls, bak, deleteModeNormal) }) It("should delete success", func() { @@ -453,7 +453,7 @@ var _ = Describe("test backup mock", func() { defer ctrl.Finish() as.EXPECT().DeleteBackup(gomock.Any()).Return(nil) ls.EXPECT().DeleteByName(gomock.Any()).Return(nil) - deleteBackupFiles(ls, bak) + deleteBackupFiles(ls, bak, deleteModeNormal) }) }) })