You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by mi...@apache.org on 2023/06/13 08:05:56 UTC
[shardingsphere-on-cloud] branch main updated: chore: delete backup file when backup failed.
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 e4c7276 chore: delete backup file when backup failed.
new 766de49 Merge pull request #413 from Xu-Wentao/pitr
e4c7276 is described below
commit e4c7276caa12e864f089f209fb62f9795156c890
Author: xuwentao <cu...@yahoo.com>
AuthorDate: Tue Jun 13 14:14:36 2023 +0800
chore: delete backup file when backup failed.
---
pitr/agent/internal/handler/restore.go | 15 +++++++++++----
pitr/cli/internal/cmd/backup.go | 8 ++++++--
pitr/cli/internal/cmd/backup_test.go | 23 +++++++++++++++++++++--
pitr/cli/internal/cmd/restore.go | 4 ++++
pitr/cli/internal/cmd/root.go | 4 ++--
pitr/cli/internal/pkg/local-storage.go | 9 +++++++++
pitr/cli/internal/pkg/mocks/local-storage.go | 16 +++++++++++++++-
7 files changed, 68 insertions(+), 11 deletions(-)
diff --git a/pitr/agent/internal/handler/restore.go b/pitr/agent/internal/handler/restore.go
index c0e2326..88cd933 100644
--- a/pitr/agent/internal/handler/restore.go
+++ b/pitr/agent/internal/handler/restore.go
@@ -53,6 +53,7 @@ func Restore(ctx *fiber.Ctx) (err error) {
err = fmt.Errorf("stop openGauss failure,err=%w", err)
return
}
+
defer func() {
if err != nil {
err2 := pkg.OG.Start()
@@ -69,16 +70,22 @@ func Restore(ctx *fiber.Ctx) (err error) {
return
}
+ var status = "restoring"
+ defer func() {
+ if status != "restore success" {
+ err2 := pkg.OG.MvTempToPgData()
+ err = fmt.Errorf("resotre failre[err=%s],pkg.OG.MvTempToPgData return err=%w", err, err2)
+ }
+ }()
+
// restore data from backup
if err = pkg.OG.Restore(in.DnBackupPath, in.Instance, in.DnBackupID); err != nil {
efmt := "pkg.OG.Restore failure[path=%s,instance=%s,backupID=%s],err=%w"
err = fmt.Errorf(efmt, in.DnBackupPath, in.Instance, in.DnBackupID, err)
-
- err2 := pkg.OG.MvTempToPgData()
- err = fmt.Errorf("resotre failre[err=%s],pkg.OG.MvTempToPgData return err=%w", err, err2)
-
+ status = "restore failure"
return
}
+ status = "restore success"
// clean temp
if err = pkg.OG.CleanPgDataTemp(); err != nil {
diff --git a/pitr/cli/internal/cmd/backup.go b/pitr/cli/internal/cmd/backup.go
index 9a2249e..ea2a4fe 100644
--- a/pitr/cli/internal/cmd/backup.go
+++ b/pitr/cli/internal/cmd/backup.go
@@ -124,7 +124,7 @@ func backup() error {
if lsBackup != nil {
logging.Warn("Try to delete backup data ...")
- deleteBackupFiles(lsBackup)
+ deleteBackupFiles(ls, lsBackup)
}
}
}()
@@ -424,7 +424,7 @@ func doCheck(as pkg.IAgentServer, sn *model.StorageNode, backupID string, retrie
return backupInfo.Status, nil
}
-func deleteBackupFiles(lsBackup *model.LsBackup) {
+func deleteBackupFiles(ls pkg.ILocalStorage, lsBackup *model.LsBackup) {
var (
dataNodeMap = make(map[string]*model.DataNode)
totalNum = len(lsBackup.SsBackup.StorageNodes)
@@ -479,6 +479,10 @@ func deleteBackupFiles(lsBackup *model.LsBackup) {
t.Render()
+ if err := ls.DeleteByName(filename); err != nil {
+ logging.Warn("Delete backup info file failed")
+ }
+
logging.Info("Delete backup files finished")
}
diff --git a/pitr/cli/internal/cmd/backup_test.go b/pitr/cli/internal/cmd/backup_test.go
index e36ea29..2ddab5c 100644
--- a/pitr/cli/internal/cmd/backup_test.go
+++ b/pitr/cli/internal/cmd/backup_test.go
@@ -402,6 +402,10 @@ var _ = Describe("test backup mock", func() {
})
Context("test delete backup data", func() {
+ var (
+ ls *mock_pkg.MockILocalStorage
+ )
+
bak := &model.LsBackup{
Info: nil,
DnList: []*model.DataNode{
@@ -419,8 +423,22 @@ var _ = Describe("test backup mock", func() {
},
},
}
+ BeforeEach(func() {
+ ctrl = gomock.NewController(GinkgoT())
+ ls = mock_pkg.NewMockILocalStorage(ctrl)
+
+ monkey.Patch(pkg.NewLocalStorage, func(rootDir string) (pkg.ILocalStorage, error) {
+ return ls, nil
+ })
+ })
+ AfterEach(func() {
+ monkey.UnpatchAll()
+ ctrl.Finish()
+ })
+
It("should delete failed", func() {
- deleteBackupFiles(bak)
+ ls.EXPECT().DeleteByName(gomock.Any()).Return(errors.New("failed"))
+ deleteBackupFiles(ls, bak)
})
It("should delete success", func() {
@@ -433,7 +451,8 @@ var _ = Describe("test backup mock", func() {
defer monkey.UnpatchAll()
defer ctrl.Finish()
as.EXPECT().DeleteBackup(gomock.Any()).Return(nil)
- deleteBackupFiles(bak)
+ ls.EXPECT().DeleteByName(gomock.Any()).Return(nil)
+ deleteBackupFiles(ls, bak)
})
})
})
diff --git a/pitr/cli/internal/cmd/restore.go b/pitr/cli/internal/cmd/restore.go
index e669db7..0813e95 100644
--- a/pitr/cli/internal/cmd/restore.go
+++ b/pitr/cli/internal/cmd/restore.go
@@ -234,6 +234,10 @@ func execRestore(lsBackup *model.LsBackup) error {
t.Render()
+ if restoreFinalStatus == "Failed" {
+ return xerr.NewCliErr("restore failed, please check the log for more details.")
+ }
+
return nil
}
diff --git a/pitr/cli/internal/cmd/root.go b/pitr/cli/internal/cmd/root.go
index 7deb386..87a67a4 100644
--- a/pitr/cli/internal/cmd/root.go
+++ b/pitr/cli/internal/cmd/root.go
@@ -107,10 +107,10 @@ func checkAgentServerStatus(lsBackup *model.LsBackup) bool {
Password: sn.Password,
}
if err := as.CheckStatus(in); err != nil {
- statusList = append(statusList, &model.AgentServerStatus{IP: sn.IP, Port: sn.Port, Status: "Unavailable"})
+ statusList = append(statusList, &model.AgentServerStatus{IP: sn.IP, Port: AgentPort, Status: "Unavailable"})
available = false
} else {
- statusList = append(statusList, &model.AgentServerStatus{IP: sn.IP, Port: sn.Port, Status: "Available"})
+ statusList = append(statusList, &model.AgentServerStatus{IP: sn.IP, Port: AgentPort, Status: "Available"})
}
}
diff --git a/pitr/cli/internal/pkg/local-storage.go b/pitr/cli/internal/pkg/local-storage.go
index 596fd6c..2bc8227 100644
--- a/pitr/cli/internal/pkg/local-storage.go
+++ b/pitr/cli/internal/pkg/local-storage.go
@@ -43,6 +43,7 @@ type (
ReadAll() ([]*model.LsBackup, error)
ReadByID(id string) (*model.LsBackup, error)
ReadByCSN(csn string) (*model.LsBackup, error)
+ DeleteByName(name string) error
}
Extension string
@@ -212,3 +213,11 @@ func (ls *localStorage) GenFilename(extn Extension) string {
return fmt.Sprintf("%s_%s", prefix, suffix)
}
}
+
+func (ls *localStorage) DeleteByName(name string) error {
+ path := fmt.Sprintf("%s/%s", ls.backupDir, name)
+ if err := os.Remove(path); err != nil {
+ return xerr.NewCliErr(fmt.Sprintf("delete file failed,err=%s", err))
+ }
+ return nil
+}
diff --git a/pitr/cli/internal/pkg/mocks/local-storage.go b/pitr/cli/internal/pkg/mocks/local-storage.go
index aa18261..9284834 100644
--- a/pitr/cli/internal/pkg/mocks/local-storage.go
+++ b/pitr/cli/internal/pkg/mocks/local-storage.go
@@ -16,7 +16,7 @@
*/
// Code generated by MockGen. DO NOT EDIT.
-// Source: internal/pkg/local-storage.go
+// Source: local-storage.go
// Package mock_pkg is a generated GoMock package.
package mock_pkg
@@ -52,6 +52,20 @@ func (m *MockILocalStorage) EXPECT() *MockILocalStorageMockRecorder {
return m.recorder
}
+// DeleteByName mocks base method.
+func (m *MockILocalStorage) DeleteByName(name string) error {
+ m.ctrl.T.Helper()
+ ret := m.ctrl.Call(m, "DeleteByName", name)
+ ret0, _ := ret[0].(error)
+ return ret0
+}
+
+// DeleteByName indicates an expected call of DeleteByName.
+func (mr *MockILocalStorageMockRecorder) DeleteByName(name interface{}) *gomock.Call {
+ mr.mock.ctrl.T.Helper()
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteByName", reflect.TypeOf((*MockILocalStorage)(nil).DeleteByName), name)
+}
+
// GenFilename mocks base method.
func (m *MockILocalStorage) GenFilename(extn pkg.Extension) string {
m.ctrl.T.Helper()