@@ -7,8 +7,11 @@ 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"
@@ -19,6 +22,8 @@ import (
1922 packages_service "code.gitea.io/gitea/services/packages"
2023)
2124
25+ var uploadVersionMutex sync.Mutex
26+
2227// saveAsPackageBlob creates a package blob from an upload
2328// The uploaded blob gets stored in a special upload version to link them to the package/image
2429func saveAsPackageBlob (hsr packages_module.HashedSizeReader , pi * packages_service.PackageInfo ) (* packages_model.PackageBlob , error ) {
@@ -28,6 +33,11 @@ func saveAsPackageBlob(hsr packages_module.HashedSizeReader, pi *packages_servic
2833
2934 contentStore := packages_module .NewContentStore ()
3035
36+ var uploadVersion * packages_model.PackageVersion
37+
38+ // FIXME: Replace usage of mutex with database transaction
39+ // https://github.com/go-gitea/gitea/pull/21862
40+ uploadVersionMutex .Lock ()
3141 err := db .WithTx (func (ctx context.Context ) error {
3242 created := true
3343 p := & packages_model.Package {
@@ -68,11 +78,30 @@ func saveAsPackageBlob(hsr packages_module.HashedSizeReader, pi *packages_servic
6878 }
6979 }
7080
81+ uploadVersion = pv
82+
83+ return nil
84+ })
85+ uploadVersionMutex .Unlock ()
86+ if err != nil {
87+ return nil , err
88+ }
89+
90+ err = db .WithTx (func (ctx context.Context ) error {
7191 pb , exists , err = packages_model .GetOrInsertBlob (ctx , pb )
7292 if err != nil {
7393 log .Error ("Error inserting package blob: %v" , err )
7494 return err
7595 }
96+ // FIXME: Workaround to be removed in v1.20
97+ // https://github.com/go-gitea/gitea/issues/19586
98+ if exists {
99+ err = contentStore .Has (packages_module .BlobHash256Key (pb .HashSHA256 ))
100+ if err != nil && errors .Is (err , os .ErrNotExist ) {
101+ log .Debug ("Package registry inconsistent: blob %s does not exist on file system" , pb .HashSHA256 )
102+ exists = false
103+ }
104+ }
76105 if ! exists {
77106 if err := contentStore .Save (packages_module .BlobHash256Key (pb .HashSHA256 ), hsr , hsr .Size ()); err != nil {
78107 log .Error ("Error saving package blob in content store: %v" , err )
@@ -83,7 +112,7 @@ func saveAsPackageBlob(hsr packages_module.HashedSizeReader, pi *packages_servic
83112 filename := strings .ToLower (fmt .Sprintf ("sha256_%s" , pb .HashSHA256 ))
84113
85114 pf := & packages_model.PackageFile {
86- VersionID : pv .ID ,
115+ VersionID : uploadVersion .ID ,
87116 BlobID : pb .ID ,
88117 Name : filename ,
89118 LowerName : filename ,
0 commit comments