From 88bc414c07bffbb2326a44b0eae4d40e3dafea08 Mon Sep 17 00:00:00 2001 From: xml Date: Wed, 15 Apr 2026 16:48:29 +0800 Subject: [PATCH] fix: Prevent local rate-limiting config from overriding remote config. Bug: https://pms.uniontech.com/bug-view-355949.html --- ...07\346\215\242\345\216\237\345\210\231.md" | 3 + src/lastore-daemon/dbusutil.go | 1 + src/lastore-daemon/manager_download.go | 7 +- src/lastore-daemon/manager_update.go | 8 +- src/lastore-daemon/updater_ifc.go | 83 ++++++++++++------- 5 files changed, 61 insertions(+), 41 deletions(-) create mode 100644 "docs/http\346\234\254\345\234\260\345\222\214\350\277\234\347\250\213\351\231\220\351\200\237\351\205\215\347\275\256\345\210\207\346\215\242\345\216\237\345\210\231.md" diff --git "a/docs/http\346\234\254\345\234\260\345\222\214\350\277\234\347\250\213\351\231\220\351\200\237\351\205\215\347\275\256\345\210\207\346\215\242\345\216\237\345\210\231.md" "b/docs/http\346\234\254\345\234\260\345\222\214\350\277\234\347\250\213\351\231\220\351\200\237\351\205\215\347\275\256\345\210\207\346\215\242\345\216\237\345\210\231.md" new file mode 100644 index 000000000..de1240200 --- /dev/null +++ "b/docs/http\346\234\254\345\234\260\345\222\214\350\277\234\347\250\213\351\231\220\351\200\237\351\205\215\347\275\256\345\210\207\346\215\242\345\216\237\345\210\231.md" @@ -0,0 +1,3 @@ +- dbus接口作为本地配置设置接口,如果当前正在使用远程限速配置,则dbus直接返回,防止本地配置覆盖远程配置的情况出现。 +- 如果远程配置关闭了,则启用本地配置,否则使用远程配置。 +- 配置切换后需要发送配置属性变化信号,控制中心会根据这个进行实时改变限速状态 diff --git a/src/lastore-daemon/dbusutil.go b/src/lastore-daemon/dbusutil.go index cb92fd2f7..b1b4c11b8 100644 --- a/src/lastore-daemon/dbusutil.go +++ b/src/lastore-daemon/dbusutil.go @@ -133,6 +133,7 @@ func (v *Updater) emitPropChangedIdleDownloadConfig(value string) error { func (v *Updater) setPropDownloadSpeedLimitConfig(value string) (changed bool) { if v.DownloadSpeedLimitConfig != value { v.DownloadSpeedLimitConfig = value + logger.Infof("setPropDownloadSpeedLimitConfig: %s", value) v.emitPropChangedDownloadSpeedLimitConfig(value) return true } diff --git a/src/lastore-daemon/manager_download.go b/src/lastore-daemon/manager_download.go index a030a82eb..9de4511b9 100644 --- a/src/lastore-daemon/manager_download.go +++ b/src/lastore-daemon/manager_download.go @@ -31,10 +31,9 @@ const ( func (m *Manager) setEffectiveOnlineRateLimit(nowTime string) { downloadSpeed := m.updater.downloadSpeedLimitConfigObj m.applyOnlineRateLimit(&downloadSpeed, nowTime) - downloadSpeedStr, err := json.Marshal(downloadSpeed) - if err == nil { - logger.Infof("setEffectiveOnlineRateLimit %v --> %v", m.config.DownloadSpeedLimitConfig, string(downloadSpeedStr)) - m.updater.SetDownloadSpeedLimit(string(downloadSpeedStr)) + logger.Infof("set download limit %v --> %v by platform", m.updater.DownloadSpeedLimitConfig, downloadSpeed) + if err := m.updater.setDownloadSpeedLimit(downloadSpeed); err != nil { + logger.Warning(err) } } diff --git a/src/lastore-daemon/manager_update.go b/src/lastore-daemon/manager_update.go index 0e99110e8..acc537f65 100644 --- a/src/lastore-daemon/manager_update.go +++ b/src/lastore-daemon/manager_update.go @@ -470,12 +470,10 @@ func (m *Manager) refreshThrottlingFromPlatform() error { m.applyOnlineRateLimit(&downloadSpeed, m.updatePlatform.OnlineRateLimit.ServerTime) - downloadSpeedStr, err := json.Marshal(downloadSpeed) - if err != nil { - return fmt.Errorf("failed to marshal download speed limit") + logger.Infof("set download limit %v --> %v by platform", m.updater.DownloadSpeedLimitConfig, downloadSpeed) + if err := m.updater.setDownloadSpeedLimit(downloadSpeed); err != nil { + logger.Warningf("Failed to set download speed limit %v", err) } - logger.Infof("set download limit %v --> %v by platform", m.config.DownloadSpeedLimitConfig, string(downloadSpeedStr)) - m.updater.SetDownloadSpeedLimit(string(downloadSpeedStr)) return nil } diff --git a/src/lastore-daemon/updater_ifc.go b/src/lastore-daemon/updater_ifc.go index d8729a6b1..283bb5b70 100644 --- a/src/lastore-daemon/updater_ifc.go +++ b/src/lastore-daemon/updater_ifc.go @@ -7,7 +7,6 @@ package main import ( "encoding/json" "strconv" - "strings" "time" "github.com/godbus/dbus/v5" @@ -133,43 +132,63 @@ func (u *Updater) SetIdleDownloadConfig(idleConfig string) *dbus.Error { } func (u *Updater) SetDownloadSpeedLimit(limitConfig string) *dbus.Error { - if err := json.Unmarshal([]byte(limitConfig), &u.downloadSpeedLimitConfigObj); err != nil { + var limitConfigObj downloadSpeedLimitConfig + if err := json.Unmarshal([]byte(limitConfig), &limitConfigObj); err != nil { logger.Warning(err) return dbusutil.ToError(err) } - if u.setDownloadSpeedLimitTimer == nil { - u.setDownloadSpeedLimitTimer = time.AfterFunc(time.Second, func() { - config, err := json.Marshal(u.downloadSpeedLimitConfigObj) - if err != nil { + if u.downloadSpeedLimitConfigObj.IsOnlineSpeedLimit { + // 在线限速优先级更高,如果通过dbus设置了一个本地限速,则不应该把在线限速的配置覆盖掉 + return nil + } + // dbus设置数据本地限速,强制将IsOnlineSpeedLimit设置为false + limitConfigObj.IsOnlineSpeedLimit = false + if err := u.setDownloadSpeedLimit(limitConfigObj); err != nil { + logger.Warning(err) + return dbusutil.ToError(err) + } + return nil +} + +func (u *Updater) setDownloadSpeedLimit(limitConfigObj downloadSpeedLimitConfig) error { + u.PropsMu.Lock() + + logger.Infof("set download limit %v --> %v", u.downloadSpeedLimitConfigObj, limitConfigObj) + u.downloadSpeedLimitConfigObj = limitConfigObj + config, err := json.Marshal(limitConfigObj) + if err != nil { + logger.Warning(err) + u.PropsMu.Unlock() + return err + } + changed := u.setPropDownloadSpeedLimitConfig(string(config)) + if !changed { + u.PropsMu.Unlock() + return nil + } + + if u.setDownloadSpeedLimitTimer != nil { + u.setDownloadSpeedLimitTimer.Stop() + logger.Info("reset limit timer") + } + configStr := string(config) + u.setDownloadSpeedLimitTimer = time.AfterFunc(time.Second, func() { + u.PropsMu.Lock() + if !u.downloadSpeedLimitConfigObj.IsOnlineSpeedLimit { + if err := u.config.SetLocalDownloadSpeedLimitConfig(configStr); err != nil { logger.Warning(err) - return } - changed := u.setPropDownloadSpeedLimitConfig(string(config)) - if changed { - logger.Infof("set changed speed limit: %v", limitConfig) - // When IsOnlineSpeedLimit is false, it means manual speed limit is set. - // Save to both configs to ensure the value persists after daemon restart. - if strings.Contains(limitConfig, "IsOnlineSpeedLimit") && !u.downloadSpeedLimitConfigObj.IsOnlineSpeedLimit { - err := u.config.SetLocalDownloadSpeedLimitConfig(string(config)) - if err != nil { - logger.Warning(err) - return - } - } else { - err := u.config.SetDownloadSpeedLimitConfig(string(config)) - if err != nil { - logger.Warning(err) - return - } - } - u.manager.ChangePrepareDistUpgradeJobOption() + } else { + if err := u.config.SetDownloadSpeedLimitConfig(configStr); err != nil { + logger.Warning(err) } - logger.Info("update limit config") - }) - } else { - u.setDownloadSpeedLimitTimer.Reset(time.Second) - logger.Info("reset limit timer") - } + } + u.manager.ChangePrepareDistUpgradeJobOption() + u.PropsMu.Unlock() + logger.Info("update limit config") + }) + + u.PropsMu.Unlock() return nil }