@@ -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 ,
@@ -127,7 +136,7 @@ func processOciImageManifest(ctx context.Context, mci *manifestCreationInfo, buf
127136 }
128137
129138 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 {
139+ if err != nil && ! errors . Is ( err , packages_model .ErrPackageNotExist ) {
131140 return err
132141 }
133142
@@ -136,61 +145,38 @@ func processOciImageManifest(ctx context.Context, mci *manifestCreationInfo, buf
136145 return err
137146 }
138147 }
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- }()
148+ txRet .pv = pv
149+ txRet .pb , txRet .created , txRet .digest , err = createManifestBlob (ctx , mci , pv , buf )
150+ return err
151+ })
168152 if err != nil {
169153 return "" , err
170154 }
171155
172- return manifestDigest , nil
156+ notifyPackageCreate (ctx , mci .Creator , txRet .pv )
157+ return txRet .digest , nil
173158}
174159
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- }
160+ func processOciImageIndex (ctx context.Context , mci * manifestCreationInfo , buf * packages_module.HashedBuffer ) (manifestDigest string , errRet error ) {
161+ var index oci.Index
162+ if err := json .NewDecoder (buf ).Decode (& index ); err != nil {
163+ return "" , err
164+ }
165+ if _ , err := buf .Seek (0 , io .SeekStart ); err != nil {
166+ return "" , err
167+ }
187168
188- ctx , committer , err := db .TxContext (ctx )
189- if err != nil {
190- return err
169+ var txRet processManifestTxRet
170+ defer func () {
171+ if errRet != nil && txRet .created && txRet .pb != nil {
172+ contentStore := packages_module .NewContentStore ()
173+ if err := contentStore .Delete (packages_module .BlobHash256Key (txRet .pb .HashSHA256 )); err != nil {
174+ log .Error ("Error deleting package blob from content store: %v" , err )
175+ }
191176 }
192- defer committer . Close ()
177+ } ()
193178
179+ err := db .WithTx (ctx , func (ctx context.Context ) (err error ) {
194180 metadata := & container_module.Metadata {
195181 Type : container_module .TypeOCI ,
196182 Manifests : make ([]* container_module.Manifest , 0 , len (index .Manifests )),
@@ -241,50 +227,25 @@ func processOciImageIndex(ctx context.Context, mci *manifestCreationInfo, buf *p
241227 return err
242228 }
243229
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- }()
230+ txRet .pv = pv
231+ txRet .pb , txRet .created , txRet .digest , err = createManifestBlob (ctx , mci , pv , buf )
232+ return err
233+ })
272234 if err != nil {
273235 return "" , err
274236 }
275237
276- return manifestDigest , nil
238+ notifyPackageCreate (ctx , mci .Creator , txRet .pv )
239+ return txRet .digest , nil
277240}
278241
279- func notifyPackageCreate (ctx context.Context , doer * user_model.User , pv * packages_model.PackageVersion ) error {
242+ func notifyPackageCreate (ctx context.Context , doer * user_model.User , pv * packages_model.PackageVersion ) {
280243 pd , err := packages_model .GetPackageDescriptor (ctx , pv )
281244 if err != nil {
282- return err
245+ log .Error ("Error getting package descriptor: %v" , err )
246+ return
283247 }
284-
285248 notify_service .PackageCreate (ctx , doer , pd )
286-
287- return nil
288249}
289250
290251func createPackageAndVersion (ctx context.Context , mci * manifestCreationInfo , metadata * container_module.Metadata ) (* packages_model.PackageVersion , error ) {
@@ -437,7 +398,7 @@ func createFileFromBlobReference(ctx context.Context, pv, uploadVersion *package
437398 return pf , nil
438399}
439400
440- func createManifestBlob (ctx context.Context , mci * manifestCreationInfo , pv * packages_model.PackageVersion , buf * packages_module.HashedBuffer ) (* packages_model.PackageBlob , bool , string , error ) {
401+ func createManifestBlob (ctx context.Context , mci * manifestCreationInfo , pv * packages_model.PackageVersion , buf * packages_module.HashedBuffer ) (_ * packages_model.PackageBlob , created bool , manifestDigest string , _ error ) {
441402 pb , exists , err := packages_model .GetOrInsertBlob (ctx , packages_service .NewPackageBlob (buf ))
442403 if err != nil {
443404 log .Error ("Error inserting package blob: %v" , err )
@@ -460,7 +421,7 @@ func createManifestBlob(ctx context.Context, mci *manifestCreationInfo, pv *pack
460421 }
461422 }
462423
463- manifestDigest : = digestFromHashSummer (buf )
424+ manifestDigest = digestFromHashSummer (buf )
464425 pf , err := createFileFromBlobReference (ctx , pv , nil , & blobReference {
465426 Digest : digest .Digest (manifestDigest ),
466427 MediaType : mci .MediaType ,
0 commit comments