forked from ALHP/ALHP.GO
run housekeeping concurrent per repo
update splitpackages on parse
This commit is contained in:
21
main.go
21
main.go
@@ -24,6 +24,7 @@ import (
|
|||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@@ -228,12 +229,12 @@ func (b *BuildManager) parseWorker() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if skipping {
|
if skipping {
|
||||||
dbPkg.Update().SetUpdated(time.Now()).SetVersion(pkg.Version).SetStatus(dbPkg.Status).SetSkipReason(dbPkg.SkipReason).SetHash(pkg.Hash).ExecX(context.Background())
|
dbPkg.Update().SetUpdated(time.Now()).SetVersion(pkg.Version).SetPackages(packages2slice(pkg.Srcinfo.Packages)).SetStatus(dbPkg.Status).SetSkipReason(dbPkg.SkipReason).SetHash(pkg.Hash).ExecX(context.Background())
|
||||||
b.repoPurge[pkg.FullRepo] <- pkg
|
b.repoPurge[pkg.FullRepo] <- pkg
|
||||||
b.parseWG.Done()
|
b.parseWG.Done()
|
||||||
continue
|
continue
|
||||||
} else {
|
} else {
|
||||||
dbPkg = dbPkg.Update().SetUpdated(time.Now()).SetVersion(pkg.Version).SaveX(context.Background())
|
dbPkg = dbPkg.Update().SetUpdated(time.Now()).SetPackages(packages2slice(pkg.Srcinfo.Packages)).SetVersion(pkg.Version).SaveX(context.Background())
|
||||||
}
|
}
|
||||||
|
|
||||||
repoVer, err := pkg.repoVersion()
|
repoVer, err := pkg.repoVersion()
|
||||||
@@ -510,15 +511,23 @@ func (b *BuildManager) syncWorker() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// housekeeping
|
// housekeeping
|
||||||
err := housekeeping()
|
wg := new(sync.WaitGroup)
|
||||||
if err != nil {
|
for _, repo := range repos {
|
||||||
log.Warningf("Housekeeping failed: %v", err)
|
wg.Add(1)
|
||||||
|
repo := repo
|
||||||
|
go func() {
|
||||||
|
err := housekeeping(repo, wg)
|
||||||
|
if err != nil {
|
||||||
|
log.Warningf("[%s] Housekeeping failed: %v", repo, err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
}
|
}
|
||||||
|
wg.Wait()
|
||||||
|
|
||||||
// fetch updates between sync runs
|
// fetch updates between sync runs
|
||||||
b.alpmMutex.Lock()
|
b.alpmMutex.Lock()
|
||||||
check(alpmHandle.Release())
|
check(alpmHandle.Release())
|
||||||
err = setupChroot()
|
err := setupChroot()
|
||||||
for err != nil {
|
for err != nil {
|
||||||
log.Warningf("Unable to upgrade chroot, trying again later.")
|
log.Warningf("Unable to upgrade chroot, trying again later.")
|
||||||
time.Sleep(time.Minute)
|
time.Sleep(time.Minute)
|
||||||
|
139
utils.go
139
utils.go
@@ -474,88 +474,87 @@ func (path PKGFile) isSignatureValid() (bool, error) {
|
|||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func housekeeping() error {
|
func housekeeping(repo string, wg *sync.WaitGroup) error {
|
||||||
log.Debugf("Start housekeeping")
|
defer wg.Done()
|
||||||
for _, repo := range repos {
|
log.Debugf("[%s] Start housekeeping", repo)
|
||||||
packages, err := Glob(filepath.Join(conf.Basedir.Repo, repo, "/**/*.pkg.tar.zst"))
|
packages, err := Glob(filepath.Join(conf.Basedir.Repo, repo, "/**/*.pkg.tar.zst"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, path := range packages {
|
||||||
|
pkgfile := PKGFile(path)
|
||||||
|
dbPkg, err := pkgfile.DBPackage()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Warningf("[HK] Unable to find entry for %s in db: %v", filepath.Base(path), err)
|
||||||
|
// TODO: remove orphan file not tracked by db (WTF kmod-debug!)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
pkg := &BuildPackage{
|
||||||
|
Pkgbase: dbPkg.Pkgbase,
|
||||||
|
Repo: dbPkg.Repository,
|
||||||
|
FullRepo: dbPkg.Repository.String() + "-" + dbPkg.March,
|
||||||
|
}
|
||||||
|
|
||||||
|
var upstream string
|
||||||
|
switch dbPkg.Repository {
|
||||||
|
case dbpackage.RepositoryCore, dbpackage.RepositoryExtra:
|
||||||
|
upstream = "upstream-core-extra"
|
||||||
|
case dbpackage.RepositoryCommunity:
|
||||||
|
upstream = "upstream-community"
|
||||||
|
}
|
||||||
|
|
||||||
|
pkg.Pkgbuild = filepath.Join(conf.Basedir.Upstream, upstream, dbPkg.Pkgbase, "repos", dbPkg.Repository.String()+"-"+conf.Arch, "PKGBUILD")
|
||||||
|
if err = pkg.genSrcinfo(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, path := range packages {
|
// check if pkg signature is valid
|
||||||
pkgfile := PKGFile(path)
|
valid, err := pkgfile.isSignatureValid()
|
||||||
dbPkg, err := pkgfile.DBPackage()
|
if err != nil {
|
||||||
if err != nil {
|
return err
|
||||||
log.Warningf("[HK] Unable to find entry for %s in db: %v", filepath.Base(path), err)
|
}
|
||||||
// TODO: remove orphan file not tracked by db (WTF kmod-debug!)
|
if !valid {
|
||||||
continue
|
log.Infof("[HK/%s/%s] invalid package signature", pkg.FullRepo, pkg.Pkgbase)
|
||||||
}
|
buildManager.repoPurge[pkg.FullRepo] <- pkg
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
pkg := &BuildPackage{
|
// compare db-version with repo version
|
||||||
Pkgbase: dbPkg.Pkgbase,
|
repoVer, err := pkg.repoVersion()
|
||||||
Repo: dbPkg.Repository,
|
if err != nil {
|
||||||
FullRepo: dbPkg.Repository.String() + "-" + dbPkg.March,
|
log.Infof("[HK/%s/%s] package not present on disk", pkg.FullRepo, pkg.Pkgbase)
|
||||||
}
|
// error means package was not found -> delete version & hash from db so rebuild can happen
|
||||||
|
err := dbPkg.Update().ClearHash().ClearRepoVersion().Exec(context.Background())
|
||||||
var upstream string
|
|
||||||
switch dbPkg.Repository {
|
|
||||||
case dbpackage.RepositoryCore, dbpackage.RepositoryExtra:
|
|
||||||
upstream = "upstream-core-extra"
|
|
||||||
case dbpackage.RepositoryCommunity:
|
|
||||||
upstream = "upstream-community"
|
|
||||||
}
|
|
||||||
|
|
||||||
pkg.Pkgbuild = filepath.Join(conf.Basedir.Upstream, upstream, dbPkg.Pkgbase, "repos", dbPkg.Repository.String()+"-"+conf.Arch, "PKGBUILD")
|
|
||||||
if err = pkg.genSrcinfo(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if pkg signature is valid
|
|
||||||
valid, err := pkgfile.isSignatureValid()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if !valid {
|
} else if alpm.VerCmp(repoVer, dbPkg.RepoVersion) != 0 {
|
||||||
log.Infof("[HK/%s/%s] invalid package signature", pkg.FullRepo, pkg.Pkgbase)
|
log.Infof("[HK/%s/%s] update %s->%s in db", pkg.FullRepo, pkg.Pkgbase, dbPkg.RepoVersion, repoVer)
|
||||||
buildManager.repoPurge[pkg.FullRepo] <- pkg
|
dbPkg, err = dbPkg.Update().SetRepoVersion(repoVer).Save(context.Background())
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// compare db-version with repo version
|
|
||||||
repoVer, err := pkg.repoVersion()
|
|
||||||
if err != nil {
|
|
||||||
log.Infof("[HK/%s/%s] package not present on disk", pkg.FullRepo, pkg.Pkgbase)
|
|
||||||
// error means package was not found -> delete version & hash from db so rebuild can happen
|
|
||||||
err := dbPkg.Update().ClearHash().ClearRepoVersion().Exec(context.Background())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else if alpm.VerCmp(repoVer, dbPkg.RepoVersion) != 0 {
|
|
||||||
log.Infof("[HK/%s/%s] update %s->%s in db", pkg.FullRepo, pkg.Pkgbase, dbPkg.RepoVersion, repoVer)
|
|
||||||
dbPkg, err = dbPkg.Update().SetRepoVersion(repoVer).Save(context.Background())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: check split packages
|
|
||||||
|
|
||||||
// check if package is still part of repo
|
|
||||||
dbs, err := alpmHandle.SyncDBs()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
pkgResolved, err := dbs.FindSatisfier(pkg.Srcinfo.Packages[0].Pkgname)
|
}
|
||||||
if err != nil || pkgResolved.DB().Name() != dbPkg.Repository.String() {
|
|
||||||
// package not found on mirror/db -> not part of any repo anymore
|
// TODO: check split packages
|
||||||
log.Infof("[HK/%s/%s] not part of repo", pkg.FullRepo, pkg.Pkgbase)
|
|
||||||
buildManager.repoPurge[pkg.FullRepo] <- pkg
|
// check if package is still part of repo
|
||||||
err = db.DbPackage.DeleteOne(dbPkg).Exec(context.Background())
|
dbs, err := alpmHandle.SyncDBs()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
continue
|
pkgResolved, err := dbs.FindSatisfier(pkg.Srcinfo.Packages[0].Pkgname)
|
||||||
|
if err != nil || pkgResolved.DB().Name() != dbPkg.Repository.String() {
|
||||||
|
// package not found on mirror/db -> not part of any repo anymore
|
||||||
|
log.Infof("[HK/%s/%s] not part of repo", pkg.FullRepo, pkg.Pkgbase)
|
||||||
|
buildManager.repoPurge[pkg.FullRepo] <- pkg
|
||||||
|
err = db.DbPackage.DeleteOne(dbPkg).Exec(context.Background())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user