| 63 | } |
| 64 | |
| 65 | func (e *engineImpl) cleanObjectStorage() (int, error) { |
| 66 | node, err := e.nod.Get() |
| 67 | if err != nil { |
| 68 | return 0, errors.Trace(err) |
| 69 | } |
| 70 | objectCfgs := map[string]*specv1.Configuration{} |
| 71 | err = e.sto.ForEach(nil, func(cfg *specv1.Configuration) error { |
| 72 | if isObjectConfig(cfg) { |
| 73 | key := makeKey(specv1.KindConfiguration, cfg.Name, cfg.Version) |
| 74 | if key != "" { |
| 75 | objectCfgs[key] = cfg |
| 76 | } |
| 77 | } |
| 78 | return nil |
| 79 | }) |
| 80 | if err != nil { |
| 81 | return 0, errors.Trace(err) |
| 82 | } |
| 83 | |
| 84 | var infos []specv1.AppInfo |
| 85 | infos = append(infos, node.Report.AppInfos(false)...) |
| 86 | infos = append(infos, node.Desire.AppInfos(false)...) |
| 87 | infos = append(infos, node.Report.AppInfos(true)...) |
| 88 | infos = append(infos, node.Desire.AppInfos(true)...) |
| 89 | occupied := map[string]string{} |
| 90 | for _, info := range infos { |
| 91 | occupied[info.Name] = info.Version |
| 92 | } |
| 93 | obsoleteApps := make(map[string]*specv1.Application) |
| 94 | occupiedApps := make(map[string]*specv1.Application) |
| 95 | err = e.sto.ForEach(nil, func(app *specv1.Application) error { |
| 96 | if ver, ok := occupied[app.Name]; ok && ver == app.Version { |
| 97 | occupiedApps[app.Name] = app |
| 98 | return nil |
| 99 | } |
| 100 | if prev, ok := obsoleteApps[app.Name]; !ok || app.UpdateTime.After(prev.UpdateTime) { |
| 101 | obsoleteApps[app.Name] = app |
| 102 | } |
| 103 | return nil |
| 104 | }) |
| 105 | finishedJobs := getFinishedJobs(occupiedApps, node) |
| 106 | usedObjectCfgs := getUsedObjectCfgs(occupiedApps, finishedJobs) |
| 107 | for name, ver := range usedObjectCfgs { |
| 108 | key := makeKey(specv1.KindConfiguration, name, ver) |
| 109 | if _, ok := objectCfgs[key]; ok && key != "" { |
| 110 | delete(objectCfgs, key) |
| 111 | } |
| 112 | } |
| 113 | |
| 114 | dels := getDelObjectCfgs(occupiedApps, obsoleteApps, objectCfgs, finishedJobs) |
| 115 | var subs []os.DirEntry |
| 116 | for k, v := range dels { |
| 117 | if err = e.sto.Delete(k, specv1.Configuration{}); err != nil { |
| 118 | e.log.Error("failed to delete configuration", log.Error(err)) |
| 119 | } |
| 120 | dir := filepath.Join(e.cfg.Sync.Download.Path, v.Name) |
| 121 | subs, err = os.ReadDir(dir) |
| 122 | if err != nil { |