mirror of
https://github.com/pgsty/minio.git
synced 2026-08-09 07:43:29 +03:00
Handle removal of disks - getObject() now reads if disks are missing underneath, add initial stub healing code
This commit is contained in:
+29
-22
@@ -25,6 +25,7 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/minio/minio/pkg/donut/disk"
|
||||
"github.com/minio/minio/pkg/iodine"
|
||||
)
|
||||
|
||||
@@ -229,14 +230,13 @@ func (donut API) getBucketMetadataWriters() ([]io.WriteCloser, error) {
|
||||
}
|
||||
|
||||
// getBucketMetadataReaders -
|
||||
func (donut API) getBucketMetadataReaders() ([]io.ReadCloser, error) {
|
||||
var readers []io.ReadCloser
|
||||
func (donut API) getBucketMetadataReaders() (map[int]io.ReadCloser, error) {
|
||||
readers := make(map[int]io.ReadCloser)
|
||||
for _, node := range donut.nodes {
|
||||
disks, err := node.ListDisks()
|
||||
if err != nil {
|
||||
return nil, iodine.New(err, nil)
|
||||
}
|
||||
readers = make([]io.ReadCloser, len(disks))
|
||||
for order, d := range disks {
|
||||
bucketMetaDataReader, err := d.OpenFile(filepath.Join(donut.config.DonutName, bucketMetadataConfig))
|
||||
if err != nil {
|
||||
@@ -339,30 +339,37 @@ func (donut API) makeDonutBucket(bucketName, acl string) error {
|
||||
|
||||
// listDonutBuckets -
|
||||
func (donut API) listDonutBuckets() error {
|
||||
var disks map[int]disk.Disk
|
||||
var err error
|
||||
for _, node := range donut.nodes {
|
||||
disks, err := node.ListDisks()
|
||||
disks, err = node.ListDisks()
|
||||
if err != nil {
|
||||
return iodine.New(err, nil)
|
||||
}
|
||||
for _, disk := range disks {
|
||||
dirs, err := disk.ListDir(donut.config.DonutName)
|
||||
if err != nil {
|
||||
return iodine.New(err, nil)
|
||||
}
|
||||
for _, dir := range dirs {
|
||||
splitDir := strings.Split(dir.Name(), "$")
|
||||
if len(splitDir) < 3 {
|
||||
return iodine.New(CorruptedBackend{Backend: dir.Name()}, nil)
|
||||
}
|
||||
bucketName := splitDir[0]
|
||||
// we dont need this once we cache from makeDonutBucket()
|
||||
bucket, _, err := newBucket(bucketName, "private", donut.config.DonutName, donut.nodes)
|
||||
if err != nil {
|
||||
return iodine.New(err, nil)
|
||||
}
|
||||
donut.buckets[bucketName] = bucket
|
||||
}
|
||||
}
|
||||
var dirs []os.FileInfo
|
||||
for _, disk := range disks {
|
||||
dirs, err = disk.ListDir(donut.config.DonutName)
|
||||
if err == nil {
|
||||
break
|
||||
}
|
||||
}
|
||||
// if all disks are missing then return error
|
||||
if err != nil {
|
||||
return iodine.New(err, nil)
|
||||
}
|
||||
for _, dir := range dirs {
|
||||
splitDir := strings.Split(dir.Name(), "$")
|
||||
if len(splitDir) < 3 {
|
||||
return iodine.New(CorruptedBackend{Backend: dir.Name()}, nil)
|
||||
}
|
||||
bucketName := splitDir[0]
|
||||
// we dont need this once we cache from makeDonutBucket()
|
||||
bucket, _, err := newBucket(bucketName, "private", donut.config.DonutName, donut.nodes)
|
||||
if err != nil {
|
||||
return iodine.New(err, nil)
|
||||
}
|
||||
donut.buckets[bucketName] = bucket
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user