0
0
mirror of https://github.com/go-gitea/gitea.git synced 2025-11-28 07:26:14 +01:00

Fix container registry error handling (#36021)

1. the `if` check in `handleCreateManifestResult` didn't handler err correctly
2. add more error details for debugging
This commit is contained in:
wxiaoguang 2025-11-25 12:13:30 +08:00 committed by GitHub
parent 688430e3ce
commit abe2755f7a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 28 additions and 29 deletions

View File

@ -290,8 +290,8 @@ func PostBlobsUploads(ctx *context.Context) {
Creator: ctx.Doer, Creator: ctx.Doer,
}, },
); err != nil { ); err != nil {
switch err { switch {
case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize: case errors.Is(err, packages_service.ErrQuotaTotalCount), errors.Is(err, packages_service.ErrQuotaTypeSize), errors.Is(err, packages_service.ErrQuotaTotalSize):
apiError(ctx, http.StatusForbidden, err) apiError(ctx, http.StatusForbidden, err)
default: default:
apiError(ctx, http.StatusInternalServerError, err) apiError(ctx, http.StatusInternalServerError, err)
@ -439,8 +439,8 @@ func PutBlobsUpload(ctx *context.Context) {
Creator: ctx.Doer, Creator: ctx.Doer,
}, },
); err != nil { ); err != nil {
switch err { switch {
case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize: case errors.Is(err, packages_service.ErrQuotaTotalCount), errors.Is(err, packages_service.ErrQuotaTypeSize), errors.Is(err, packages_service.ErrQuotaTotalSize):
apiError(ctx, http.StatusForbidden, err) apiError(ctx, http.StatusForbidden, err)
default: default:
apiError(ctx, http.StatusInternalServerError, err) apiError(ctx, http.StatusInternalServerError, err)
@ -592,14 +592,11 @@ func PutManifest(ctx *context.Context) {
apiErrorDefined(ctx, namedError) apiErrorDefined(ctx, namedError)
} else if errors.Is(err, container_model.ErrContainerBlobNotExist) { } else if errors.Is(err, container_model.ErrContainerBlobNotExist) {
apiErrorDefined(ctx, errBlobUnknown) apiErrorDefined(ctx, errBlobUnknown)
} else { } else if errors.Is(err, packages_service.ErrQuotaTotalCount) || errors.Is(err, packages_service.ErrQuotaTypeSize) || errors.Is(err, packages_service.ErrQuotaTotalSize) {
switch err {
case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize:
apiError(ctx, http.StatusForbidden, err) apiError(ctx, http.StatusForbidden, err)
default: } else {
apiError(ctx, http.StatusInternalServerError, err) apiError(ctx, http.StatusInternalServerError, err)
} }
}
return return
} }

View File

@ -82,10 +82,12 @@ type processManifestTxRet struct {
} }
func handleCreateManifestResult(ctx context.Context, err error, mci *manifestCreationInfo, contentStore *packages_module.ContentStore, txRet *processManifestTxRet) (string, error) { func handleCreateManifestResult(ctx context.Context, err error, mci *manifestCreationInfo, contentStore *packages_module.ContentStore, txRet *processManifestTxRet) (string, error) {
if err != nil && txRet.created && txRet.pb != nil { if err != nil {
if txRet.created && txRet.pb != nil {
if err := contentStore.Delete(packages_module.BlobHash256Key(txRet.pb.HashSHA256)); err != nil { if err := contentStore.Delete(packages_module.BlobHash256Key(txRet.pb.HashSHA256)); err != nil {
log.Error("Error deleting package blob from content store: %v", err) log.Error("Error deleting package blob from content store: %v", err)
} }
}
return "", err return "", err
} }
pd, err := packages_model.GetPackageDescriptor(ctx, txRet.pv) pd, err := packages_model.GetPackageDescriptor(ctx, txRet.pv)
@ -198,14 +200,14 @@ func processOciImageIndex(ctx context.Context, mci *manifestCreationInfo, buf *p
if errors.Is(err, container_model.ErrContainerBlobNotExist) { if errors.Is(err, container_model.ErrContainerBlobNotExist) {
return errManifestBlobUnknown return errManifestBlobUnknown
} }
return err return fmt.Errorf("GetContainerBlob: %w", err)
} }
size, err := packages_model.CalculateFileSize(ctx, &packages_model.PackageFileSearchOptions{ size, err := packages_model.CalculateFileSize(ctx, &packages_model.PackageFileSearchOptions{
VersionID: pfd.File.VersionID, VersionID: pfd.File.VersionID,
}) })
if err != nil { if err != nil {
return err return fmt.Errorf("CalculateFileSize: %w", err)
} }
metadata.Manifests = append(metadata.Manifests, &container_module.Manifest{ metadata.Manifests = append(metadata.Manifests, &container_module.Manifest{
@ -217,7 +219,7 @@ func processOciImageIndex(ctx context.Context, mci *manifestCreationInfo, buf *p
pv, err := createPackageAndVersion(ctx, mci, metadata) pv, err := createPackageAndVersion(ctx, mci, metadata)
if err != nil { if err != nil {
return err return fmt.Errorf("createPackageAndVersion: %w", err)
} }
txRet.pv = pv txRet.pv = pv
@ -240,7 +242,7 @@ func createPackageAndVersion(ctx context.Context, mci *manifestCreationInfo, met
if p, err = packages_model.TryInsertPackage(ctx, p); err != nil { if p, err = packages_model.TryInsertPackage(ctx, p); err != nil {
if !errors.Is(err, packages_model.ErrDuplicatePackage) { if !errors.Is(err, packages_model.ErrDuplicatePackage) {
log.Error("Error inserting package: %v", err) log.Error("Error inserting package: %v", err)
return nil, err return nil, fmt.Errorf("TryInsertPackage: %w", err)
} }
created = false created = false
} }
@ -248,7 +250,7 @@ func createPackageAndVersion(ctx context.Context, mci *manifestCreationInfo, met
if created { if created {
if _, err := packages_model.InsertProperty(ctx, packages_model.PropertyTypePackage, p.ID, container_module.PropertyRepository, strings.ToLower(mci.Owner.LowerName+"/"+mci.Image)); err != nil { if _, err := packages_model.InsertProperty(ctx, packages_model.PropertyTypePackage, p.ID, container_module.PropertyRepository, strings.ToLower(mci.Owner.LowerName+"/"+mci.Image)); err != nil {
log.Error("Error setting package property: %v", err) log.Error("Error setting package property: %v", err)
return nil, err return nil, fmt.Errorf("InsertProperty(PropertyRepository): %w", err)
} }
} }
@ -256,7 +258,7 @@ func createPackageAndVersion(ctx context.Context, mci *manifestCreationInfo, met
metadataJSON, err := json.Marshal(metadata) metadataJSON, err := json.Marshal(metadata)
if err != nil { if err != nil {
return nil, err return nil, fmt.Errorf("json.Marshal(metadata): %w", err)
} }
// "docker buildx imagetools create" multi-arch operations: // "docker buildx imagetools create" multi-arch operations:
@ -276,43 +278,43 @@ func createPackageAndVersion(ctx context.Context, mci *manifestCreationInfo, met
pv, err := packages_model.GetOrInsertVersion(ctx, _pv) pv, err := packages_model.GetOrInsertVersion(ctx, _pv)
if err != nil { if err != nil {
if !errors.Is(err, packages_model.ErrDuplicatePackageVersion) { if !errors.Is(err, packages_model.ErrDuplicatePackageVersion) {
log.Error("Error inserting package: %v", err) log.Error("Error GetOrInsertVersion (first try) package: %v", err)
return nil, err return nil, fmt.Errorf("GetOrInsertVersion: first try: %w", err)
} }
if err = packages_service.DeletePackageVersionAndReferences(ctx, pv); err != nil { if err = packages_service.DeletePackageVersionAndReferences(ctx, pv); err != nil {
return nil, err return nil, fmt.Errorf("DeletePackageVersionAndReferences: %w", err)
} }
// keep download count on overwriting // keep download count on overwriting
_pv.DownloadCount = pv.DownloadCount _pv.DownloadCount = pv.DownloadCount
pv, err = packages_model.GetOrInsertVersion(ctx, _pv) pv, err = packages_model.GetOrInsertVersion(ctx, _pv)
if err != nil { if err != nil {
if !errors.Is(err, packages_model.ErrDuplicatePackageVersion) { if !errors.Is(err, packages_model.ErrDuplicatePackageVersion) {
log.Error("Error inserting package: %v", err) log.Error("Error GetOrInsertVersion (second try) package: %v", err)
return nil, err return nil, fmt.Errorf("GetOrInsertVersion: second try: %w", err)
} }
} }
} }
if err := packages_service.CheckCountQuotaExceeded(ctx, mci.Creator, mci.Owner); err != nil { if err := packages_service.CheckCountQuotaExceeded(ctx, mci.Creator, mci.Owner); err != nil {
return nil, err return nil, fmt.Errorf("CheckCountQuotaExceeded: %w", err)
} }
if mci.IsTagged { if mci.IsTagged {
if err = packages_model.InsertOrUpdateProperty(ctx, packages_model.PropertyTypeVersion, pv.ID, container_module.PropertyManifestTagged, ""); err != nil { if err = packages_model.InsertOrUpdateProperty(ctx, packages_model.PropertyTypeVersion, pv.ID, container_module.PropertyManifestTagged, ""); err != nil {
return nil, err return nil, fmt.Errorf("InsertOrUpdateProperty(ManifestTagged): %w", err)
} }
} else { } else {
if err = packages_model.DeletePropertiesByName(ctx, packages_model.PropertyTypeVersion, pv.ID, container_module.PropertyManifestTagged); err != nil { if err = packages_model.DeletePropertiesByName(ctx, packages_model.PropertyTypeVersion, pv.ID, container_module.PropertyManifestTagged); err != nil {
return nil, err return nil, fmt.Errorf("DeletePropertiesByName(ManifestTagged): %w", err)
} }
} }
if err = packages_model.DeletePropertiesByName(ctx, packages_model.PropertyTypeVersion, pv.ID, container_module.PropertyManifestReference); err != nil { if err = packages_model.DeletePropertiesByName(ctx, packages_model.PropertyTypeVersion, pv.ID, container_module.PropertyManifestReference); err != nil {
return nil, err return nil, fmt.Errorf("DeletePropertiesByName(ManifestReference): %w", err)
} }
for _, manifest := range metadata.Manifests { for _, manifest := range metadata.Manifests {
if _, err = packages_model.InsertProperty(ctx, packages_model.PropertyTypeVersion, pv.ID, container_module.PropertyManifestReference, manifest.Digest); err != nil { if _, err = packages_model.InsertProperty(ctx, packages_model.PropertyTypeVersion, pv.ID, container_module.PropertyManifestReference, manifest.Digest); err != nil {
return nil, err return nil, fmt.Errorf("InsertProperty(ManifestReference): %w", err)
} }
} }