@@ -10,20 +10,18 @@ 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+ "code.gitea.io/gitea/modules/globallock"
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"
2121 "code.gitea.io/gitea/modules/util"
2222 packages_service "code.gitea.io/gitea/services/packages"
2323)
2424
25- var uploadVersionMutex sync.Mutex
26-
2725// saveAsPackageBlob creates a package blob from an upload
2826// The uploaded blob gets stored in a special upload version to link them to the package/image
2927func saveAsPackageBlob (ctx context.Context , hsr packages_module.HashedSizeReader , pci * packages_service.PackageCreationInfo ) (* packages_model.PackageBlob , error ) { //nolint:unparam
@@ -90,13 +88,20 @@ func mountBlob(ctx context.Context, pi *packages_service.PackageInfo, pb *packag
9088 })
9189}
9290
91+ func containerPkgName (piOwnerID int64 , piName string ) string {
92+ return fmt .Sprintf ("pkg_%d_container_%s" , piOwnerID , strings .ToLower (piName ))
93+ }
94+
9395func getOrCreateUploadVersion (ctx context.Context , pi * packages_service.PackageInfo ) (* packages_model.PackageVersion , error ) {
9496 var uploadVersion * packages_model.PackageVersion
9597
96- // FIXME: Replace usage of mutex with database transaction
97- // https://github.com/go-gitea/gitea/pull/21862
98- uploadVersionMutex .Lock ()
99- err := db .WithTx (ctx , func (ctx context.Context ) error {
98+ releaser , err := globallock .Lock (ctx , containerPkgName (pi .Owner .ID , pi .Name ))
99+ if err != nil {
100+ return nil , err
101+ }
102+ defer releaser ()
103+
104+ err = db .WithTx (ctx , func (ctx context.Context ) error {
100105 created := true
101106 p := & packages_model.Package {
102107 OwnerID : pi .Owner .ID ,
@@ -140,7 +145,6 @@ func getOrCreateUploadVersion(ctx context.Context, pi *packages_service.PackageI
140145
141146 return nil
142147 })
143- uploadVersionMutex .Unlock ()
144148
145149 return uploadVersion , err
146150}
@@ -173,6 +177,12 @@ func createFileForBlob(ctx context.Context, pv *packages_model.PackageVersion, p
173177}
174178
175179func deleteBlob (ctx context.Context , ownerID int64 , image , digest string ) error {
180+ releaser , err := globallock .Lock (ctx , containerPkgName (ownerID , image ))
181+ if err != nil {
182+ return err
183+ }
184+ defer releaser ()
185+
176186 return db .WithTx (ctx , func (ctx context.Context ) error {
177187 pfds , err := container_model .GetContainerBlobs (ctx , & container_model.BlobSearchOptions {
178188 OwnerID : ownerID ,
0 commit comments