This is an automated email from the ASF dual-hosted git repository.

miaoliyao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/shardingsphere-on-cloud.git


The following commit(s) were added to refs/heads/main by this push:
     new f4c140d  feat:add restore method and update AsyncExec func (#212)
f4c140d is described below

commit f4c140dff841a68c072e95174697a7db43ed9e92
Author: lltgo <[email protected]>
AuthorDate: Fri Feb 17 18:56:47 2023 +0800

    feat:add restore method and update AsyncExec func (#212)
---
 pitr/agent/internal/cons/error.go    |  1 +
 pitr/agent/internal/pkg/opengauss.go | 17 +++++++++++++++++
 pitr/agent/pkg/cmds/cmd.go           | 11 ++++++++---
 3 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/pitr/agent/internal/cons/error.go 
b/pitr/agent/internal/cons/error.go
index 3868f65..a617dde 100644
--- a/pitr/agent/internal/cons/error.go
+++ b/pitr/agent/internal/cons/error.go
@@ -32,4 +32,5 @@ var (
        InstanceNotExist       = xerror.New(10007, "The instance not exist.")
        StartOpenGaussFailed   = xerror.New(10008, "Failed to start opengauss.")
        StopOpenGaussFailed    = xerror.New(10009, "Failed to stop opengauss.")
+       RestoreFailed          = xerror.New(10010, "Failed to restore 
opengauss.")
 )
diff --git a/pitr/agent/internal/pkg/opengauss.go 
b/pitr/agent/internal/pkg/opengauss.go
index 5437995..3cf20f9 100644
--- a/pitr/agent/internal/pkg/opengauss.go
+++ b/pitr/agent/internal/pkg/opengauss.go
@@ -38,6 +38,7 @@ const (
        _backupFmt    = "gs_probackup backup --backup-path=%s --instance=%s 
--backup-mode=%s --pgdata=%s 2>&1"
        _showFmt      = "gs_probackup show --instance=%s --backup-path=%s 
--backup-id=%s --format=json 2>&1"
        _delBackupFmt = "gs_probackup delete --backup-path=%s --instance=%s 
--backup-id=%s 2>&1"
+       _restoreFmt   = "gs_probackup restore --backup-path=%s --instance=%s 
--backup-id=%s --pgdata=%s 2>&1"
 
        _initFmt   = "gs_probackup init --backup-path=%s 2>&1"
        _deinitFmt = "rm -r %s"
@@ -184,6 +185,22 @@ func (og *openGauss) Stop(pgData string) error {
        return nil
 }
 
+// Restore TODO:Dependent environments require integration testing
+func (og *openGauss) Restore(backupPath, instance, backupID, pgData string) 
error {
+       cmd := fmt.Sprintf(_restoreFmt, backupPath, instance, backupID, pgData)
+       outputs, err := cmds.AsyncExec(og.shell, cmd)
+
+       for output := range outputs {
+               if errors.Is(err, cons.CmdOperateFailed) {
+                       return fmt.Errorf("outputs get err=%s,wrap=%w", 
output.Error, cons.RestoreFailed)
+               }
+               if output.Error != nil {
+                       return fmt.Errorf("output.Error[%s] is not 
nil,wrap=%w", output.Error, cons.RestoreFailed)
+               }
+       }
+       return nil
+}
+
 func (og *openGauss) ignore(outputs chan *cmds.Output) {
        defer func() {
                _ = recover()
diff --git a/pitr/agent/pkg/cmds/cmd.go b/pitr/agent/pkg/cmds/cmd.go
index ebb6b89..2550d02 100644
--- a/pitr/agent/pkg/cmds/cmd.go
+++ b/pitr/agent/pkg/cmds/cmd.go
@@ -72,11 +72,16 @@ func AsyncExec(name string, args ...string) (chan *Output, 
error) {
                        }
 
                        if err = cmd.Wait(); err != nil {
-                               output <- &Output{
-                                       Error: err,
+                               if _, ok := err.(*exec.ExitError); ok {
+                                       output <- &Output{
+                                               Error: cons.CmdOperateFailed,
+                                       }
+                               } else {
+                                       output <- &Output{
+                                               Error: fmt.Errorf("cmd.Wait 
return err=%s,wrap=%w", err, cons.Internal),
+                                       }
                                }
                        }
-
                        return nil
                })(); err != nil {
                        // only panic err

Reply via email to