@@ -7,7 +7,6 @@ package main
77import (
88 "encoding/json"
99 "strconv"
10- "strings"
1110 "time"
1211
1312 "github.com/godbus/dbus/v5"
@@ -133,43 +132,63 @@ func (u *Updater) SetIdleDownloadConfig(idleConfig string) *dbus.Error {
133132}
134133
135134func (u * Updater ) SetDownloadSpeedLimit (limitConfig string ) * dbus.Error {
136- if err := json .Unmarshal ([]byte (limitConfig ), & u .downloadSpeedLimitConfigObj ); err != nil {
135+ var limitConfigObj downloadSpeedLimitConfig
136+ if err := json .Unmarshal ([]byte (limitConfig ), & limitConfigObj ); err != nil {
137137 logger .Warning (err )
138138 return dbusutil .ToError (err )
139139 }
140- if u .setDownloadSpeedLimitTimer == nil {
141- u .setDownloadSpeedLimitTimer = time .AfterFunc (time .Second , func () {
142- config , err := json .Marshal (u .downloadSpeedLimitConfigObj )
143- if err != nil {
144- logger .Warning (err )
145- return
146- }
147- changed := u .setPropDownloadSpeedLimitConfig (string (config ))
148- if changed {
149- logger .Infof ("set changed speed limit: %v" , limitConfig )
150- // When IsOnlineSpeedLimit is false, it means manual speed limit is set.
151- // Save to both configs to ensure the value persists after daemon restart.
152- if strings .Contains (limitConfig , "IsOnlineSpeedLimit" ) && ! u .downloadSpeedLimitConfigObj .IsOnlineSpeedLimit {
153- err := u .config .SetLocalDownloadSpeedLimitConfig (string (config ))
154- if err != nil {
155- logger .Warning (err )
156- return
157- }
158- } else {
159- err := u .config .SetDownloadSpeedLimitConfig (string (config ))
160- if err != nil {
161- logger .Warning (err )
162- return
163- }
164- }
165- u .manager .ChangePrepareDistUpgradeJobOption ()
166- }
167- logger .Info ("update limit config" )
168- })
169- } else {
170- u .setDownloadSpeedLimitTimer .Reset (time .Second )
140+ if u .downloadSpeedLimitConfigObj .IsOnlineSpeedLimit {
141+ // 在线限速优先级更高,如果通过dbus设置了一个本地限速,则不应该把在线限速的配置覆盖掉
142+ return nil
143+ }
144+ // dbus设置数据本地限速,强制将IsOnlineSpeedLimit设置为false
145+ limitConfigObj .IsOnlineSpeedLimit = false
146+ if err := u .setDownloadSpeedLimit (limitConfigObj ); err != nil {
147+ logger .Warning (err )
148+ return dbusutil .ToError (err )
149+ }
150+ return nil
151+ }
152+
153+ func (u * Updater ) setDownloadSpeedLimit (limitConfigObj downloadSpeedLimitConfig ) error {
154+ u .PropsMu .Lock ()
155+ if u .setDownloadSpeedLimitTimer != nil {
156+ u .setDownloadSpeedLimitTimer .Stop ()
171157 logger .Info ("reset limit timer" )
172158 }
159+ u .setDownloadSpeedLimitTimer = time .AfterFunc (time .Second , func () {
160+ u .PropsMu .Lock ()
161+ logger .Infof ("set download limit %v --> %v" , u .downloadSpeedLimitConfigObj , limitConfigObj )
162+ u .downloadSpeedLimitConfigObj = limitConfigObj
163+ config , err := json .Marshal (limitConfigObj )
164+ if err != nil {
165+ logger .Warning (err )
166+ u .PropsMu .Unlock ()
167+ return
168+ }
169+ changed := u .setPropDownloadSpeedLimitConfig (string (config ))
170+ if changed {
171+ if ! u .downloadSpeedLimitConfigObj .IsOnlineSpeedLimit {
172+ err := u .config .SetLocalDownloadSpeedLimitConfig (string (config ))
173+ if err != nil {
174+ logger .Warning (err )
175+ u .PropsMu .Unlock ()
176+ return
177+ }
178+ } else {
179+ err := u .config .SetDownloadSpeedLimitConfig (string (config ))
180+ if err != nil {
181+ logger .Warning (err )
182+ u .PropsMu .Unlock ()
183+ return
184+ }
185+ }
186+ u .manager .ChangePrepareDistUpgradeJobOption ()
187+ }
188+ u .PropsMu .Unlock ()
189+ logger .Info ("update limit config" )
190+ })
191+ u .PropsMu .Unlock ()
173192 return nil
174193}
175194
0 commit comments