Skip to content

Commit 79cd6ce

Browse files
committed
fix: improve rollback handling logic
1. Modified ConfirmRollback to handle rollback synchronously instead of in goroutine 2. Added Reboot field to ostreeRollbackData struct to track reboot requirement 3. Implemented osTreeNeedRebootAfterRollback to properly determine reboot need 4. Updated osTreeParseRollbackData to return additional field information 5. Added slices package import for field checking The changes improve rollback reliability by: 1. Making rollback operations synchronous to properly handle errors 2. Adding explicit reboot tracking instead of relying on auto-rollback status 3. Maintaining backward compatibility with older ostree versions 4. Providing better field-level data access from ostree responses fix: 改进回滚处理逻辑 1. 修改 ConfirmRollback 以同步方式处理回滚而非使用 goroutine 2. 在 ostreeRollbackData 结构体中添加 Reboot 字段以跟踪重启需求 3. 实现 osTreeNeedRebootAfterRollback 来正确判断是否需要重启 4. 更新 osTreeParseRollbackData 以返回额外的字段信息 5. 添加 slices 包导入用于字段检查 这些改进通过以下方式提高了回滚可靠性: 1. 同步执行回滚操作以正确处理错误 2. 添加显式的重启跟踪而非依赖自动回滚状态 3. 保持与旧版 ostree 的兼容性 4. 提供更好的字段级数据访问能力
1 parent f3a7fab commit 79cd6ce

2 files changed

Lines changed: 43 additions & 22 deletions

File tree

src/lastore-daemon/manager_ifc.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -745,23 +745,24 @@ func (m *Manager) SetUpdateSources(sender dbus.Sender, updateType system.UpdateT
745745
func (m *Manager) ConfirmRollback(sender dbus.Sender, confirm bool) *dbus.Error {
746746
var err error
747747
if confirm {
748-
go func() {
749-
err = osTreeRollback()
748+
needReboot := osTreeNeedRebootAfterRollback()
749+
err = osTreeRollback()
750+
if err != nil {
751+
logger.Warning(err)
752+
}
753+
if m.grub != nil {
754+
err = m.grub.changeGrubDefaultEntry(normalBootEntry)
750755
if err != nil {
751756
logger.Warning(err)
752757
}
753-
if m.grub != nil {
754-
err = m.grub.changeGrubDefaultEntry(normalBootEntry)
755-
if err != nil {
756-
logger.Warning(err)
757-
}
758-
}
758+
}
759759

760-
// 如果自动回滚,则无需重启
761-
if !osTreeIsAutoRollback() {
762-
m.PowerOff(sender, true)
760+
if needReboot {
761+
err := m.PowerOff(sender, true)
762+
if err != nil {
763+
logger.Warning(err)
763764
}
764-
}()
765+
}
765766
} else {
766767
return m.PowerOff(sender, true)
767768
}

src/lastore-daemon/manager_upgrade.go

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"os"
1616
"os/exec"
1717
"path/filepath"
18+
"slices"
1819
"strings"
1920
"sync"
2021
"syscall"
@@ -590,6 +591,7 @@ type ostreeRollbackData struct {
590591
Time int64 `json:"time"`
591592
Name string `json:"name"`
592593
Auto bool `json:"auto"`
594+
Reboot bool `json:"reboot"`
593595
}
594596

595597
type ostreeResponse struct {
@@ -623,11 +625,11 @@ func osTreeRollback() error {
623625
return nil
624626
}
625627

626-
func osTreeParseRollbackData() (*ostreeRollbackData, error) {
628+
func osTreeParseRollbackData() (*ostreeRollbackData, []string, error) {
627629
out, err := osTreeCmd([]string{"admin", "rollback", "--can-rollback", "-j"})
628630
if err != nil {
629631
logger.Warning("osTreeCmd failed:", err)
630-
return nil, err
632+
return nil, nil, err
631633
}
632634

633635
logger.Info("osTree rollback output:", out)
@@ -636,26 +638,38 @@ func osTreeParseRollbackData() (*ostreeRollbackData, error) {
636638
err = json.Unmarshal([]byte(out), &resp)
637639
if err != nil {
638640
logger.Warning("unmarshal ostree response failed:", err)
639-
return nil, err
641+
return nil, nil, err
640642
}
641643

642644
if resp.Error != nil {
643645
logger.Warning("ostree response has error:", resp.Error)
644-
return nil, fmt.Errorf("ostree error: %v", resp.Error)
646+
return nil, nil, fmt.Errorf("ostree error: %v", resp.Error)
645647
}
646648

647649
var data ostreeRollbackData
648650
err = json.Unmarshal(resp.Data, &data)
649651
if err != nil {
650652
logger.Warning("unmarshal rollback data failed:", err)
651-
return nil, err
653+
return nil, nil, err
654+
}
655+
656+
var rawData map[string]interface{}
657+
err = json.Unmarshal(resp.Data, &rawData)
658+
if err != nil {
659+
logger.Warning("unmarshal raw data failed:", err)
660+
return &data, nil, nil
652661
}
653662

654-
return &data, nil
663+
var fieldList []string
664+
for key := range rawData {
665+
fieldList = append(fieldList, key)
666+
}
667+
668+
return &data, fieldList, nil
655669
}
656670

657671
func osTreeCanRollback() (bool, string) {
658-
data, err := osTreeParseRollbackData()
672+
data, _, err := osTreeParseRollbackData()
659673
if err != nil {
660674
return false, ""
661675
}
@@ -668,12 +682,18 @@ func osTreeCanRollback() (bool, string) {
668682
return data.CanRollback, string(rawData)
669683
}
670684

671-
func osTreeIsAutoRollback() bool {
672-
data, err := osTreeParseRollbackData()
685+
func osTreeNeedRebootAfterRollback() bool {
686+
data, fieldList, err := osTreeParseRollbackData()
673687
if err != nil {
674688
return false
675689
}
676-
return data.Auto
690+
691+
// 兼容旧版本
692+
if !slices.Contains(fieldList, "reboot") {
693+
return !data.Auto
694+
}
695+
696+
return data.Reboot
677697
}
678698

679699
func (m *Manager) preUpgradeCmdSuccessHook(job *Job, needChangeGrub bool, mode system.UpdateType, uuid string) error {

0 commit comments

Comments
 (0)