@@ -10,23 +10,29 @@ 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
+ user_model "code.gitea.io/gitea/models/user"
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
+ "code.gitea.io/gitea/modules/sync"
21
22
"code.gitea.io/gitea/modules/util"
22
23
packages_service "code.gitea.io/gitea/services/packages"
23
24
)
24
25
25
- var uploadVersionMutex sync.Mutex
26
+ // TODO: use clustered lock
27
+ var uploadVersionMutex = sync .NewExclusivePool ()
26
28
27
29
// saveAsPackageBlob creates a package blob from an upload
28
30
// The uploaded blob gets stored in a special upload version to link them to the package/image
29
31
func 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
+
30
36
pb := packages_service .NewPackageBlob (hsr )
31
37
32
38
exists := false
@@ -80,6 +86,10 @@ func saveAsPackageBlob(ctx context.Context, hsr packages_module.HashedSizeReader
80
86
81
87
// mountBlob mounts the specific blob to a different package
82
88
func 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
+
83
93
uploadVersion , err := getOrCreateUploadVersion (ctx , pi )
84
94
if err != nil {
85
95
return err
@@ -93,9 +103,6 @@ func mountBlob(ctx context.Context, pi *packages_service.PackageInfo, pb *packag
93
103
func getOrCreateUploadVersion (ctx context.Context , pi * packages_service.PackageInfo ) (* packages_model.PackageVersion , error ) {
94
104
var uploadVersion * packages_model.PackageVersion
95
105
96
- // FIXME: Replace usage of mutex with database transaction
97
- // https://github.com/go-gitea/gitea/pull/21862
98
- uploadVersionMutex .Lock ()
99
106
err := db .WithTx (ctx , func (ctx context.Context ) error {
100
107
created := true
101
108
p := & packages_model.Package {
@@ -140,7 +147,6 @@ func getOrCreateUploadVersion(ctx context.Context, pi *packages_service.PackageI
140
147
141
148
return nil
142
149
})
143
- uploadVersionMutex .Unlock ()
144
150
145
151
return uploadVersion , err
146
152
}
@@ -172,10 +178,14 @@ func createFileForBlob(ctx context.Context, pv *packages_model.PackageVersion, p
172
178
return nil
173
179
}
174
180
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
+
176
186
return db .WithTx (ctx , func (ctx context.Context ) error {
177
187
pfds , err := container_model .GetContainerBlobs (ctx , & container_model.BlobSearchOptions {
178
- OwnerID : ownerID ,
188
+ OwnerID : owner . ID ,
179
189
Image : image ,
180
190
Digest : digest ,
181
191
})
0 commit comments