mirror of
https://github.com/minio/minio.git
synced 2025-11-09 13:39:46 -05:00
Add x-amz-storage-class support (#5295)
This adds configurable data and parity options on a per object basis. To use variable parity - Users can set environment variables to cofigure variable parity - Then add header x-amz-storage-class to putobject requests with relevant storage class values Fixes #4997
This commit is contained in:
@@ -81,13 +81,16 @@ func (xl xlObjects) HealBucket(bucket string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// get write quorum for an object
|
||||
writeQuorum := len(xl.storageDisks)/2 + 1
|
||||
|
||||
// Heal bucket.
|
||||
if err := healBucket(xl.storageDisks, bucket, xl.writeQuorum); err != nil {
|
||||
if err := healBucket(xl.storageDisks, bucket, writeQuorum); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Proceed to heal bucket metadata.
|
||||
return healBucketMetadata(xl.storageDisks, bucket, xl.readQuorum)
|
||||
return healBucketMetadata(xl, bucket)
|
||||
}
|
||||
|
||||
// Heal bucket - create buckets on disks where it does not exist.
|
||||
@@ -139,17 +142,11 @@ func healBucket(storageDisks []StorageAPI, bucket string, writeQuorum int) error
|
||||
|
||||
// Heals all the metadata associated for a given bucket, this function
|
||||
// heals `policy.json`, `notification.xml` and `listeners.json`.
|
||||
func healBucketMetadata(storageDisks []StorageAPI, bucket string, readQuorum int) error {
|
||||
func healBucketMetadata(xlObj xlObjects, bucket string) error {
|
||||
healBucketMetaFn := func(metaPath string) error {
|
||||
metaLock := globalNSMutex.NewNSLock(minioMetaBucket, metaPath)
|
||||
if err := metaLock.GetRLock(globalHealingTimeout); err != nil {
|
||||
if _, _, err := xlObj.HealObject(minioMetaBucket, metaPath); err != nil && !isErrObjectNotFound(err) {
|
||||
return err
|
||||
}
|
||||
defer metaLock.RUnlock()
|
||||
// Heals the given file at metaPath.
|
||||
if _, _, err := healObject(storageDisks, minioMetaBucket, metaPath, readQuorum); err != nil && !isErrObjectNotFound(err) {
|
||||
return err
|
||||
} // Success.
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -308,9 +305,9 @@ func (xl xlObjects) ListBucketsHeal() ([]BucketInfo, error) {
|
||||
// during startup i.e healing of buckets, bucket metadata (policy.json,
|
||||
// notification.xml, listeners.json) etc. Currently this function
|
||||
// supports quick healing of buckets, bucket metadata.
|
||||
func quickHeal(storageDisks []StorageAPI, writeQuorum int, readQuorum int) error {
|
||||
func quickHeal(xlObj xlObjects, writeQuorum int, readQuorum int) error {
|
||||
// List all bucket name occurrence from all disks.
|
||||
_, bucketOcc, err := listAllBuckets(storageDisks)
|
||||
_, bucketOcc, err := listAllBuckets(xlObj.storageDisks)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -318,10 +315,10 @@ func quickHeal(storageDisks []StorageAPI, writeQuorum int, readQuorum int) error
|
||||
// All bucket names and bucket metadata that should be healed.
|
||||
for bucketName, occCount := range bucketOcc {
|
||||
// Heal bucket only if healing is needed.
|
||||
if occCount != len(storageDisks) {
|
||||
if occCount != len(xlObj.storageDisks) {
|
||||
// Heal bucket and then proceed to heal bucket metadata if any.
|
||||
if err = healBucket(storageDisks, bucketName, writeQuorum); err == nil {
|
||||
if err = healBucketMetadata(storageDisks, bucketName, readQuorum); err == nil {
|
||||
if err = healBucket(xlObj.storageDisks, bucketName, writeQuorum); err == nil {
|
||||
if err = healBucketMetadata(xlObj, bucketName); err == nil {
|
||||
continue
|
||||
}
|
||||
return err
|
||||
@@ -535,6 +532,15 @@ func healObject(storageDisks []StorageAPI, bucket, object string, quorum int) (i
|
||||
// and later the disk comes back up again, heal on the object
|
||||
// should delete it.
|
||||
func (xl xlObjects) HealObject(bucket, object string) (int, int, error) {
|
||||
// Read metadata files from all the disks
|
||||
partsMetadata, errs := readAllXLMetadata(xl.storageDisks, bucket, object)
|
||||
|
||||
// get read quorum for this object
|
||||
readQuorum, _, err := objectQuorumFromMeta(xl, partsMetadata, errs)
|
||||
if err != nil {
|
||||
return 0, 0, err
|
||||
}
|
||||
|
||||
// Lock the object before healing.
|
||||
objectLock := globalNSMutex.NewNSLock(bucket, object)
|
||||
if err := objectLock.GetRLock(globalHealingTimeout); err != nil {
|
||||
@@ -543,5 +549,5 @@ func (xl xlObjects) HealObject(bucket, object string) (int, int, error) {
|
||||
defer objectLock.RUnlock()
|
||||
|
||||
// Heal the object.
|
||||
return healObject(xl.storageDisks, bucket, object, xl.readQuorum)
|
||||
return healObject(xl.storageDisks, bucket, object, readQuorum)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user