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:
parent
688430e3ce
commit
abe2755f7a
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user