Limit memory mode at 100 buckets and return error appropriately

~~~
mc: <ERROR> Failed to create bucket for URL [http://localhost:9000/newbucket-101]. Reason: [You have attempted to create more buckets than allowed.].
~~~

Response from server
master
Harshavardhana 10 years ago
parent f20515b4ed
commit 8beca83090
  1. 4
      pkg/api/api_bucket_handlers.go
  2. 4
      pkg/api/api_object_handlers.go
  3. 3
      pkg/api/api_router.go
  4. 8
      pkg/storage/drivers/errors.go
  5. 8
      pkg/storage/drivers/memory/memory.go

@ -171,6 +171,10 @@ func (server *minioAPI) putBucketHandler(w http.ResponseWriter, req *http.Reques
w.Header().Set("Connection", "close") w.Header().Set("Connection", "close")
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
} }
case drivers.TooManyBuckets:
{
writeErrorResponse(w, req, TooManyBuckets, acceptsContentType, req.URL.Path)
}
case drivers.BucketNameInvalid: case drivers.BucketNameInvalid:
{ {
writeErrorResponse(w, req, InvalidBucketName, acceptsContentType, req.URL.Path) writeErrorResponse(w, req, InvalidBucketName, acceptsContentType, req.URL.Path)

@ -163,6 +163,10 @@ func (server *minioAPI) putObjectHandler(w http.ResponseWriter, req *http.Reques
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
case drivers.ObjectExists: case drivers.ObjectExists:
{ {
// we need to debate about this, if this is the right message to send back
// https://github.com/minio-io/minio/issues/505
// Ideally we can use 405 Method No Allowed
writeErrorResponse(w, req, NotImplemented, acceptsContentType, req.URL.Path) writeErrorResponse(w, req, NotImplemented, acceptsContentType, req.URL.Path)
} }
case drivers.BadDigest: case drivers.BadDigest:

@ -20,12 +20,13 @@ import (
"log" "log"
"net/http" "net/http"
"time"
router "github.com/gorilla/mux" router "github.com/gorilla/mux"
"github.com/minio-io/minio/pkg/api/config" "github.com/minio-io/minio/pkg/api/config"
"github.com/minio-io/minio/pkg/api/quota" "github.com/minio-io/minio/pkg/api/quota"
"github.com/minio-io/minio/pkg/iodine" "github.com/minio-io/minio/pkg/iodine"
"github.com/minio-io/minio/pkg/storage/drivers" "github.com/minio-io/minio/pkg/storage/drivers"
"time"
) )
// private use // private use

@ -78,6 +78,9 @@ type BucketExists GenericBucketError
// BucketNotFound - requested bucket not found // BucketNotFound - requested bucket not found
type BucketNotFound GenericBucketError type BucketNotFound GenericBucketError
// TooManyBuckets - total buckets exceeded
type TooManyBuckets GenericBucketError
/// Object related errors /// Object related errors
// ObjectNotFound - requested object not found // ObjectNotFound - requested object not found
@ -149,6 +152,11 @@ func (e BucketExists) Error() string {
return "Bucket exists: " + e.Bucket return "Bucket exists: " + e.Bucket
} }
// Return string an error formatted as the given text
func (e TooManyBuckets) Error() string {
return "Bucket limit exceeded beyond 100, cannot create bucket: " + e.Bucket
}
// Return string an error formatted as the given text // Return string an error formatted as the given text
func (e BucketNotFound) Error() string { func (e BucketNotFound) Error() string {
return "Bucket not Found: " + e.Bucket return "Bucket not Found: " + e.Bucket

@ -60,6 +60,10 @@ type storedObject struct {
metadata drivers.ObjectMetadata metadata drivers.ObjectMetadata
} }
const (
totalBuckets = 100
)
// Start memory object server // Start memory object server
func Start(maxSize uint64) (chan<- string, <-chan error, drivers.Driver) { func Start(maxSize uint64) (chan<- string, <-chan error, drivers.Driver) {
ctrlChannel := make(chan string) ctrlChannel := make(chan string)
@ -263,6 +267,10 @@ func (memory *memoryDriver) CreateObject(bucket, key, contentType, expectedMD5Su
// CreateBucket - create bucket in memory // CreateBucket - create bucket in memory
func (memory *memoryDriver) CreateBucket(bucketName, acl string) error { func (memory *memoryDriver) CreateBucket(bucketName, acl string) error {
memory.lock.RLock() memory.lock.RLock()
if len(memory.bucketMetadata) == totalBuckets {
memory.lock.RLock()
return iodine.New(drivers.TooManyBuckets{Bucket: bucketName}, nil)
}
if !drivers.IsValidBucket(bucketName) { if !drivers.IsValidBucket(bucketName) {
memory.lock.RUnlock() memory.lock.RUnlock()
return iodine.New(drivers.BucketNameInvalid{Bucket: bucketName}, nil) return iodine.New(drivers.BucketNameInvalid{Bucket: bucketName}, nil)

Loading…
Cancel
Save