@@ -7,18 +7,24 @@ package container
77import (
88 "context"
99 "encoding/hex"
10+ "errors"
1011 "fmt"
12+ "os"
1113 "strings"
14+ "sync"
1215
1316 "code.gitea.io/gitea/models/db"
1417 packages_model "code.gitea.io/gitea/models/packages"
1518 container_model "code.gitea.io/gitea/models/packages/container"
1619 "code.gitea.io/gitea/modules/log"
1720 packages_module "code.gitea.io/gitea/modules/packages"
1821 container_module "code.gitea.io/gitea/modules/packages/container"
22+ "code.gitea.io/gitea/modules/util"
1923 packages_service "code.gitea.io/gitea/services/packages"
2024)
2125
26+ var uploadVersionMutex sync.Mutex
27+
2228// saveAsPackageBlob creates a package blob from an upload
2329// The uploaded blob gets stored in a special upload version to link them to the package/image
2430func saveAsPackageBlob (hsr packages_module.HashedSizeReader , pi * packages_service.PackageInfo ) (* packages_model.PackageBlob , error ) {
@@ -28,6 +34,11 @@ func saveAsPackageBlob(hsr packages_module.HashedSizeReader, pi *packages_servic
2834
2935 contentStore := packages_module .NewContentStore ()
3036
37+ var uploadVersion * packages_model.PackageVersion
38+
39+ // FIXME: Replace usage of mutex with database transaction
40+ // https://github.com/go-gitea/gitea/pull/21862
41+ uploadVersionMutex .Lock ()
3142 err := db .WithTx (db .DefaultContext , func (ctx context.Context ) error {
3243 created := true
3344 p := & packages_model.Package {
@@ -68,11 +79,30 @@ func saveAsPackageBlob(hsr packages_module.HashedSizeReader, pi *packages_servic
6879 }
6980 }
7081
82+ uploadVersion = pv
83+
84+ return nil
85+ })
86+ uploadVersionMutex .Unlock ()
87+ if err != nil {
88+ return nil , err
89+ }
90+
91+ err = db .WithTx (db .DefaultContext , func (ctx context.Context ) error {
7192 pb , exists , err = packages_model .GetOrInsertBlob (ctx , pb )
7293 if err != nil {
7394 log .Error ("Error inserting package blob: %v" , err )
7495 return err
7596 }
97+ // FIXME: Workaround to be removed in v1.20
98+ // https://github.com/go-gitea/gitea/issues/19586
99+ if exists {
100+ err = contentStore .Has (packages_module .BlobHash256Key (pb .HashSHA256 ))
101+ if err != nil && (errors .Is (err , util .ErrNotExist ) || errors .Is (err , os .ErrNotExist )) {
102+ log .Debug ("Package registry inconsistent: blob %s does not exist on file system" , pb .HashSHA256 )
103+ exists = false
104+ }
105+ }
76106 if ! exists {
77107 if err := contentStore .Save (packages_module .BlobHash256Key (pb .HashSHA256 ), hsr , hsr .Size ()); err != nil {
78108 log .Error ("Error saving package blob in content store: %v" , err )
@@ -83,7 +113,7 @@ func saveAsPackageBlob(hsr packages_module.HashedSizeReader, pi *packages_servic
83113 filename := strings .ToLower (fmt .Sprintf ("sha256_%s" , pb .HashSHA256 ))
84114
85115 pf := & packages_model.PackageFile {
86- VersionID : pv .ID ,
116+ VersionID : uploadVersion .ID ,
87117 BlobID : pb .ID ,
88118 Name : filename ,
89119 LowerName : filename ,
0 commit comments