Skip to content

Commit e673b96

Browse files
committed
fix
1 parent a76aa77 commit e673b96

File tree

5 files changed

+48
-34
lines changed

5 files changed

+48
-34
lines changed

models/packages/package.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,21 +122,30 @@ type Package struct {
122122
func TryInsertPackage(ctx context.Context, p *Package) (*Package, error) {
123123
e := db.GetEngine(ctx)
124124

125-
key := &Package{
125+
pkg := &Package{
126126
OwnerID: p.OwnerID,
127127
Type: p.Type,
128128
LowerName: p.LowerName,
129129
}
130130

131-
has, err := e.Get(key)
131+
has, err := e.Get(pkg)
132132
if err != nil {
133133
return nil, err
134134
}
135135
if has {
136-
return key, ErrDuplicatePackage
136+
return pkg, ErrDuplicatePackage
137137
}
138-
if _, err = e.Insert(p); err != nil {
139-
return nil, err
138+
if _, errIns := e.Insert(p); errIns != nil {
139+
// there could be concurrent inserts, if the package record already exists, try to query it again
140+
has, err = e.Get(pkg)
141+
if err != nil {
142+
return nil, err
143+
}
144+
if has {
145+
return pkg, ErrDuplicatePackage
146+
}
147+
// if there is still no package record, return the original insert error
148+
return nil, errIns
140149
}
141150
return p, nil
142151
}

models/packages/package_blob.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,15 @@ func GetOrInsertBlob(ctx context.Context, pb *PackageBlob) (*PackageBlob, bool,
4242
if has {
4343
return pb, true, nil
4444
}
45-
if _, err = e.Insert(pb); err != nil {
46-
return nil, false, err
45+
if _, errIns := e.Insert(pb); errIns != nil {
46+
has, err = e.Get(pb)
47+
if err != nil {
48+
return nil, false, err
49+
}
50+
if has {
51+
return pb, true, nil
52+
}
53+
return nil, false, errIns
4754
}
4855
return pb, false, nil
4956
}

models/packages/package_file.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,21 +47,28 @@ type PackageFile struct {
4747
func TryInsertFile(ctx context.Context, pf *PackageFile) (*PackageFile, error) {
4848
e := db.GetEngine(ctx)
4949

50-
key := &PackageFile{
50+
pkgFile := &PackageFile{
5151
VersionID: pf.VersionID,
5252
LowerName: pf.LowerName,
5353
CompositeKey: pf.CompositeKey,
5454
}
5555

56-
has, err := e.Get(key)
56+
has, err := e.Get(pkgFile)
5757
if err != nil {
5858
return nil, err
5959
}
6060
if has {
61-
return pf, ErrDuplicatePackageFile
61+
return pkgFile, ErrDuplicatePackageFile
6262
}
63-
if _, err = e.Insert(pf); err != nil {
64-
return nil, err
63+
if _, errIns := e.Insert(pf); errIns != nil {
64+
has, err = e.Get(pkgFile)
65+
if err != nil {
66+
return nil, err
67+
}
68+
if has {
69+
return pkgFile, ErrDuplicatePackageFile
70+
}
71+
return nil, errIns
6572
}
6673
return pf, nil
6774
}

models/packages/package_version.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,20 +41,27 @@ type PackageVersion struct {
4141
func GetOrInsertVersion(ctx context.Context, pv *PackageVersion) (*PackageVersion, error) {
4242
e := db.GetEngine(ctx)
4343

44-
key := &PackageVersion{
44+
pkgVer := &PackageVersion{
4545
PackageID: pv.PackageID,
4646
LowerVersion: pv.LowerVersion,
4747
}
4848

49-
has, err := e.Get(key)
49+
has, err := e.Get(pkgVer)
5050
if err != nil {
5151
return nil, err
5252
}
5353
if has {
54-
return key, ErrDuplicatePackageVersion
54+
return pkgVer, ErrDuplicatePackageVersion
5555
}
56-
if _, err = e.Insert(pv); err != nil {
57-
return nil, err
56+
if _, errIns := e.Insert(pv); errIns != nil {
57+
has, err = e.Get(pkgVer)
58+
if err != nil {
59+
return nil, err
60+
}
61+
if has {
62+
return pkgVer, ErrDuplicatePackageVersion
63+
}
64+
return nil, errIns
5865
}
5966
return pv, nil
6067
}

routers/api/packages/container/blob.go

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"fmt"
1212
"os"
1313
"strings"
14-
"sync"
1514

1615
"code.gitea.io/gitea/models/db"
1716
packages_model "code.gitea.io/gitea/models/packages"
@@ -23,8 +22,6 @@ import (
2322
packages_service "code.gitea.io/gitea/services/packages"
2423
)
2524

26-
var uploadVersionMutex sync.Mutex
27-
2825
// saveAsPackageBlob creates a package blob from an upload
2926
// The uploaded blob gets stored in a special upload version to link them to the package/image
3027
func saveAsPackageBlob(hsr packages_module.HashedSizeReader, pi *packages_service.PackageInfo) (*packages_model.PackageBlob, error) {
@@ -34,9 +31,6 @@ func saveAsPackageBlob(hsr packages_module.HashedSizeReader, pi *packages_servic
3431

3532
contentStore := packages_module.NewContentStore()
3633

37-
var uploadVersion *packages_model.PackageVersion
38-
39-
uploadVersionMutex.Lock()
4034
err := db.WithTx(db.DefaultContext, func(ctx context.Context) error {
4135
created := true
4236
p := &packages_model.Package{
@@ -77,16 +71,6 @@ func saveAsPackageBlob(hsr packages_module.HashedSizeReader, pi *packages_servic
7771
}
7872
}
7973

80-
uploadVersion = pv
81-
82-
return nil
83-
})
84-
uploadVersionMutex.Unlock()
85-
if err != nil {
86-
return nil, err
87-
}
88-
89-
err = db.WithTx(db.DefaultContext, func(ctx context.Context) error {
9074
pb, exists, err = packages_model.GetOrInsertBlob(ctx, pb)
9175
if err != nil {
9276
log.Error("Error inserting package blob: %v", err)
@@ -111,7 +95,7 @@ func saveAsPackageBlob(hsr packages_module.HashedSizeReader, pi *packages_servic
11195
filename := strings.ToLower(fmt.Sprintf("sha256_%s", pb.HashSHA256))
11296

11397
pf := &packages_model.PackageFile{
114-
VersionID: uploadVersion.ID,
98+
VersionID: pv.ID,
11599
BlobID: pb.ID,
116100
Name: filename,
117101
LowerName: filename,

0 commit comments

Comments
 (0)