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

sunnianjun 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 8ce3577  refactor: adjust agent server to raw error and cli error 
display (#472)
8ce3577 is described below

commit 8ce35777ef8bb11cf32d2f06baa39bb577ef187b
Author: liyao <[email protected]>
AuthorDate: Thu Nov 23 11:39:53 2023 +0800

    refactor: adjust agent server to raw error and cli error display (#472)
    
    * feat: introduce RawError and middleware
    
    Signed-off-by: mlycore <[email protected]>
    
    * feat: introduce new errors
    
    Signed-off-by: mlycore <[email protected]>
    
    * refactor: using raw error and new error code
    
    Signed-off-by: mlycore <[email protected]>
    
    * refactor: using InvalidHttpRequestBody
    
    Signed-off-by: mlycore <[email protected]>
    
    * refactor: using raw error as cmd error
    
    Signed-off-by: mlycore <[email protected]>
    
    * fix: fix MvTempToPgData error handle
    
    Signed-off-by: mlycore <[email protected]>
    
    * feat: introduce http request raw error
    
    Signed-off-by: mlycore <[email protected]>
    
    * refactor: using unwrapped error
    
    Signed-off-by: mlycore <[email protected]>
    
    * chore: adjust style
    
    Signed-off-by: mlycore <[email protected]>
    
    * chore: adjust style
    
    Signed-off-by: mlycore <[email protected]>
    
    * chore: adjust style
    
    Signed-off-by: mlycore <[email protected]>
    
    * chore: adjust style
    
    Signed-off-by: mlycore <[email protected]>
    
    * chore: adjust style
    
    Signed-off-by: mlycore <[email protected]>
    
    * chore: adjust style
    
    Signed-off-by: mlycore <[email protected]>
    
    ---------
    
    Signed-off-by: mlycore <[email protected]>
---
 pitr/agent/internal/cons/error.go                  |  76 ++++++-----
 .../handler/middleware/uniform_err_resp.go         |  17 ++-
 pitr/agent/internal/handler/restore.go             |   9 +-
 pitr/agent/internal/handler/view/restore.go        |   2 +-
 pitr/agent/internal/pkg/opengauss.go               | 151 +++++++++++++--------
 pitr/agent/main.go                                 |   3 +-
 pitr/agent/pkg/cmds/cmd.go                         |  17 ++-
 pitr/agent/pkg/responder/resp.go                   |  13 +-
 pitr/cli/internal/cmd/backup.go                    |   6 +-
 pitr/cli/internal/cmd/restore.go                   |   2 +-
 pitr/cli/internal/pkg/agent-server.go              |  15 +-
 pitr/cli/internal/pkg/xerr/err.go                  |  15 +-
 12 files changed, 208 insertions(+), 118 deletions(-)

diff --git a/pitr/agent/internal/cons/error.go 
b/pitr/agent/internal/cons/error.go
index ff747ca..66a968e 100644
--- a/pitr/agent/internal/cons/error.go
+++ b/pitr/agent/internal/cons/error.go
@@ -22,35 +22,49 @@ import (
 )
 
 var (
-       Internal               = xerror.New(10000, "Internal error.")
-       InvalidHTTPHeader      = xerror.New(10001, "Invalid http header.")
-       DataNotFound           = xerror.New(10002, "Data not found.")
-       CmdOperateFailed       = xerror.New(10003, "Command operate failed.")
-       BackupPathAlreadyExist = xerror.New(10004, "The backup path already 
exists.")
-       NoPermission           = xerror.New(10005, "No permission to operate.")
-       InstanceAlreadyExist   = xerror.New(10006, "The instance already 
exist.")
-       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.")
-       InvalidDBPort          = xerror.New(10011, "Invalid db port or missing 
db port.")
-       MissingUsername        = xerror.New(10012, "Missing username")
-       MissingPassword        = xerror.New(10013, "Missing password.")
-       MissingDnBackupPath    = xerror.New(10014, "Missing dn backup path.")
-       InvalidDnThreadsNum    = xerror.New(10015, "Invalid dn threads num.")
-       MissingDnBackupMode    = xerror.New(10016, "Missing dn backup mode.")
-       InvalidDnBackupMode    = xerror.New(10017, "Invalid dn backup mode.")
-       MissingInstance        = xerror.New(10018, "Missing instance.")
-       MissingDnBackupID      = xerror.New(10019, "Missing dn backup id.")
-       BodyParseFailed        = xerror.New(10020, "Invalid http request body.")
-       MissingDBName          = xerror.New(10021, "Missing db name.")
-       DBConnectionFailed     = xerror.New(10022, "Database connection 
failed.")
-       UnmatchBackupID        = xerror.New(10023, "Unmatch any backup id.")
-       InvalidPgDataDir       = xerror.New(10024, "Invalid PGDATA dir.")
-       UnknownOgStatus        = xerror.New(10025, "Unknown openGauss status.")
-       MvPgDataToTempFailed   = xerror.New(10026, "Move pgdata dir to temp 
failed.")
-       MvTempToPgDataFailed   = xerror.New(10027, "Move temp dir to pgdata 
failed.")
-       CleanPgDataTempFailed  = xerror.New(10028, "Clean pgdata temp dir 
failed.")
-       MissingDiskPath        = xerror.New(10029, "Missing disk path.")
-       MissingBackupID        = xerror.New(10030, "Missing backup id.")
+       Internal                 = xerror.New(10000, "Agent server internal 
error.")
+       InvalidHTTPHeader        = xerror.New(10001, "Invalid http header.")
+       DataNotFound             = xerror.New(10002, "Data not found.")
+       CmdOperateFailed         = xerror.New(10003, "Command operate failed.")
+       BackupPathAlreadyExist   = xerror.New(10004, "The backup path already 
exists.")
+       NoPermission             = xerror.New(10005, "No permission to 
operate.")
+       InstanceAlreadyExist     = xerror.New(10006, "The instance already 
exist.")
+       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.")
+       InvalidDBPort            = xerror.New(10011, "Invalid db port or 
missing db port.")
+       MissingUsername          = xerror.New(10012, "Missing username")
+       MissingPassword          = xerror.New(10013, "Missing password.")
+       MissingDnBackupPath      = xerror.New(10014, "Missing dn backup path.")
+       InvalidDnThreadsNum      = xerror.New(10015, "Invalid dn threads num.")
+       MissingDnBackupMode      = xerror.New(10016, "Missing dn backup mode.")
+       InvalidDnBackupMode      = xerror.New(10017, "Invalid dn backup mode.")
+       MissingInstance          = xerror.New(10018, "Missing instance.")
+       MissingDnBackupID        = xerror.New(10019, "Missing dn backup id.")
+       BodyParseFailed          = xerror.New(10020, "Invalid http request 
body.")
+       MissingDBName            = xerror.New(10021, "Missing db name.")
+       DBConnectionFailed       = xerror.New(10022, "Database connection 
failed.")
+       UnmatchBackupID          = xerror.New(10023, "Unmatch any backup id.")
+       InvalidPgDataDir         = xerror.New(10024, "Invalid PGDATA dir.")
+       UnknownOgStatus          = xerror.New(10025, "Unknown openGauss 
status.")
+       MvPgDataToTempFailed     = xerror.New(10026, "Move pgdata dir to temp 
failed.")
+       MvTempToPgDataFailed     = xerror.New(10027, "Move temp dir to pgdata 
failed.")
+       CleanPgDataTempFailed    = xerror.New(10028, "Clean pgdata temp dir 
failed.")
+       MissingDiskPath          = xerror.New(10029, "Missing disk path.")
+       MissingBackupID          = xerror.New(10030, "Missing backup id.")
+       MissingDBInformation     = xerror.New(10031, "Missing db information.")
+       GetBackupIDFailed        = xerror.New(10032, "Get backup id failed.")
+       InvalidHTTPRequestBody   = xerror.New(10033, "Invalid http request 
body")
+       JSONUnmarshalFailed      = xerror.New(10034, "Json unmarshal failed.")
+       CmdAsyncBackupFailed     = xerror.New(10035, "Command `gs_probackup 
backup` failed.")
+       CmdShowBackupFailed      = xerror.New(10036, "Command `gs_probackup 
show` failed.")
+       CmdDeleteBackupFailed    = xerror.New(10037, "Command `gs_probackup 
delete` failed.")
+       CmdInitBackupFailed      = xerror.New(10038, "Command `gs_probackup 
init` failed.")
+       CmdAddInstanceFailed     = xerror.New(10039, "Command `gs_probackup 
add-instance` failed.")
+       CmdDelInstanceFailed     = xerror.New(10040, "Command `gs_probackup 
del-instance` failed.")
+       CmdStartOpenGaussFailed  = xerror.New(10041, "Command `gs_ctl start` 
failed.")
+       CmdStopOpenGaussFailed   = xerror.New(10042, "Command `gs_ctl stop` 
failed.")
+       CmdStatusOpenGaussFailed = xerror.New(10043, "Command `gs_ctl status` 
failed.")
+       CmdAsyncRestoreFailed    = xerror.New(10044, "Command `gs_ctl restore` 
failed.")
 )
diff --git a/pitr/agent/internal/handler/middleware/uniform_err_resp.go 
b/pitr/agent/internal/handler/middleware/uniform_err_resp.go
index 8bc064e..867ec50 100644
--- a/pitr/agent/internal/handler/middleware/uniform_err_resp.go
+++ b/pitr/agent/internal/handler/middleware/uniform_err_resp.go
@@ -36,10 +36,25 @@ func UniformErrResp(log logging.ILog) fiber.Handler {
                log.Fields(map[logging.FieldKey]string{
                        logging.ErrorKey:  err.Error(),
                        logging.RequestID: ctx.Get(cons.RequestID),
-               }).Error("UniformErrResp:an error occurred")
+               }).Error("UniformErrResp: an error occurred")
                if e, b := xerror.FromError(err); b {
                        return responder.Error(ctx, e)
                }
                return responder.Error(ctx, cons.Internal)
        }
 }
+
+func UniformRawErrResp(log logging.ILog) fiber.Handler {
+       return func(ctx *fiber.Ctx) error {
+               err := ctx.Next()
+               if err == nil {
+                       return nil
+               }
+               //nolint:exhaustive
+               log.Fields(map[logging.FieldKey]string{
+                       logging.ErrorKey:  err.Error(),
+                       logging.RequestID: ctx.Get(cons.RequestID),
+               }).Error("UniformErrResp: an error occurred")
+               return responder.RawError(ctx, err)
+       }
+}
diff --git a/pitr/agent/internal/handler/restore.go 
b/pitr/agent/internal/handler/restore.go
index 722d985..08d4fad 100644
--- a/pitr/agent/internal/handler/restore.go
+++ b/pitr/agent/internal/handler/restore.go
@@ -73,14 +73,17 @@ func Restore(ctx *fiber.Ctx) (err error) {
        defer func() {
                if status != "restore success" {
                        mvErr := pkg.OG.MvTempToPgData()
-                       err = fmt.Errorf("resotre failre[err=%s], 
pkg.OG.MvTempToPgData return err wrap: %w", err, mvErr)
+                       if mvErr != nil {
+                               err = fmt.Errorf("restore failure[err=%s], 
pkg.OG.MvTempToPgData return err: %s", err, mvErr)
+                               return
+                       }
+                       err = fmt.Errorf("restore failure[err=%s]", err)
+                       return
                }
        }()
 
        // restore data from backup
        if err = pkg.OG.Restore(in.DnBackupPath, in.Instance, in.DnBackupID, 
in.DnThreadsNum); err != nil {
-               efmt := "pkg.OG.Restore 
failure[path=%s,instance=%s,backupID=%s], err wrap: %w"
-               err = fmt.Errorf(efmt, in.DnBackupPath, in.Instance, 
in.DnBackupID, err)
                status = "restore failure"
                return
        }
diff --git a/pitr/agent/internal/handler/view/restore.go 
b/pitr/agent/internal/handler/view/restore.go
index 15f5f07..bbfc35c 100644
--- a/pitr/agent/internal/handler/view/restore.go
+++ b/pitr/agent/internal/handler/view/restore.go
@@ -33,7 +33,7 @@ type RestoreIn struct {
 //nolint:dupl
 func (in *RestoreIn) Validate() error {
        if in == nil {
-               return cons.Internal
+               return cons.InvalidHTTPRequestBody
        }
 
        if in.DBPort == 0 {
diff --git a/pitr/agent/internal/pkg/opengauss.go 
b/pitr/agent/internal/pkg/opengauss.go
index b1b8b13..21872c6 100644
--- a/pitr/agent/internal/pkg/opengauss.go
+++ b/pitr/agent/internal/pkg/opengauss.go
@@ -93,13 +93,15 @@ const (
        _showListFmt = "gs_probackup show --instance=%s --backup-path=%s 
--format=json 2>&1"
 
        _mvFmt = "mv %s %s"
+
+       _CmdErrorFmt = "cmds.Exec[shell=%s,cmd=%s] return err wrap: %s"
 )
 
 func (og *openGauss) AsyncBackup(backupPath, instanceName, backupMode string, 
threadsNum uint8, dbPort uint16) (string, error) {
        cmd := fmt.Sprintf(_backupFmt, backupPath, instanceName, backupMode, 
og.pgData, threadsNum, dbPort)
        outputs, err := cmds.AsyncExec(og.shell, cmd)
        if err != nil {
-               return "", fmt.Errorf("cmds.AsyncExec[shell=%s,cmd=%s] return 
err wrap: %w", og.shell, cmd, err)
+               return "", fmt.Errorf("cmds.AsyncExec[shell=%s,cmd=%s] return 
err wrap: %w", og.shell, cmd, cons.CmdAsyncBackupFailed)
        }
 
        for output := range outputs {
@@ -111,13 +113,15 @@ func (og *openGauss) AsyncBackup(backupPath, 
instanceName, backupMode string, th
                        Debug(fmt.Sprintf("AsyncBackup 
output[lineNo=%d,msg=%s,err=%v]", output.LineNo, output.Message, output.Error))
 
                if output.Error != nil {
-                       return "", fmt.Errorf("output.Error[%w] is not nil", 
output.Error)
+                       og.log.Error(fmt.Sprintf("output.Error[%s] is not nil", 
output.Error))
+                       return "", output.Error
                }
 
                // get the backup id from the first line
                bid, err := og.getBackupID(output.Message)
                if err != nil {
-                       return "", fmt.Errorf("og.getBackupID[source=%s] return 
err wrap: %w", output.Message, err)
+                       og.log.Error(fmt.Sprintf("og.getBackupID[source=%s] 
return err wrap: %s", output.Message, err))
+                       return "", err
                }
                // ignore other output
                go og.ignore(outputs)
@@ -126,36 +130,25 @@ func (og *openGauss) AsyncBackup(backupPath, 
instanceName, backupMode string, th
        return "", fmt.Errorf("unknow err")
 }
 
+//nolint:dupl
 func (og *openGauss) ShowBackup(backupPath, instanceName, backupID string) 
(*model.Backup, error) {
        cmd := fmt.Sprintf(_showFmt, instanceName, backupPath, backupID)
-       output, err := cmds.Exec(og.shell, cmd)
+       list, err := og.showbackup(cmd, instanceName)
        if err != nil {
-               return nil, fmt.Errorf("cmds.Exec[shell=%s,cmd=%s] return err 
wrap: %w", og.shell, cmd, err)
+               return nil, err
        }
-
-       var list []*model.BackupList
-       if err = json.Unmarshal([]byte(output), &list); err != nil {
-               return nil, fmt.Errorf("json.Unmarshal[output=%s] return err: 
%s, wrap: %w", output, err, cons.Internal)
-       }
-
-       for _, ins := range list {
-               if ins.Instance == instanceName {
-                       if len(ins.List) == 0 {
-                               return nil, fmt.Errorf("instance[name=%s], 
backupList[v=%+v], err wrap: %w", ins.Instance, list, cons.DataNotFound)
-                       }
-
-                       return ins.List[0], nil
-               }
+       if len(list) > 0 {
+               return list[0], nil
        }
-
-       return nil, fmt.Errorf("backupList[v=%+v], err wrap: %w", list, 
cons.DataNotFound)
+       return nil, err
 }
 
 func (og *openGauss) DelBackup(backupPath, instanceName, backupID string) 
error {
        cmd := fmt.Sprintf(_delBackupFmt, backupPath, instanceName, backupID)
        _, err := cmds.Exec(og.shell, cmd)
        if err != nil {
-               return fmt.Errorf("cmds.Exec[shell=%s,cmd=%s] return err wrap: 
%w", og.shell, cmd, err)
+               og.log.Error(fmt.Sprintf(_CmdErrorFmt, og.shell, cmd, err))
+               return err
        }
        return nil
 }
@@ -167,11 +160,14 @@ func (og *openGauss) Init(backupPath string) error {
        og.log.Debug(fmt.Sprintf("Init output[msg=%s,err=%v]", output, err))
 
        if errors.Is(err, cons.CmdOperateFailed) {
-               return fmt.Errorf("init backup path failure,err: %s, wrap: %w", 
err, cons.BackupPathAlreadyExist)
+               og.log.Error(fmt.Sprintf("init backup path failure,err: %s, 
wrap: %s", err, cons.BackupPathAlreadyExist))
+               return err
        }
        if err != nil {
-               return fmt.Errorf("cmds.Exec[shell=%s,cmd=%s] return err wrap: 
%w", og.shell, cmd, err)
+               og.log.Error(fmt.Sprintf(_CmdErrorFmt, og.shell, cmd, err))
+               return err
        }
+
        return nil
 }
 
@@ -182,7 +178,8 @@ func (og *openGauss) deinit(backupPath string) error {
 
        cmd := fmt.Sprintf(_rmDirFmt, backupPath)
        if _, err := cmds.Exec(og.shell, cmd); err != nil {
-               return fmt.Errorf("cmds.Exec[shell=%s,cmd=%s] return err wrap: 
%w", og.shell, cmd, err)
+               og.log.Error(fmt.Sprintf(_CmdErrorFmt, og.shell, cmd, err))
+               return err
        }
        return nil
 }
@@ -194,11 +191,14 @@ func (og *openGauss) AddInstance(backupPath, instance 
string) error {
        og.log.Debug(fmt.Sprintf("AddInstance[output=%s,err=%v]", output, err))
 
        if errors.Is(err, cons.CmdOperateFailed) {
-               return fmt.Errorf("add instance failure[output=%s], err: %s, 
wrap: %w", output, err, cons.InstanceAlreadyExist)
+               og.log.Error(fmt.Sprintf("add instance failure[output=%s], err: 
%s, wrap: %s", output, err, cons.InstanceAlreadyExist))
+               return err
        }
        if err != nil {
-               return fmt.Errorf("cmds.Exec[shell=%s,cmd=%s] return err wrap: 
%w", og.shell, cmd, err)
+               og.log.Error(fmt.Sprintf(_CmdErrorFmt, og.shell, cmd, 
cons.CmdAddInstanceFailed))
+               return err
        }
+
        return nil
 }
 
@@ -208,39 +208,47 @@ func (og *openGauss) DelInstance(backupPath, instance 
string) error {
        og.log.Debug(fmt.Sprintf("DelInstance[output=%s,err=%v]", output, err))
 
        if errors.Is(err, cons.CmdOperateFailed) {
-               return fmt.Errorf("delete instance failure[output=%s], err: %s, 
wrap: %w", output, err, cons.InstanceNotExist)
+               og.log.Error(fmt.Sprintf("delete instance failure[output=%s], 
err: %s, wrap: %s", output, err, cons.InstanceNotExist))
+               return err
        }
        if err != nil {
-               return fmt.Errorf("cmds.Exec[shell=%s,cmd=%s] return err wrap: 
%w", og.shell, cmd, err)
+               og.log.Error(fmt.Sprintf(_CmdErrorFmt, og.shell, cmd, 
cons.CmdDelInstanceFailed))
+               return err
        }
        return nil
 }
 
+//nolint:dupl
 func (og *openGauss) Start() error {
        cmd := fmt.Sprintf(_startOpenGaussFmt, og.pgData)
        output, err := cmds.Exec(og.shell, cmd)
        og.log.Debug(fmt.Sprintf("Start openGauss[output=%s]", output))
 
        if errors.Is(err, cons.CmdOperateFailed) {
-               return fmt.Errorf("start openGauss failure[output=%s], err: %s, 
wrap: %w", output, err, cons.StartOpenGaussFailed)
+               og.log.Error(fmt.Sprintf("start openGauss failure[output=%s], 
err: %s, wrap: %s", output, err, cons.StartOpenGaussFailed))
+               return err
        }
        if err != nil {
-               return fmt.Errorf("cmds.Exec[shell=%s,cmd=%s,output=%s] return 
err wrap: %w", og.shell, cmd, output, err)
+               og.log.Error(fmt.Sprintf("cmds.Exec[shell=%s,cmd=%s] output=%s 
return err wrap: %s", og.shell, cmd, output, cons.CmdStartOpenGaussFailed))
+               return err
        }
 
        return nil
 }
 
+//nolint:dupl
 func (og *openGauss) Stop() error {
        cmd := fmt.Sprintf(_stopOpenGaussFmt, og.pgData)
        output, err := cmds.Exec(og.shell, cmd)
        og.log.Debug(fmt.Sprintf("Stop openGauss[output=%s]", output))
 
        if errors.Is(err, cons.CmdOperateFailed) {
-               return fmt.Errorf("stop openGauss failure[output=%s], err: %s, 
wrap: %w", output, err, cons.StopOpenGaussFailed)
+               og.log.Error(fmt.Sprintf("stop openGauss failure[output=%s], 
err: %s, wrap: %s", output, err, cons.StopOpenGaussFailed))
+               return err
        }
        if err != nil {
-               return fmt.Errorf("cmds.Exec[shell=%s,cmd=%s,output=%s] return 
err wrap: %w", og.shell, cmd, output, err)
+               og.log.Error(fmt.Sprintf("cmds.Exec[shell=%s,cmd=%s] output=%s 
return err wrap: %s", og.shell, cmd, output, cons.CmdStopOpenGaussFailed))
+               return err
        }
 
        return nil
@@ -263,10 +271,12 @@ func (og *openGauss) Status() (string, error) {
                if strings.Contains(err.Error(), "no server running") {
                        return "Stopped", nil
                }
-               return "", fmt.Errorf("get openGauss status failure[output=%s], 
err: %s, wrap: %w", output, err, cons.StopOpenGaussFailed)
+               og.log.Error(fmt.Sprintf("get openGauss status 
failure[output=%s], err: %s, wrap: %s", output, err, cons.StopOpenGaussFailed))
+               return "", err
        }
        if err != nil {
-               return "", fmt.Errorf("cmds.Exec[shell=%s,cmd=%s,output=%s] 
return err wrap: %w", og.shell, cmd, output, err)
+               og.log.Error(fmt.Sprintf("cmds.Exec[shell=%s,cmd=%s] output=%s 
return err wrap: %s", og.shell, cmd, output, cons.CmdStatusOpenGaussFailed))
+               return "", err
        }
 
        if strings.Contains(output, "server is running") {
@@ -290,39 +300,51 @@ func (og *openGauss) Restore(backupPath, instance, 
backupID string, threadsNum u
                        }).
                        Debug(fmt.Sprintf("Restore 
openGauss[lineNo=%d,msg=%s]", output.LineNo, output.Message))
 
-               if errors.Is(err, cons.CmdOperateFailed) {
-                       return fmt.Errorf("cmds.AsyncExec[output=%s] return 
err: %s, wrap: %w", output.Message, output.Error, cons.RestoreFailed)
+               if err != nil {
+                       og.log.Error(fmt.Sprintf("cmds.AsyncExec[output=%s] 
return err: %s, wrap: %s", output.Message, output.Error, cons.RestoreFailed))
+                       return err
                }
+
                if output.Error != nil {
-                       return fmt.Errorf("cmds.AsyncExec outputs: Error[%s] is 
not nil, wrap: %w", output.Error, cons.RestoreFailed)
+                       og.log.Error(fmt.Sprintf("cmds.AsyncExec outputs: 
Error[%s] is not nil, wrap: %s", output.Error, cons.RestoreFailed))
+                       return output.Error
                }
        }
        return nil
 }
 
-func (og *openGauss) ShowBackupList(backupPath, instanceName string) 
([]*model.Backup, error) {
-       cmd := fmt.Sprintf(_showListFmt, instanceName, backupPath)
+//nolint:dupl
+func (og *openGauss) showbackup(cmd, instanceName string) ([]*model.Backup, 
error) {
        output, err := cmds.Exec(og.shell, cmd)
        if err != nil {
-               return nil, fmt.Errorf("cmds.Exec[shell=%s,cmd=%s] return err 
wrap: %w", og.shell, cmd, err)
+               og.log.Error(fmt.Sprintf(_CmdErrorFmt, og.shell, cmd, 
cons.CmdShowBackupFailed))
+               return nil, err
        }
 
        var list []*model.BackupList
        if err = json.Unmarshal([]byte(output), &list); err != nil {
-               return nil, fmt.Errorf("json.Unmarshal[output=%s] return err: 
%s, wrap: %w", output, err, cons.Internal)
+               og.log.Error(fmt.Sprintf("json.Unmarshal[output=%s] return err: 
%s, wrap: %s", output, err, cons.JSONUnmarshalFailed))
+               return nil, err
        }
 
        for _, ins := range list {
                if ins.Instance == instanceName {
                        if len(ins.List) == 0 {
-                               return nil, fmt.Errorf("instance[name=%s], 
backupList[v=%+v], err wrap: %w", ins.Instance, list, cons.DataNotFound)
+                               og.log.Error(fmt.Sprintf("instance[name=%s], 
backupList[v=%+v], err wrap: %s", ins.Instance, list, cons.DataNotFound))
+                               return nil, err
                        }
 
                        return ins.List, nil
                }
        }
 
-       return nil, fmt.Errorf("backupList[v=%+v], err wrap: %w", list, 
cons.DataNotFound)
+       og.log.Error(fmt.Sprintf("backupList[v=%+v], err wrap: %s", list, 
cons.DataNotFound))
+       return nil, err
+}
+
+func (og *openGauss) ShowBackupList(backupPath, instanceName string) 
([]*model.Backup, error) {
+       cmd := fmt.Sprintf(_showListFmt, instanceName, backupPath)
+       return og.showbackup(cmd, instanceName)
 }
 
 func (og *openGauss) ignore(outputs chan *cmds.Output) {
@@ -340,11 +362,14 @@ func (og *openGauss) getBackupID(msg string) (string, 
error) {
        re := regexp2.MustCompile("(?<=backup ID:\\s+)\\w+(?=,)", 0)
        match, err := re.FindStringMatch(msg)
        if err != nil {
-               return "", fmt.Errorf("unmatch any backup id[msg=%s], err: %s", 
msg, err)
+               og.log.Error(fmt.Sprintf("unmatch any backup id[msg=%s], err: 
%s", msg, err))
+               return "", err
        }
-       if match.Length == 0 {
-               return "", fmt.Errorf("unmatch any backup id,match.lenght is 0, 
err wrap: %w", cons.UnmatchBackupID)
+       if match == nil || match.Length == 0 {
+               og.log.Error(fmt.Sprintf("unmatch any backup id,match.lenght is 
0, err wrap: %s", cons.UnmatchBackupID))
+               return "", err
        }
+
        return match.String(), err
 }
 
@@ -353,16 +378,18 @@ func (og *openGauss) Auth(user, password, dbName string, 
dbPort uint16) error {
                strings.Trim(password, " ") == "" ||
                strings.Trim(dbName, " ") == "" ||
                dbPort == 0 {
-               return fmt.Errorf("invalid 
inputs[user=%s,password=%s,dbName=%s,dbPort=%d]", user, password, dbName, 
dbPort)
+               return fmt.Errorf("invalid 
inputs[user=%s,password=%s,dbName=%s,dbPort=%d], err wrap: %w", user, password, 
dbName, dbPort, cons.MissingDBInformation)
        }
 
        _og, err := gsutil.Open(user, password, dbName, dbPort)
        if err != nil {
-               return fmt.Errorf("gsutil.Open failure,err=%w", err)
+               og.log.Error(fmt.Sprintf("gsutil.Open failure,err=%s", err))
+               return err
        }
 
        if err := _og.Ping(); err != nil {
-               return fmt.Errorf("ping openGauss fail[user=%s,pw 
length=%d,dbName=%s], err wrap: %w", user, len(password), dbName, err)
+               og.log.Error(fmt.Sprintf("ping openGauss fail[user=%s,pw 
length=%d,dbName=%s], err wrap: %s", user, len(password), dbName, err))
+               return err
        }
 
        return nil
@@ -372,10 +399,12 @@ func (og *openGauss) MvPgDataToTemp() error {
        cmd := fmt.Sprintf(_mvFmt, og.pgData, og.pgDataTemp)
        _, err := cmds.Exec(og.shell, cmd)
        if errors.Is(err, cons.CmdOperateFailed) {
-               return fmt.Errorf("mv pgdata to temp dir failure, err: %s, 
wrap: %w", err, cons.MvPgDataToTempFailed)
+               og.log.Error(fmt.Sprintf("mv pgdata to temp dir failure, err: 
%s, wrap: %s", err, cons.MvPgDataToTempFailed))
+               return err
        }
        if err != nil {
-               return fmt.Errorf("cmds.Exec[shell=%s,cmd=%s] return err wrap: 
%w", og.shell, cmd, err)
+               og.log.Error(fmt.Sprintf(_CmdErrorFmt, og.shell, cmd, err))
+               return err
        }
 
        return nil
@@ -385,10 +414,12 @@ func (og *openGauss) MvTempToPgData() error {
        cmd := fmt.Sprintf(_mvFmt, og.pgDataTemp, og.pgData)
        _, err := cmds.Exec(og.shell, cmd)
        if errors.Is(err, cons.CmdOperateFailed) {
-               return fmt.Errorf("mv temp to pgdata dir failure, err: %s, 
wrap: %w", err, cons.MvTempToPgDataFailed)
+               og.log.Error(fmt.Sprintf("mv temp to pgdata dir failure, err: 
%s, wrap: %s", err, cons.MvTempToPgDataFailed))
+               return err
        }
        if err != nil {
-               return fmt.Errorf("cmds.Exec[shell=%s,cmd=%s] return err wrap: 
%w", og.shell, cmd, err)
+               og.log.Error(fmt.Sprintf(_CmdErrorFmt, og.shell, cmd, err))
+               return err
        }
        return nil
 }
@@ -397,10 +428,12 @@ func (og *openGauss) CleanPgDataTemp() error {
        cmd := fmt.Sprintf(_rmDirFmt, og.pgDataTemp)
        _, err := cmds.Exec(og.shell, cmd)
        if errors.Is(err, cons.CmdOperateFailed) {
-               return fmt.Errorf("clean pgdata temp dir failure, err: %s, 
wrap: %w", err, cons.CleanPgDataTempFailed)
+               og.log.Error(fmt.Sprintf("clean pgdata temp dir failure, err: 
%s, wrap: %s", err, cons.CleanPgDataTempFailed))
+               return err
        }
        if err != nil {
-               return fmt.Errorf("cmds.Exec[shell=%s,cmd=%s] return err wrap: 
%w", og.shell, cmd, err)
+               og.log.Error(fmt.Sprintf(_CmdErrorFmt, og.shell, cmd, err))
+               return err
        }
        return nil
 }
@@ -408,11 +441,13 @@ func (og *openGauss) CleanPgDataTemp() error {
 func (og *openGauss) CheckSchema(user, password, dbName string, dbPort uint16, 
schema string) error {
        _og, err := gsutil.Open(user, password, dbName, dbPort)
        if err != nil {
-               return fmt.Errorf("gsutil.Open failure, err wrap: %w", err)
+               og.log.Error(fmt.Sprintf("gsutil.Open failure, err wrap: %s", 
err))
+               return err
        }
 
        if err := _og.CheckSchema(schema); err != nil {
-               return fmt.Errorf("check openGauss schema 
fail[user=%s,dbName=%s, schema=%s], err wrap: %w", user, dbName, schema, err)
+               og.log.Error(fmt.Sprintf("check openGauss schema 
fail[user=%s,dbName=%s, schema=%s], err wrap: %s", user, dbName, schema, err))
+               return err
        }
        return nil
 }
diff --git a/pitr/agent/main.go b/pitr/agent/main.go
index 2147259..32eaf86 100644
--- a/pitr/agent/main.go
+++ b/pitr/agent/main.go
@@ -146,7 +146,8 @@ func SetupApp() {
 
        app.Use(
                middleware.Recover(logging.Log()),
-               middleware.UniformErrResp(logging.Log()),
+               // middleware.UniformErrResp(logging.Log()),
+               middleware.UniformRawErrResp(logging.Log()),
        )
 
        app.Get("/ping", func(ctx *fiber.Ctx) error {
diff --git a/pitr/agent/pkg/cmds/cmd.go b/pitr/agent/pkg/cmds/cmd.go
index c7d72b0..486148b 100644
--- a/pitr/agent/pkg/cmds/cmd.go
+++ b/pitr/agent/pkg/cmds/cmd.go
@@ -78,14 +78,13 @@ func AsyncExec(name string, args ...string) (chan *Output, 
error) {
 
                        if err = cmd.Wait(); err != nil {
                                if ee, ok := err.(*exec.ExitError); ok {
-                                       output <- &Output{
-                                               Error: fmt.Errorf("exec 
failure[ee=%s],wrap=%w", ee, cons.CmdOperateFailed),
-                                       }
-                               } else {
-                                       output <- &Output{
-                                               Error: fmt.Errorf("cmd.Wait 
return err=%s,wrap=%w", err, cons.Internal),
-                                       }
+                                       logging.Error(fmt.Sprintf("exec 
failure[ee=%s], wrap=%s", ee, cons.CmdOperateFailed))
                                }
+
+                               output <- &Output{
+                                       Error: fmt.Errorf("%s err: %s", 
cmd.String(), err),
+                               }
+
                        }
                        return nil
                })(); err != nil {
@@ -125,9 +124,9 @@ func Exec(name string, args ...string) (string, error) {
 
        if err = cmd.Wait(); err != nil {
                if ee, ok := err.(*exec.ExitError); ok {
-                       return "", fmt.Errorf("exec 
failure[ee=%s,stdout=%s],wrap=%w", ee, string(reader), cons.CmdOperateFailed)
+                       logging.Error(fmt.Sprintf("exec 
failure[ee=%s,stdout=%s]", ee, string(reader)))
                }
-               return "", cons.Internal
+               return "", fmt.Errorf("%s err: %s", cmd.String(), err)
        }
        return string(reader), nil
 }
diff --git a/pitr/agent/pkg/responder/resp.go b/pitr/agent/pkg/responder/resp.go
index 7a63524..8fcbeba 100644
--- a/pitr/agent/pkg/responder/resp.go
+++ b/pitr/agent/pkg/responder/resp.go
@@ -66,7 +66,18 @@ func Error(ctx *fiber.Ctx, e error) error {
        })
 }
 
-func ErrorWitData(ctx *fiber.Ctx, e error, data any) error {
+func RawError(ctx *fiber.Ctx, e error) error {
+       if e == nil {
+               return xerror.New(unknownErrCode, unknownErrMsg)
+       }
+       ctx.Status(http.StatusOK)
+       return ctx.JSON(&resp{
+               Code: unknownErrCode,
+               Msg:  e.Error(),
+       })
+}
+
+func ErrorWithData(ctx *fiber.Ctx, e error, data any) error {
        if e == nil {
                return xerror.New(unknownErrCode, unknownErrMsg)
        }
diff --git a/pitr/cli/internal/cmd/backup.go b/pitr/cli/internal/cmd/backup.go
index 96bc2ca..1b59e3c 100644
--- a/pitr/cli/internal/cmd/backup.go
+++ b/pitr/cli/internal/cmd/backup.go
@@ -174,7 +174,7 @@ func backup() error {
                return xerr.NewCliErr(fmt.Sprintf("check disk space failed. 
err: %s", err))
        }
 
-       prompt := fmt.Sprintln(backupPromptFmt)
+       prompt := backupPromptFmt
        err = promptutil.GetUserApproveInTerminal(prompt)
        if err != nil {
                cancel = true
@@ -286,7 +286,7 @@ func execBackup(lsBackup *model.LsBackup) error {
        // if backup failed, return error
        if err != nil {
                lsBackup.SsBackup.Status = model.SsBackupStatusFailed
-               return xerr.NewCliErr(fmt.Sprintf("node backup failed. err: 
%s", err))
+               return xerr.NewCliErr(err.Error())
        }
 
        // save data node list to lsBackup
@@ -311,7 +311,7 @@ func _execBackup(as pkg.IAgentServer, node 
*model.StorageNode, dnCh chan *model.
        }
        backupID, err := as.Backup(in)
        if err != nil {
-               return xerr.NewCliErr(fmt.Sprintf("backup failed, err: %s", 
err))
+               return xerr.NewCliErr(err.Error())
        }
 
        // update DnList of lsBackup
diff --git a/pitr/cli/internal/cmd/restore.go b/pitr/cli/internal/cmd/restore.go
index 9a08f28..ad684b7 100644
--- a/pitr/cli/internal/cmd/restore.go
+++ b/pitr/cli/internal/cmd/restore.go
@@ -285,7 +285,7 @@ func (t *restoretask) checkProgress() (bool, error) {
        }
 
        if err = t.As.Restore(in); err != nil {
-               r.Status = "Failed"
+               r.Status = fmt.Sprintf("Failed: %s", err)
                t.ResultCh <- r
                return false, err
        }
diff --git a/pitr/cli/internal/pkg/agent-server.go 
b/pitr/cli/internal/pkg/agent-server.go
index 9e61aac..261c68e 100644
--- a/pitr/cli/internal/pkg/agent-server.go
+++ b/pitr/cli/internal/pkg/agent-server.go
@@ -19,6 +19,7 @@ package pkg
 
 import (
        "context"
+       "errors"
        "fmt"
        "net/http"
 
@@ -78,7 +79,7 @@ func (as *agentServer) CheckStatus(in *model.HealthCheckIn) 
error {
        r.Body(in)
 
        if err := r.Send(out); err != nil {
-               return xerr.NewUnknownErr(url, in, nil, err)
+               return xerr.NewHTTPRawRequestErr(errors.Unwrap(err))
        }
 
        if out.Code != 0 {
@@ -96,7 +97,7 @@ func (as *agentServer) Backup(in *model.BackupIn) (string, 
error) {
        r.Body(in)
 
        if err := r.Send(out); err != nil {
-               return "", xerr.NewUnknownErr(url, in, out, err)
+               return "", xerr.NewHTTPRawRequestErr(errors.Unwrap(err))
        }
 
        if out.Code != 0 {
@@ -115,7 +116,7 @@ func (as *agentServer) Restore(in *model.RestoreIn) error {
        r.Body(in)
 
        if err := r.Send(out); err != nil {
-               return xerr.NewUnknownErr(url, in, out, err)
+               return xerr.NewHTTPRawRequestErr(errors.Unwrap(err))
        }
 
        if out.Code != 0 {
@@ -133,7 +134,7 @@ func (as *agentServer) ShowDetail(in *model.ShowDetailIn) 
(*model.BackupInfo, er
        r.Body(in)
 
        if err := r.Send(out); err != nil {
-               return nil, xerr.NewUnknownErr(url, in, out, err)
+               return nil, xerr.NewHTTPRawRequestErr(errors.Unwrap(err))
        }
 
        if out.Code != 0 {
@@ -151,7 +152,7 @@ func (as *agentServer) ShowList(in *model.ShowListIn) 
([]model.BackupInfo, error
        r.Body(in)
 
        if err := r.Send(out); err != nil {
-               return nil, xerr.NewUnknownErr(url, in, out, err)
+               return nil, xerr.NewHTTPRawRequestErr(errors.Unwrap(err))
        }
 
        if out.Code != 0 {
@@ -169,7 +170,7 @@ func (as *agentServer) ShowDiskSpace(in *model.DiskSpaceIn) 
(*model.DiskSpaceInf
        r.Body(in)
 
        if err := r.Send(out); err != nil {
-               return nil, xerr.NewUnknownErr(url, in, out, err)
+               return nil, xerr.NewHTTPRawRequestErr(errors.Unwrap(err))
        }
 
        if out.Code != 0 {
@@ -188,7 +189,7 @@ func (as *agentServer) DeleteBackup(in 
*model.DeleteBackupIn) error {
        r.Body(in)
 
        if err := r.Send(out); err != nil {
-               return xerr.NewUnknownErr(url, in, out, err)
+               return xerr.NewHTTPRawRequestErr(errors.Unwrap(err))
        }
 
        if out.Code != 0 {
diff --git a/pitr/cli/internal/pkg/xerr/err.go 
b/pitr/cli/internal/pkg/xerr/err.go
index edca9f8..32969da 100644
--- a/pitr/cli/internal/pkg/xerr/err.go
+++ b/pitr/cli/internal/pkg/xerr/err.go
@@ -24,11 +24,14 @@ type err struct {
 }
 
 const (
-       postErrFmt = "httputils.NewRequest[url=%s,body=%v,out=%v] return 
err=%s,wrap=%w"
+       postErrFmt    = "httputils.NewRequest[url=%s, body=%v, out=%v] return 
err=%s, wrap=%w"
+       httpErrFmt    = "httputils.NewRequest[method=%s, url=%s, body=%v, 
out=%v] return err=%s, wrap=%w"
+       httpRawErrFmt = "err=%s"
 
        Unknown           = "Unknown error"
        InvalidHTTPStatus = "Invalid http status"
        NotFound          = "Not found"
+       HTTPRequest       = "Http request error"
 )
 
 func (e *err) Error() string {
@@ -45,8 +48,16 @@ func NewUnknownErr(url string, in, out interface{}, err 
error) error {
        return fmt.Errorf(postErrFmt, url, in, out, err, NewCliErr(Unknown))
 }
 
+func NewHTTPRequestErr(method, url string, in, out interface{}, err error) 
error {
+       return fmt.Errorf(httpErrFmt, method, url, in, out, err, 
NewCliErr(HTTPRequest))
+}
+
+func NewHTTPRawRequestErr(err error) error {
+       return fmt.Errorf(httpRawErrFmt, err)
+}
+
 func NewAgentServerErr(code int, msg string) error {
        return &err{
-               msg: fmt.Sprintf("agent server err[code=%d,msg=%s]", code, msg),
+               msg: fmt.Sprintf("agent server err[code=%d, msg=%s]", code, 
msg),
        }
 }

Reply via email to