From d192a974fbede4b4f868ff99bcfff2bdc235b297 Mon Sep 17 00:00:00 2001 From: Adam Wolfe Gordon Date: Fri, 23 Oct 2020 14:25:49 -0600 Subject: [PATCH] s3: Handle QuotaExceeded errors Add a new storagedriver error to be used when quotas are exceeded, and return it from the S3 driver. Signed-off-by: Adam Wolfe Gordon --- registry/storage/driver/base/base.go | 3 +++ registry/storage/driver/s3-aws/s3.go | 9 +++++++-- registry/storage/driver/storagedriver.go | 10 ++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/registry/storage/driver/base/base.go b/registry/storage/driver/base/base.go index 4511f0021..3864eacf7 100644 --- a/registry/storage/driver/base/base.go +++ b/registry/storage/driver/base/base.go @@ -80,6 +80,9 @@ func (base *Base) setDriverName(e error) error { case storagedriver.InvalidOffsetError: actual.DriverName = base.StorageDriver.Name() return actual + case storagedriver.QuotaExceededError: + actual.DriverName = base.StorageDriver.Name() + return actual default: storageError := storagedriver.Error{ DriverName: base.StorageDriver.Name(), diff --git a/registry/storage/driver/s3-aws/s3.go b/registry/storage/driver/s3-aws/s3.go index 4a26cf08d..976c2ace8 100644 --- a/registry/storage/driver/s3-aws/s3.go +++ b/registry/storage/driver/s3-aws/s3.go @@ -1188,8 +1188,13 @@ func (d *Driver) S3BucketKey(path string) string { } func parseError(path string, err error) error { - if s3Err, ok := err.(awserr.Error); ok && s3Err.Code() == "NoSuchKey" { - return storagedriver.PathNotFoundError{Path: path} + if s3Err, ok := err.(awserr.Error); ok { + switch s3Err.Code() { + case "NoSuchKey": + return storagedriver.PathNotFoundError{Path: path} + case "QuotaExceeded": + return storagedriver.QuotaExceededError{} + } } return err diff --git a/registry/storage/driver/storagedriver.go b/registry/storage/driver/storagedriver.go index b220713f2..340d10804 100644 --- a/registry/storage/driver/storagedriver.go +++ b/registry/storage/driver/storagedriver.go @@ -159,6 +159,16 @@ func (err InvalidOffsetError) Error() string { return fmt.Sprintf("%s: invalid offset: %d for path: %s", err.DriverName, err.Offset, err.Path) } +// QuotaExceededError is returned when a storage quota is exceeded during a +// write. +type QuotaExceededError struct { + DriverName string +} + +func (err QuotaExceededError) Error() string { + return fmt.Sprintf("%s: quota exceeded", err.DriverName) +} + // Error is a catch-all error type which captures an error string and // the driver type on which it occurred. type Error struct {