@@ -10,20 +10,18 @@ import (
10
10
"fmt"
11
11
"os"
12
12
"strings"
13
- "sync"
14
13
15
14
"code.gitea.io/gitea/models/db"
16
15
packages_model "code.gitea.io/gitea/models/packages"
17
16
container_model "code.gitea.io/gitea/models/packages/container"
17
+ "code.gitea.io/gitea/modules/globallock"
18
18
"code.gitea.io/gitea/modules/log"
19
19
packages_module "code.gitea.io/gitea/modules/packages"
20
20
container_module "code.gitea.io/gitea/modules/packages/container"
21
21
"code.gitea.io/gitea/modules/util"
22
22
packages_service "code.gitea.io/gitea/services/packages"
23
23
)
24
24
25
- var uploadVersionMutex sync.Mutex
26
-
27
25
// saveAsPackageBlob creates a package blob from an upload
28
26
// The uploaded blob gets stored in a special upload version to link them to the package/image
29
27
func 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
90
88
})
91
89
}
92
90
91
+ func containerPkgName (piOwnerID int64 , piName string ) string {
92
+ return fmt .Sprintf ("pkg_%d_container_%s" , piOwnerID , strings .ToLower (piName ))
93
+ }
94
+
93
95
func getOrCreateUploadVersion (ctx context.Context , pi * packages_service.PackageInfo ) (* packages_model.PackageVersion , error ) {
94
96
var uploadVersion * packages_model.PackageVersion
95
97
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 {
100
105
created := true
101
106
p := & packages_model.Package {
102
107
OwnerID : pi .Owner .ID ,
@@ -140,7 +145,6 @@ func getOrCreateUploadVersion(ctx context.Context, pi *packages_service.PackageI
140
145
141
146
return nil
142
147
})
143
- uploadVersionMutex .Unlock ()
144
148
145
149
return uploadVersion , err
146
150
}
@@ -173,6 +177,12 @@ func createFileForBlob(ctx context.Context, pv *packages_model.PackageVersion, p
173
177
}
174
178
175
179
func 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
+
176
186
return db .WithTx (ctx , func (ctx context.Context ) error {
177
187
pfds , err := container_model .GetContainerBlobs (ctx , & container_model.BlobSearchOptions {
178
188
OwnerID : ownerID ,
0 commit comments