Skip to content

Commit 9f29d24

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 9f29d24

2 files changed

Lines changed: 42 additions & 31 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: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,7 @@ type ostreeRollbackData struct {
590590
Time int64 `json:"time"`
591591
Name string `json:"name"`
592592
Auto bool `json:"auto"`
593+
Reboot bool `json:"reboot"`
593594
}
594595

595596
type ostreeResponse struct {
@@ -623,11 +624,11 @@ func osTreeRollback() error {
623624
return nil
624625
}
625626

626-
func osTreeParseRollbackData() (*ostreeRollbackData, error) {
627+
func osTreeParseRollbackData() (string, error) {
627628
out, err := osTreeCmd([]string{"admin", "rollback", "--can-rollback", "-j"})
628629
if err != nil {
629630
logger.Warning("osTreeCmd failed:", err)
630-
return nil, err
631+
return "", err
631632
}
632633

633634
logger.Info("osTree rollback output:", out)
@@ -636,44 +637,53 @@ func osTreeParseRollbackData() (*ostreeRollbackData, error) {
636637
err = json.Unmarshal([]byte(out), &resp)
637638
if err != nil {
638639
logger.Warning("unmarshal ostree response failed:", err)
639-
return nil, err
640+
return "", err
640641
}
641642

642643
if resp.Error != nil {
643644
logger.Warning("ostree response has error:", resp.Error)
644-
return nil, fmt.Errorf("ostree error: %v", resp.Error)
645+
return "", fmt.Errorf("ostree error: %v", resp.Error)
645646
}
646647

647-
var data ostreeRollbackData
648-
err = json.Unmarshal(resp.Data, &data)
649-
if err != nil {
650-
logger.Warning("unmarshal rollback data failed:", err)
651-
return nil, err
652-
}
653-
654-
return &data, nil
648+
return string(resp.Data), nil
655649
}
656650

657651
func osTreeCanRollback() (bool, string) {
658-
data, err := osTreeParseRollbackData()
652+
dataJson, err := osTreeParseRollbackData()
659653
if err != nil {
660654
return false, ""
661655
}
662656

663-
rawData, err := json.Marshal(data)
657+
var data ostreeRollbackData
658+
err = json.Unmarshal([]byte(dataJson), &data)
664659
if err != nil {
665-
return data.CanRollback, ""
660+
return false, ""
666661
}
667662

668-
return data.CanRollback, string(rawData)
663+
return data.CanRollback, dataJson
669664
}
670665

671-
func osTreeIsAutoRollback() bool {
672-
data, err := osTreeParseRollbackData()
666+
func osTreeNeedRebootAfterRollback() bool {
667+
dataJson, err := osTreeParseRollbackData()
673668
if err != nil {
674669
return false
675670
}
676-
return data.Auto
671+
672+
var data ostreeRollbackData
673+
err = json.Unmarshal([]byte(dataJson), &data)
674+
if err != nil {
675+
return false
676+
}
677+
678+
// 兼容旧版本,Auto为true时,表示不需要重启
679+
var rawData map[string]json.RawMessage
680+
if err := json.Unmarshal([]byte(dataJson), &rawData); err == nil {
681+
if _, hasReboot := rawData["reboot"]; !hasReboot {
682+
return !data.Auto
683+
}
684+
}
685+
686+
return data.Reboot
677687
}
678688

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

0 commit comments

Comments
 (0)