@@ -77,24 +77,33 @@ func processManifest(ctx context.Context, mci *manifestCreationInfo, buf *packag
7777 return "" , errManifestInvalid
7878}
7979
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+ }
8286
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+ }
9195
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+ }
95103 }
96- defer committer . Close ()
104+ } ()
97105
106+ err = db .WithTx (ctx , func (ctx context.Context ) (err error ) {
98107 blobReferences := make ([]* blobReference , 0 , 1 + len (manifest .Layers ))
99108 blobReferences = append (blobReferences , & blobReference {
100109 Digest : manifest .Config .Digest ,
@@ -120,14 +129,13 @@ func processOciImageManifest(ctx context.Context, mci *manifestCreationInfo, buf
120129 ExpectedSize : layer .Size ,
121130 })
122131 }
123-
124132 pv , err := createPackageAndVersion (ctx , mci , metadata )
125133 if err != nil {
126134 return err
127135 }
128136
129137 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 ) {
131139 return err
132140 }
133141
@@ -136,61 +144,37 @@ func processOciImageManifest(ctx context.Context, mci *manifestCreationInfo, buf
136144 return err
137145 }
138146 }
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+ })
168150 if err != nil {
169151 return "" , err
170152 }
171153
172- return manifestDigest , nil
154+ notifyPackageCreate (ctx , mci .Creator , txRet .pv )
155+ return txRet .digest , nil
173156}
174157
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+ }
187166
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+ }
191174 }
192- defer committer . Close ()
175+ } ()
193176
177+ err := db .WithTx (ctx , func (ctx context.Context ) (err error ) {
194178 metadata := & container_module.Metadata {
195179 Type : container_module .TypeOCI ,
196180 Manifests : make ([]* container_module.Manifest , 0 , len (index .Manifests )),
@@ -241,50 +225,24 @@ func processOciImageIndex(ctx context.Context, mci *manifestCreationInfo, buf *p
241225 return err
242226 }
243227
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+ })
272231 if err != nil {
273232 return "" , err
274233 }
275234
276- return manifestDigest , nil
235+ notifyPackageCreate (ctx , mci .Creator , txRet .pv )
236+ return txRet .digest , nil
277237}
278238
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 ) {
280240 pd , err := packages_model .GetPackageDescriptor (ctx , pv )
281241 if err != nil {
282- return err
242+ log .Error ("Error getting package descriptor: %v" , err )
243+ return
283244 }
284-
285245 notify_service .PackageCreate (ctx , doer , pd )
286-
287- return nil
288246}
289247
290248func 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
437395 return pf , nil
438396}
439397
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 ) {
441399 pb , exists , err := packages_model .GetOrInsertBlob (ctx , packages_service .NewPackageBlob (buf ))
442400 if err != nil {
443401 log .Error ("Error inserting package blob: %v" , err )
@@ -460,7 +418,7 @@ func createManifestBlob(ctx context.Context, mci *manifestCreationInfo, pv *pack
460418 }
461419 }
462420
463- manifestDigest : = digestFromHashSummer (buf )
421+ manifestDigest = digestFromHashSummer (buf )
464422 pf , err := createFileFromBlobReference (ctx , pv , nil , & blobReference {
465423 Digest : digest .Digest (manifestDigest ),
466424 MediaType : mci .MediaType ,
0 commit comments