fix: 解决快照恢复失败的问题 (#3750)

This commit is contained in:
ssongliu 2024-01-30 16:11:49 +08:00 committed by GitHub
parent 51d7a84062
commit 0e4f82c434
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 66 additions and 24 deletions

View File

@ -153,7 +153,7 @@ func (u *SnapshotService) SnapshotRecover(req dto.SnapshotRecover) error {
if len(snap.InterruptStep) != 0 && !req.IsNew {
isReTry = true
}
backup, err := backupRepo.Get(commonRepo.WithByType(snap.From))
backup, err := backupRepo.Get(commonRepo.WithByType(snap.DefaultDownload))
if err != nil {
return err
}

View File

@ -191,12 +191,14 @@ func snapUpload(snap snapHelper, accounts string, file string) {
}
targetAccounts := strings.Split(accounts, ",")
for _, item := range targetAccounts {
global.LOG.Debugf("start upload snapshot to %s, dir: %s", item, path.Join(accountMap[item].backupPath, "system_snapshot", path.Base(file)))
global.LOG.Debugf("start upload snapshot to %s, path: %s", item, path.Join(accountMap[item].backupPath, "system_snapshot", path.Base(file)))
if _, err := accountMap[item].client.Upload(source, path.Join(accountMap[item].backupPath, "system_snapshot", path.Base(file))); err != nil {
global.LOG.Debugf("upload to %s failed, err: %v", item, err)
snap.Status.Upload = err.Error()
_ = snapshotRepo.UpdateStatus(snap.Status.ID, map[string]interface{}{"upload": err.Error()})
return
}
global.LOG.Debugf("upload to %s successful", item)
}
snap.Status.Upload = constant.StatusDone
_ = snapshotRepo.UpdateStatus(snap.Status.ID, map[string]interface{}{"upload": constant.StatusDone})

View File

@ -76,46 +76,59 @@ func Init() {
}
func handleSnapStatus() {
msgFailed := "the task was interrupted due to the restart of the 1panel service"
_ = global.DB.Model(&model.Snapshot{}).Where("status = ?", "OnSaveData").
Updates(map[string]interface{}{"status": constant.StatusSuccess}).Error
_ = global.DB.Model(&model.Snapshot{}).Where("status = ?", constant.StatusWaiting).
Updates(map[string]interface{}{
"status": constant.StatusFailed,
"message": msgFailed,
}).Error
_ = global.DB.Model(&model.Snapshot{}).Where("recover_status = ?", constant.StatusWaiting).
Updates(map[string]interface{}{
"recover_status": constant.StatusFailed,
"recover_message": msgFailed,
}).Error
_ = global.DB.Model(&model.Snapshot{}).Where("rollback_status = ?", constant.StatusWaiting).
Updates(map[string]interface{}{
"rollback_status": constant.StatusFailed,
"rollback_message": msgFailed,
}).Error
snapRepo := repo.NewISnapshotRepo()
snaps, _ := snapRepo.GetList()
for _, snap := range snaps {
if snap.Status == "OnSaveData" {
_ = snapRepo.Update(snap.ID, map[string]interface{}{"status": constant.StatusSuccess})
}
if snap.Status == constant.StatusWaiting {
_ = snapRepo.Update(snap.ID, map[string]interface{}{"status": constant.StatusFailed, "message": "the task was interrupted due to the restart of the 1panel service"})
}
}
status, _ := snapRepo.GetStatusList()
for _, statu := range status {
for _, item := range status {
updates := make(map[string]interface{})
if statu.Panel == constant.StatusRunning {
if item.Panel == constant.StatusRunning {
updates["panel"] = constant.StatusFailed
}
if statu.PanelInfo == constant.StatusRunning {
if item.PanelInfo == constant.StatusRunning {
updates["panel_info"] = constant.StatusFailed
}
if statu.DaemonJson == constant.StatusRunning {
if item.DaemonJson == constant.StatusRunning {
updates["daemon_json"] = constant.StatusFailed
}
if statu.AppData == constant.StatusRunning {
if item.AppData == constant.StatusRunning {
updates["app_data"] = constant.StatusFailed
}
if statu.PanelData == constant.StatusRunning {
if item.PanelData == constant.StatusRunning {
updates["panel_data"] = constant.StatusFailed
}
if statu.BackupData == constant.StatusRunning {
if item.BackupData == constant.StatusRunning {
updates["backup_data"] = constant.StatusFailed
}
if statu.Compress == constant.StatusRunning {
if item.Compress == constant.StatusRunning {
updates["compress"] = constant.StatusFailed
}
if statu.Upload == constant.StatusUploading {
if item.Upload == constant.StatusUploading {
updates["upload"] = constant.StatusFailed
}
if len(updates) != 0 {
_ = snapRepo.UpdateStatus(statu.ID, updates)
_ = snapRepo.UpdateStatus(item.ID, updates)
}
}
}

View File

@ -4,6 +4,7 @@ import (
"fmt"
"os"
"path"
"path/filepath"
"github.com/1Panel-dev/1Panel/backend/utils/cmd"
)
@ -61,9 +62,35 @@ func (c localClient) Upload(src, target string) (bool, error) {
}
func (c localClient) Download(src, target string) (bool, error) {
localPath := path.Join(c.dir, src)
if _, err := os.Stat(path.Dir(target)); err != nil {
if os.IsNotExist(err) {
if err = os.MkdirAll(path.Dir(target), os.ModePerm); err != nil {
return false, err
}
} else {
return false, err
}
}
stdout, err := cmd.Execf("\\cp -f %s %s", localPath, target)
if err != nil {
return false, fmt.Errorf("cp file failed, stdout: %v, err: %v", stdout, err)
}
return true, nil
}
func (c localClient) ListObjects(prefix string) ([]string, error) {
return nil, nil
itemPath := path.Join(c.dir, prefix)
var files []string
if err := filepath.Walk(itemPath, func(path string, info os.FileInfo, err error) error {
if !info.IsDir() {
files = append(files, info.Name())
}
return nil
}); err != nil {
return nil, err
}
return files, nil
}

View File

@ -111,7 +111,7 @@ func (o oneDriveClient) Upload(src, target string) (bool, error) {
return false, errors.New("Only file is allowed to be uploaded here.")
}
var isOk bool
if fileInfo.Size() > 4*1024*1024 {
if fileInfo.Size() < 4*1024*1024 {
isOk, err = o.upSmall(ctx, src, folderID, fileInfo.Size())
} else {
isOk, err = o.upBig(ctx, src, folderID, fileInfo.Size())

View File

@ -17,7 +17,7 @@
</el-button>
</el-alert>
</div>
<el-card class="mini-border-card">
<el-card v-else class="mini-border-card">
<div v-if="!snapInfo.recoverStatus" class="mini-border-card">
<div v-if="snapInfo.lastRecoveredAt">
<el-form-item :label="$t('commons.table.status')">