@@ -77,24 +77,33 @@ func processManifest(ctx context.Context, mci *manifestCreationInfo, buf *packag
77
77
return "" , errManifestInvalid
78
78
}
79
79
80
- func processOciImageManifest (ctx context.Context , mci * manifestCreationInfo , buf * packages_module.HashedBuffer ) (string , error ) {
81
- manifestDigest := ""
80
+ type processManifestTxRet struct {
81
+ pv * packages_model.PackageVersion
82
+ pb * packages_model.PackageBlob
83
+ created bool
84
+ digest string
85
+ }
82
86
83
- err := func () error {
84
- manifest , configDescriptor , metadata , err := container_service .ParseManifestMetadata (ctx , buf , mci .Owner .ID , mci .Image )
85
- if err != nil {
86
- return err
87
- }
88
- if _ , err = buf .Seek (0 , io .SeekStart ); err != nil {
89
- return err
90
- }
87
+ func processOciImageManifest ( ctx context. Context , mci * manifestCreationInfo , buf * packages_module. HashedBuffer ) ( manifestDigest string , errRet error ) {
88
+ manifest , configDescriptor , metadata , err := container_service .ParseManifestMetadata (ctx , buf , mci .Owner .ID , mci .Image )
89
+ if err != nil {
90
+ return "" , err
91
+ }
92
+ if _ , err = buf .Seek (0 , io .SeekStart ); err != nil {
93
+ return "" , err
94
+ }
91
95
92
- ctx , committer , err := db .TxContext (ctx )
93
- if err != nil {
94
- return err
96
+ var txRet processManifestTxRet
97
+ defer func () {
98
+ if errRet != nil && txRet .created && txRet .pb != nil {
99
+ contentStore := packages_module .NewContentStore ()
100
+ if err := contentStore .Delete (packages_module .BlobHash256Key (txRet .pb .HashSHA256 )); err != nil {
101
+ log .Error ("Error deleting package blob from content store: %v" , err )
102
+ }
95
103
}
96
- defer committer . Close ()
104
+ } ()
97
105
106
+ err = db .WithTx (ctx , func (ctx context.Context ) (err error ) {
98
107
blobReferences := make ([]* blobReference , 0 , 1 + len (manifest .Layers ))
99
108
blobReferences = append (blobReferences , & blobReference {
100
109
Digest : manifest .Config .Digest ,
@@ -120,14 +129,13 @@ func processOciImageManifest(ctx context.Context, mci *manifestCreationInfo, buf
120
129
ExpectedSize : layer .Size ,
121
130
})
122
131
}
123
-
124
132
pv , err := createPackageAndVersion (ctx , mci , metadata )
125
133
if err != nil {
126
134
return err
127
135
}
128
136
129
137
uploadVersion , err := packages_model .GetInternalVersionByNameAndVersion (ctx , mci .Owner .ID , packages_model .TypeContainer , mci .Image , container_module .UploadVersion )
130
- if err != nil && err != packages_model .ErrPackageNotExist {
138
+ if err != nil && ! errors . Is ( err , packages_model .ErrPackageNotExist ) {
131
139
return err
132
140
}
133
141
@@ -136,61 +144,37 @@ func processOciImageManifest(ctx context.Context, mci *manifestCreationInfo, buf
136
144
return err
137
145
}
138
146
}
139
-
140
- pb , created , digest , err := createManifestBlob (ctx , mci , pv , buf )
141
- removeBlob := false
142
- defer func () {
143
- if removeBlob {
144
- contentStore := packages_module .NewContentStore ()
145
- if err := contentStore .Delete (packages_module .BlobHash256Key (pb .HashSHA256 )); err != nil {
146
- log .Error ("Error deleting package blob from content store: %v" , err )
147
- }
148
- }
149
- }()
150
- if err != nil {
151
- removeBlob = created
152
- return err
153
- }
154
-
155
- if err := committer .Commit (); err != nil {
156
- removeBlob = created
157
- return err
158
- }
159
-
160
- if err := notifyPackageCreate (ctx , mci .Creator , pv ); err != nil {
161
- return err
162
- }
163
-
164
- manifestDigest = digest
165
-
166
- return nil
167
- }()
147
+ txRet .pb , txRet .created , txRet .digest , err = createManifestBlob (ctx , mci , pv , buf )
148
+ return err
149
+ })
168
150
if err != nil {
169
151
return "" , err
170
152
}
171
153
172
- return manifestDigest , nil
154
+ notifyPackageCreate (ctx , mci .Creator , txRet .pv )
155
+ return txRet .digest , nil
173
156
}
174
157
175
- func processOciImageIndex (ctx context.Context , mci * manifestCreationInfo , buf * packages_module.HashedBuffer ) (string , error ) {
176
- manifestDigest := ""
177
-
178
- err := func () error {
179
- var index oci.Index
180
- if err := json .NewDecoder (buf ).Decode (& index ); err != nil {
181
- return err
182
- }
183
-
184
- if _ , err := buf .Seek (0 , io .SeekStart ); err != nil {
185
- return err
186
- }
158
+ func processOciImageIndex (ctx context.Context , mci * manifestCreationInfo , buf * packages_module.HashedBuffer ) (manifestDigest string , errRet error ) {
159
+ var index oci.Index
160
+ if err := json .NewDecoder (buf ).Decode (& index ); err != nil {
161
+ return "" , err
162
+ }
163
+ if _ , err := buf .Seek (0 , io .SeekStart ); err != nil {
164
+ return "" , err
165
+ }
187
166
188
- ctx , committer , err := db .TxContext (ctx )
189
- if err != nil {
190
- return err
167
+ var txRet processManifestTxRet
168
+ defer func () {
169
+ if errRet != nil && txRet .created && txRet .pb != nil {
170
+ contentStore := packages_module .NewContentStore ()
171
+ if err := contentStore .Delete (packages_module .BlobHash256Key (txRet .pb .HashSHA256 )); err != nil {
172
+ log .Error ("Error deleting package blob from content store: %v" , err )
173
+ }
191
174
}
192
- defer committer . Close ()
175
+ } ()
193
176
177
+ err := db .WithTx (ctx , func (ctx context.Context ) (err error ) {
194
178
metadata := & container_module.Metadata {
195
179
Type : container_module .TypeOCI ,
196
180
Manifests : make ([]* container_module.Manifest , 0 , len (index .Manifests )),
@@ -241,50 +225,24 @@ func processOciImageIndex(ctx context.Context, mci *manifestCreationInfo, buf *p
241
225
return err
242
226
}
243
227
244
- pb , created , digest , err := createManifestBlob (ctx , mci , pv , buf )
245
- removeBlob := false
246
- defer func () {
247
- if removeBlob {
248
- contentStore := packages_module .NewContentStore ()
249
- if err := contentStore .Delete (packages_module .BlobHash256Key (pb .HashSHA256 )); err != nil {
250
- log .Error ("Error deleting package blob from content store: %v" , err )
251
- }
252
- }
253
- }()
254
- if err != nil {
255
- removeBlob = created
256
- return err
257
- }
258
-
259
- if err := committer .Commit (); err != nil {
260
- removeBlob = created
261
- return err
262
- }
263
-
264
- if err := notifyPackageCreate (ctx , mci .Creator , pv ); err != nil {
265
- return err
266
- }
267
-
268
- manifestDigest = digest
269
-
270
- return nil
271
- }()
228
+ txRet .pb , txRet .created , txRet .digest , err = createManifestBlob (ctx , mci , pv , buf )
229
+ return err
230
+ })
272
231
if err != nil {
273
232
return "" , err
274
233
}
275
234
276
- return manifestDigest , nil
235
+ notifyPackageCreate (ctx , mci .Creator , txRet .pv )
236
+ return txRet .digest , nil
277
237
}
278
238
279
- func notifyPackageCreate (ctx context.Context , doer * user_model.User , pv * packages_model.PackageVersion ) error {
239
+ func notifyPackageCreate (ctx context.Context , doer * user_model.User , pv * packages_model.PackageVersion ) {
280
240
pd , err := packages_model .GetPackageDescriptor (ctx , pv )
281
241
if err != nil {
282
- return err
242
+ log .Error ("Error getting package descriptor: %v" , err )
243
+ return
283
244
}
284
-
285
245
notify_service .PackageCreate (ctx , doer , pd )
286
-
287
- return nil
288
246
}
289
247
290
248
func createPackageAndVersion (ctx context.Context , mci * manifestCreationInfo , metadata * container_module.Metadata ) (* packages_model.PackageVersion , error ) {
@@ -437,7 +395,7 @@ func createFileFromBlobReference(ctx context.Context, pv, uploadVersion *package
437
395
return pf , nil
438
396
}
439
397
440
- func createManifestBlob (ctx context.Context , mci * manifestCreationInfo , pv * packages_model.PackageVersion , buf * packages_module.HashedBuffer ) (* packages_model.PackageBlob , bool , string , error ) {
398
+ func createManifestBlob (ctx context.Context , mci * manifestCreationInfo , pv * packages_model.PackageVersion , buf * packages_module.HashedBuffer ) (_ * packages_model.PackageBlob , created bool , manifestDigest string , _ error ) {
441
399
pb , exists , err := packages_model .GetOrInsertBlob (ctx , packages_service .NewPackageBlob (buf ))
442
400
if err != nil {
443
401
log .Error ("Error inserting package blob: %v" , err )
@@ -460,7 +418,7 @@ func createManifestBlob(ctx context.Context, mci *manifestCreationInfo, pv *pack
460
418
}
461
419
}
462
420
463
- manifestDigest : = digestFromHashSummer (buf )
421
+ manifestDigest = digestFromHashSummer (buf )
464
422
pf , err := createFileFromBlobReference (ctx , pv , nil , & blobReference {
465
423
Digest : digest .Digest (manifestDigest ),
466
424
MediaType : mci .MediaType ,
0 commit comments