From 5c347df505b8592cfaad0e0e7d2fe7826cd0f67f Mon Sep 17 00:00:00 2001 From: mlycore Date: Mon, 20 Nov 2023 22:01:37 +0800 Subject: [PATCH 1/3] refactor: refactor restore using PrettyPrinter Signed-off-by: mlycore --- pitr/cli/internal/cmd/restore.go | 79 +++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 28 deletions(-) diff --git a/pitr/cli/internal/cmd/restore.go b/pitr/cli/internal/cmd/restore.go index cee712ab..f4cfed74 100644 --- a/pitr/cli/internal/cmd/restore.go +++ b/pitr/cli/internal/cmd/restore.go @@ -21,7 +21,6 @@ import ( "fmt" "os" "strings" - "time" "github.com/apache/shardingsphere-on-cloud/pitr/cli/internal/pkg" "github.com/apache/shardingsphere-on-cloud/pitr/cli/internal/pkg/model" @@ -199,20 +198,35 @@ func execRestore(lsBackup *model.LsBackup) error { return xerr.NewCliErr(fmt.Sprintf("no storage node found, please check backup record [%s].", lsBackup.Info.ID)) } - pw := prettyoutput.NewPW(totalNum) + pw := prettyoutput.NewProgressPrinter(prettyoutput.ProgressPrintOption{ + NumTrackersExpected: totalNum, + }) + go pw.Render() for i := 0; i < totalNum; i++ { sn := lsBackup.SsBackup.StorageNodes[i] dn := dataNodeMap[sn.IP] as := pkg.NewAgentServer(fmt.Sprintf("%s:%d", convertLocalhost(sn.IP), AgentPort)) - go doRestore(as, sn, dn.BackupID, resultCh, pw) - } + backupInfo := &model.BackupInfo{ + ID: dn.BackupID, + } + task := &restoretask{ + As: as, + Sn: sn, + Dn: dn, + ResultCh: resultCh, + Backup: backupInfo, + } - time.Sleep(time.Millisecond * 100) - for pw.IsRenderInProgress() { - time.Sleep(time.Millisecond * 100) + tracker := &progress.Tracker{ + Message: fmt.Sprintf("Restore data to openGauss: %s", sn.IP), + } + pw.AppendTracker(tracker) + go pw.UpdateProgress(tracker, task.checkProgress) } + pw.BlockedRendered() + close(resultCh) for result := range resultCh { @@ -242,34 +256,43 @@ func execRestore(lsBackup *model.LsBackup) error { return nil } -func doRestore(as pkg.IAgentServer, sn *model.StorageNode, backupID string, resultCh chan *model.RestoreResult, pw progress.Writer) { - tracker := &progress.Tracker{Message: fmt.Sprintf("Restore data to openGauss: %s", sn.IP)} - result := "" +type restoretask struct { + As pkg.IAgentServer + Sn *model.StorageNode + Dn *model.DataNode + ResultCh chan *model.RestoreResult + Backup *model.BackupInfo + retries int +} +func (t *restoretask) checkProgress() (bool, error) { + var ( + err error + ) in := &model.RestoreIn{ - DBPort: sn.Port, - DBName: sn.Database, - Username: sn.Username, - Password: sn.Password, - Instance: defaultInstance, + DBPort: t.Sn.Port, + DBName: t.Sn.Database, + Username: t.Sn.Username, + Password: t.Sn.Password, + DnBackupID: t.Backup.ID, DnBackupPath: BackupPath, - DnBackupID: backupID, + Instance: defaultInstance, DnThreadsNum: ThreadsNum, } - pw.AppendTracker(tracker) - - if err := as.Restore(in); err != nil { - tracker.MarkAsErrored() - result = "Failed" - } else { - tracker.MarkAsDone() - result = "Completed" + r := &model.RestoreResult{ + IP: t.Sn.IP, + Port: t.Sn.Port, } - resultCh <- &model.RestoreResult{ - IP: sn.IP, - Port: sn.Port, - Status: result, + if err = t.As.Restore(in); err != nil { + r.Status = "Failed" + t.ResultCh <- r + return false, err } + + r.Status = "Completed" + t.ResultCh <- r + + return true, nil } From 8a2d305127b2791f34db9a38b56a5f6c3479d5c5 Mon Sep 17 00:00:00 2001 From: mlycore Date: Mon, 20 Nov 2023 22:15:52 +0800 Subject: [PATCH 2/3] refactor: refactor delete using PrettyPrint Signed-off-by: mlycore --- pitr/cli/internal/cmd/delete.go | 71 +++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 8 deletions(-) diff --git a/pitr/cli/internal/cmd/delete.go b/pitr/cli/internal/cmd/delete.go index 353f2b31..0b9b0899 100644 --- a/pitr/cli/internal/cmd/delete.go +++ b/pitr/cli/internal/cmd/delete.go @@ -20,7 +20,6 @@ package cmd import ( "fmt" "os" - "time" "github.com/apache/shardingsphere-on-cloud/pitr/cli/internal/pkg" "github.com/apache/shardingsphere-on-cloud/pitr/cli/internal/pkg/model" @@ -28,6 +27,7 @@ import ( "github.com/apache/shardingsphere-on-cloud/pitr/cli/pkg/logging" "github.com/apache/shardingsphere-on-cloud/pitr/cli/pkg/prettyoutput" "github.com/apache/shardingsphere-on-cloud/pitr/cli/pkg/promptutil" + "github.com/jedib0t/go-pretty/v6/progress" "github.com/jedib0t/go-pretty/v6/table" "github.com/spf13/cobra" @@ -152,7 +152,10 @@ func _execDelete(lsBackup *model.LsBackup) error { return nil } - pw := prettyoutput.NewPW(totalNum) + pw := prettyoutput.NewProgressPrinter(prettyoutput.ProgressPrintOption{ + NumTrackersExpected: totalNum, + }) + go pw.Render() for _, storagenode := range lsBackup.SsBackup.StorageNodes { @@ -162,15 +165,26 @@ func _execDelete(lsBackup *model.LsBackup) error { continue } else { as := pkg.NewAgentServer(fmt.Sprintf("%s:%d", convertLocalhost(sn.IP), AgentPort)) - go doDelete(as, sn, dn, resultCh, pw) + backupInfo := &model.BackupInfo{ + ID: dn.BackupID, + } + task := &deletetask{ + As: as, + Sn: sn, + Dn: dn, + ResultCh: resultCh, + Backup: backupInfo, + } + + tracker := &progress.Tracker{ + Message: fmt.Sprintf("Deleting backup files # %s:%d", sn.IP, sn.Port), + } + pw.AppendTracker(tracker) + go pw.UpdateProgress(tracker, task.checkProgress) } } - time.Sleep(time.Millisecond * 100) - - for pw.IsRenderInProgress() { - time.Sleep(time.Millisecond * 100) - } + pw.BlockedRendered() close(resultCh) @@ -200,3 +214,44 @@ func _execDelete(lsBackup *model.LsBackup) error { return nil } + +type deletetask struct { + As pkg.IAgentServer + Sn *model.StorageNode + Dn *model.DataNode + ResultCh chan *model.DeleteBackupResult + Backup *model.BackupInfo + retries int +} + +func (t *deletetask) checkProgress() (bool, error) { + var ( + err error + ) + in := &model.DeleteBackupIn{ + DBPort: t.Sn.Port, + DBName: t.Sn.Database, + Username: t.Sn.Username, + Password: t.Sn.Password, + BackupID: t.Backup.ID, + DnBackupPath: BackupPath, + Instance: defaultInstance, + } + + r := &model.DeleteBackupResult{ + IP: t.Sn.IP, + Port: t.Sn.Port, + } + + if err = t.As.DeleteBackup(in); err != nil { + r.Status = model.SsBackupStatusFailed + r.Msg = err.Error() + t.ResultCh <- r + return false, err + } + + r.Status = model.SsBackupStatusCompleted + t.ResultCh <- r + + return true, nil +} From 634ca60cb52c6207d038d51e461b64f11ddf0ea7 Mon Sep 17 00:00:00 2001 From: mlycore Date: Mon, 20 Nov 2023 22:25:26 +0800 Subject: [PATCH 3/3] chore: remove unused variable Signed-off-by: mlycore --- pitr/cli/internal/cmd/delete.go | 1 - pitr/cli/internal/cmd/restore.go | 1 - 2 files changed, 2 deletions(-) diff --git a/pitr/cli/internal/cmd/delete.go b/pitr/cli/internal/cmd/delete.go index 0b9b0899..5d8bb1ca 100644 --- a/pitr/cli/internal/cmd/delete.go +++ b/pitr/cli/internal/cmd/delete.go @@ -221,7 +221,6 @@ type deletetask struct { Dn *model.DataNode ResultCh chan *model.DeleteBackupResult Backup *model.BackupInfo - retries int } func (t *deletetask) checkProgress() (bool, error) { diff --git a/pitr/cli/internal/cmd/restore.go b/pitr/cli/internal/cmd/restore.go index f4cfed74..9a08f28f 100644 --- a/pitr/cli/internal/cmd/restore.go +++ b/pitr/cli/internal/cmd/restore.go @@ -262,7 +262,6 @@ type restoretask struct { Dn *model.DataNode ResultCh chan *model.RestoreResult Backup *model.BackupInfo - retries int } func (t *restoretask) checkProgress() (bool, error) {