mirror of
https://github.com/minio/minio.git
synced 2025-03-03 07:10:07 -05:00
Forbid the upload of files bigger than the memory backend capacity
This commit is contained in:
parent
ab80057c5c
commit
d360d0fec3
@ -18,6 +18,10 @@ package drivers
|
|||||||
|
|
||||||
import "fmt"
|
import "fmt"
|
||||||
|
|
||||||
|
// InternalError - generic internal error
|
||||||
|
type InternalError struct {
|
||||||
|
}
|
||||||
|
|
||||||
// BackendError - generic disk backend error
|
// BackendError - generic disk backend error
|
||||||
type BackendError struct {
|
type BackendError struct {
|
||||||
Path string
|
Path string
|
||||||
@ -127,6 +131,11 @@ func EmbedError(bucket, object string, err error) ImplementationError {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return string an error formatted as the given text
|
||||||
|
func (e InternalError) Error() string {
|
||||||
|
return "Internal error occured"
|
||||||
|
}
|
||||||
|
|
||||||
// Return string an error formatted as the given text
|
// Return string an error formatted as the given text
|
||||||
func (e ObjectNotFound) Error() string {
|
func (e ObjectNotFound) Error() string {
|
||||||
return "Object not Found: " + e.Bucket + "#" + e.Object
|
return "Object not Found: " + e.Bucket + "#" + e.Object
|
||||||
|
@ -271,8 +271,11 @@ func (memory *memoryDriver) createObject(bucket, key, contentType, expectedMD5Su
|
|||||||
totalLength := len(readBytes)
|
totalLength := len(readBytes)
|
||||||
|
|
||||||
memory.lock.Lock()
|
memory.lock.Lock()
|
||||||
memory.objects.Set(objectKey, readBytes)
|
ok := memory.objects.Set(objectKey, readBytes)
|
||||||
memory.lock.Unlock()
|
memory.lock.Unlock()
|
||||||
|
if !ok {
|
||||||
|
return "", iodine.New(drivers.InternalError{}, nil)
|
||||||
|
}
|
||||||
// setting up for de-allocation
|
// setting up for de-allocation
|
||||||
readBytes = nil
|
readBytes = nil
|
||||||
|
|
||||||
|
@ -115,23 +115,28 @@ func (r *Cache) Get(key string) (interface{}, bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set will persist a value to the cache
|
// Set will persist a value to the cache
|
||||||
func (r *Cache) Set(key string, value interface{}) {
|
func (r *Cache) Set(key string, value interface{}) bool {
|
||||||
r.Lock()
|
r.Lock()
|
||||||
// remove random key if only we reach the maxSize threshold,
|
defer r.Unlock()
|
||||||
// if not assume infinite memory
|
valueLen := uint64(len(value.([]byte)))
|
||||||
if r.maxSize > 0 {
|
if r.maxSize > 0 {
|
||||||
|
// check if the size of the object is not bigger than the
|
||||||
|
// capacity of the cache
|
||||||
|
if valueLen > r.maxSize {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
// remove random key if only we reach the maxSize threshold
|
||||||
for key := range r.items {
|
for key := range r.items {
|
||||||
for (r.currentSize + uint64(len(value.([]byte)))) > r.maxSize {
|
for (r.currentSize + valueLen) > r.maxSize {
|
||||||
r.Delete(key)
|
r.Delete(key)
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
r.items[key] = value
|
r.items[key] = value
|
||||||
r.currentSize += uint64(len(value.([]byte)))
|
r.currentSize += valueLen
|
||||||
r.updatedAt[key] = time.Now()
|
r.updatedAt[key] = time.Now()
|
||||||
r.Unlock()
|
return true
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expire expires keys which have expired
|
// Expire expires keys which have expired
|
||||||
|
Loading…
x
Reference in New Issue
Block a user