Skip to content

Commit 5f0b653

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 5f0b653

2 files changed

Lines changed: 56 additions & 24 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: 43 additions & 12 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,7 +624,7 @@ func osTreeRollback() error {
623624
return nil
624625
}
625626

626-
func osTreeParseRollbackData() (*ostreeRollbackData, error) {
627+
func osTreeParseRollbackData() (map[string]interface{}, error) {
627628
out, err := osTreeCmd([]string{"admin", "rollback", "--can-rollback", "-j"})
628629
if err != nil {
629630
logger.Warning("osTreeCmd failed:", err)
@@ -644,36 +645,66 @@ func osTreeParseRollbackData() (*ostreeRollbackData, error) {
644645
return nil, fmt.Errorf("ostree error: %v", resp.Error)
645646
}
646647

647-
var data ostreeRollbackData
648-
err = json.Unmarshal(resp.Data, &data)
648+
var rawData map[string]interface{}
649+
err = json.Unmarshal(resp.Data, &rawData)
649650
if err != nil {
650-
logger.Warning("unmarshal rollback data failed:", err)
651+
logger.Warning("unmarshal raw data failed:", err)
651652
return nil, err
652653
}
653654

654-
return &data, nil
655+
return rawData, nil
655656
}
656657

657658
func osTreeCanRollback() (bool, string) {
658-
data, err := osTreeParseRollbackData()
659+
rawData, err := osTreeParseRollbackData()
659660
if err != nil {
660661
return false, ""
661662
}
662663

663-
rawData, err := json.Marshal(data)
664+
// test
665+
osTreeNeedRebootAfterRollback()
666+
667+
// 将 map 转换为结构体
668+
var data ostreeRollbackData
669+
dataBytes, err := json.Marshal(rawData)
664670
if err != nil {
665-
return data.CanRollback, ""
671+
return false, ""
666672
}
667673

668-
return data.CanRollback, string(rawData)
674+
err = json.Unmarshal(dataBytes, &data)
675+
if err != nil {
676+
return false, ""
677+
}
678+
679+
return data.CanRollback, string(dataBytes)
669680
}
670681

671-
func osTreeIsAutoRollback() bool {
672-
data, err := osTreeParseRollbackData()
682+
func osTreeNeedRebootAfterRollback() bool {
683+
rawData, err := osTreeParseRollbackData()
673684
if err != nil {
674685
return false
675686
}
676-
return data.Auto
687+
688+
// 将 map 转换为结构体
689+
var data ostreeRollbackData
690+
dataBytes, err := json.Marshal(rawData)
691+
if err != nil {
692+
return false
693+
}
694+
695+
err = json.Unmarshal(dataBytes, &data)
696+
if err != nil {
697+
return false
698+
}
699+
700+
logger.Warning("=======", rawData["reboot"], data.Reboot, data.Auto)
701+
702+
// 兼容旧版本
703+
if _, hasReboot := rawData["reboot"]; !hasReboot {
704+
return !data.Auto
705+
}
706+
707+
return data.Reboot
677708
}
678709

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

0 commit comments

Comments
 (0)