@@ -10,23 +10,29 @@ import (
1010 "fmt"
1111 "os"
1212 "strings"
13- "sync"
1413
1514 "code.gitea.io/gitea/models/db"
1615 packages_model "code.gitea.io/gitea/models/packages"
1716 container_model "code.gitea.io/gitea/models/packages/container"
17+ user_model "code.gitea.io/gitea/models/user"
1818 "code.gitea.io/gitea/modules/log"
1919 packages_module "code.gitea.io/gitea/modules/packages"
2020 container_module "code.gitea.io/gitea/modules/packages/container"
21+ "code.gitea.io/gitea/modules/sync"
2122 "code.gitea.io/gitea/modules/util"
2223 packages_service "code.gitea.io/gitea/services/packages"
2324)
2425
25- var uploadVersionMutex sync.Mutex
26+ // TODO: use clustered lock
27+ var uploadVersionMutex = sync .NewExclusivePool ()
2628
2729// saveAsPackageBlob creates a package blob from an upload
2830// The uploaded blob gets stored in a special upload version to link them to the package/image
2931func saveAsPackageBlob (ctx context.Context , hsr packages_module.HashedSizeReader , pci * packages_service.PackageCreationInfo ) (* packages_model.PackageBlob , error ) {
32+ pkgPath := pci .PackageInfo .Owner .LowerName + "/" + pci .PackageInfo .Name
33+ uploadVersionMutex .CheckIn (pkgPath )
34+ defer uploadVersionMutex .CheckOut (pkgPath )
35+
3036 pb := packages_service .NewPackageBlob (hsr )
3137
3238 exists := false
@@ -80,6 +86,10 @@ func saveAsPackageBlob(ctx context.Context, hsr packages_module.HashedSizeReader
8086
8187// mountBlob mounts the specific blob to a different package
8288func mountBlob (ctx context.Context , pi * packages_service.PackageInfo , pb * packages_model.PackageBlob ) error {
89+ pkgPath := pi .Owner .LowerName + "/" + pi .Name
90+ uploadVersionMutex .CheckIn (pkgPath )
91+ defer uploadVersionMutex .CheckOut (pkgPath )
92+
8393 uploadVersion , err := getOrCreateUploadVersion (ctx , pi )
8494 if err != nil {
8595 return err
@@ -93,9 +103,6 @@ func mountBlob(ctx context.Context, pi *packages_service.PackageInfo, pb *packag
93103func getOrCreateUploadVersion (ctx context.Context , pi * packages_service.PackageInfo ) (* packages_model.PackageVersion , error ) {
94104 var uploadVersion * packages_model.PackageVersion
95105
96- // FIXME: Replace usage of mutex with database transaction
97- // https://github.com/go-gitea/gitea/pull/21862
98- uploadVersionMutex .Lock ()
99106 err := db .WithTx (ctx , func (ctx context.Context ) error {
100107 created := true
101108 p := & packages_model.Package {
@@ -140,7 +147,6 @@ func getOrCreateUploadVersion(ctx context.Context, pi *packages_service.PackageI
140147
141148 return nil
142149 })
143- uploadVersionMutex .Unlock ()
144150
145151 return uploadVersion , err
146152}
@@ -172,10 +178,14 @@ func createFileForBlob(ctx context.Context, pv *packages_model.PackageVersion, p
172178 return nil
173179}
174180
175- func deleteBlob (ctx context.Context , ownerID int64 , image , digest string ) error {
181+ func deleteBlob (ctx context.Context , owner * user_model.User , image , digest string ) error {
182+ pkgPath := owner .LowerName + "/" + image
183+ uploadVersionMutex .CheckIn (pkgPath )
184+ defer uploadVersionMutex .CheckOut (pkgPath )
185+
176186 return db .WithTx (ctx , func (ctx context.Context ) error {
177187 pfds , err := container_model .GetContainerBlobs (ctx , & container_model.BlobSearchOptions {
178- OwnerID : ownerID ,
188+ OwnerID : owner . ID ,
179189 Image : image ,
180190 Digest : digest ,
181191 })
0 commit comments