Skip to content

Commit c4d607a

Browse files
committed
fix: Calculate download package size without classification
Calculate download package size with classification in the prepareDistUpgrade function Bug: https://pms.uniontech.com/bug-view-343167.html
1 parent 89d72ba commit c4d607a

2 files changed

Lines changed: 54 additions & 16 deletions

File tree

src/lastore-daemon/manager_download.go

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,24 @@ import (
2121
"github.com/linuxdeepin/go-lib/gettext"
2222
)
2323

24+
// calculateTotalDownloadSize calculates the total download size for all packages under the specified update mode
25+
func calculateTotalDownloadSize(mode system.UpdateType, updatablePkgsMap map[system.UpdateType][]string) (float64, []error) {
26+
totalNeedDownloadSize := 0.0
27+
var errs []error
28+
for _, updateType := range system.AllUpdateType() {
29+
if mode&updateType == 0 {
30+
continue
31+
}
32+
updatablePkgs := updatablePkgsMap[updateType]
33+
if needDownloadSize, _, err := system.QuerySourceDownloadSize(updateType, updatablePkgs); err == nil {
34+
totalNeedDownloadSize += needDownloadSize
35+
} else {
36+
errs = append(errs, err)
37+
}
38+
}
39+
return totalNeedDownloadSize, errs
40+
}
41+
2442
func (m *Manager) prepareDistUpgrade(sender dbus.Sender, origin system.UpdateType, initiator Initiator) (*Job, error) {
2543
if m.ImmutableAutoRecovery {
2644
logger.Info("immutable auto recovery is enabled, don't allow to exec prepareDistUpgrade")
@@ -46,16 +64,17 @@ func (m *Manager) prepareDistUpgrade(sender dbus.Sender, origin system.UpdateTyp
4664
}
4765
}
4866

49-
packages := m.updater.getUpdatablePackagesByType(mode)
67+
packages, updatablePkgsMap := m.updater.getUpdatablePackagesWithClassification(mode)
5068
if len(packages) == 0 {
5169
return nil, system.NotFoundError("empty UpgradableApps")
5270
}
53-
var needDownloadSize float64
54-
needDownloadSize, _, _ = system.QueryPackageDownloadSize(mode, packages...)
71+
72+
// Calculate the total download size required
73+
totalNeedDownloadSize, _ := calculateTotalDownloadSize(mode, updatablePkgsMap)
5574
// 不再处理needDownloadSize == 0的情况,因为有可能是其他仓库包含了该仓库的包,导致该仓库无需下载,可以直接继续后续流程,用来切换该仓库的状态
5675
// 下载前检查/var分区的磁盘空间是否足够下载,
5776
isInsufficientSpace := false
58-
if needDownloadSize > 0 {
77+
if totalNeedDownloadSize > 0 {
5978
content, err := exec.Command("/bin/sh", []string{
6079
"-c",
6180
"df -BK --output='avail' /var|awk 'NR==2'",
@@ -70,7 +89,7 @@ func (m *Manager) prepareDistUpgrade(sender dbus.Sender, origin system.UpdateTyp
7089
logger.Warning(err)
7190
} else {
7291
spaceNum = spaceNum * 1000
73-
isInsufficientSpace = spaceNum < int(needDownloadSize)
92+
isInsufficientSpace = spaceNum < int(totalNeedDownloadSize)
7493
}
7594
}
7695
}
@@ -81,7 +100,7 @@ func (m *Manager) prepareDistUpgrade(sender dbus.Sender, origin system.UpdateTyp
81100
ErrDetail: "You don't have enough free space to download",
82101
IsCheckError: true,
83102
}
84-
msg := fmt.Sprintf(gettext.Tr("Downloading updates failed. Please free up %g GB disk space first."), needDownloadSize/(1000*1000*1000))
103+
msg := fmt.Sprintf(gettext.Tr("Downloading updates failed. Please free up %g GB disk space first."), totalNeedDownloadSize/(1000*1000*1000))
85104
go m.sendNotify(updateNotifyShowOptional, 0, "preferences-system", "", msg, nil, nil, system.NotifyExpireTimeoutDefault)
86105
logger.Warning(dbusError.Error())
87106
errStr, _ := json.Marshal(dbusError)
@@ -150,24 +169,22 @@ func (m *Manager) prepareDistUpgrade(sender dbus.Sender, origin system.UpdateTyp
150169
return nil
151170
},
152171
string(system.FailedStatus): func() error {
153-
m.PropsMu.Lock()
154-
packages := m.UpgradableApps
155-
m.PropsMu.Unlock()
156172
// 失败的单独设置失败类型的状态,其他的还原成未下载(其中下载完成的由于限制不会被修改)
157173
m.statusManager.SetUpdateStatus(j.updateTyp, system.DownloadErr)
158174
m.statusManager.SetUpdateStatus(mode, system.NotDownload)
159175
var errorContent system.JobError
160176
err = json.Unmarshal([]byte(j.Description), &errorContent)
161177
if err == nil {
162178
if strings.Contains(errorContent.ErrType.String(), system.ErrorInsufficientSpace.String()) {
163-
var msg string
164-
size, _, err := system.QueryPackageDownloadSize(mode, packages...)
165-
if err != nil {
166-
logger.Warning(err)
167-
size = needDownloadSize
179+
_, updatablePkgsMap := m.updater.getUpdatablePackagesWithClassification(mode)
180+
size, errs := calculateTotalDownloadSize(mode, updatablePkgsMap)
181+
if size == 0 && len(errs) > 0 {
182+
size = totalNeedDownloadSize
183+
}
184+
if size > 0 {
185+
msg := fmt.Sprintf(gettext.Tr("Downloading updates failed. Please free up %g GB disk space first."), size/(1000*1000*1000))
186+
go m.sendNotify(updateNotifyShowOptional, 0, "preferences-system", "", msg, nil, nil, system.NotifyExpireTimeoutDefault)
168187
}
169-
msg = fmt.Sprintf(gettext.Tr("Downloading updates failed. Please free up %g GB disk space first."), size/(1000*1000*1000))
170-
go m.sendNotify(updateNotifyShowOptional, 0, "preferences-system", "", msg, nil, nil, system.NotifyExpireTimeoutDefault)
171188
} else if strings.Contains(errorContent.ErrType.String(), system.ErrorDamagePackage.String()) {
172189
// 下载更新失败,需要apt-get clean后重新下载
173190
cleanAllCache()

src/lastore-daemon/updater.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/godbus/dbus/v5"
2424
systemd1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.systemd1"
2525
"github.com/linuxdeepin/go-lib/dbusutil"
26+
"github.com/linuxdeepin/go-lib/strv"
2627
)
2728

2829
const (
@@ -419,9 +420,29 @@ func (u *Updater) getUpdatablePackagesByType(updateType system.UpdateType) []str
419420
}
420421
}
421422
}
423+
updatableApps = strv.Strv(updatableApps).Uniq()
422424
return updatableApps
423425
}
424426

427+
func (u *Updater) getUpdatablePackagesWithClassification(updateType system.UpdateType) ([]string, map[system.UpdateType][]string) {
428+
u.PropsMu.RLock()
429+
defer u.PropsMu.RUnlock()
430+
431+
var updatablePkgs []string
432+
var updatablePkgsMap = make(map[system.UpdateType][]string)
433+
for _, t := range system.AllInstallUpdateType() {
434+
if updateType&t != 0 {
435+
packages := u.ClassifiedUpdatablePackages[t.JobType()]
436+
if len(packages) > 0 {
437+
updatablePkgs = append(updatablePkgs, packages...)
438+
updatablePkgsMap[t] = packages
439+
}
440+
}
441+
}
442+
updatablePkgs = strv.Strv(updatablePkgs).Uniq()
443+
return updatablePkgs, updatablePkgsMap
444+
}
445+
425446
func (u *Updater) GetLimitConfig() (bool, string) {
426447
return u.downloadSpeedLimitConfigObj.DownloadSpeedLimitEnabled, u.downloadSpeedLimitConfigObj.LimitSpeed
427448
}

0 commit comments

Comments
 (0)