parent
6a64019659
commit
2553654e24
@ -1,33 +1,81 @@ |
|||||||
|
/* |
||||||
|
* Minimalist Object Storage, (C) 2015 Minio, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
package donut |
package donut |
||||||
|
|
||||||
import "github.com/minio/minio/pkg/iodine" |
import ( |
||||||
|
"encoding/json" |
||||||
|
"fmt" |
||||||
|
"path/filepath" |
||||||
|
|
||||||
type missingDisk struct { |
"github.com/minio/minio/pkg/donut/disk" |
||||||
nodeNumber int |
"github.com/minio/minio/pkg/iodine" |
||||||
sliceNumber int |
) |
||||||
bucketName string |
|
||||||
} |
|
||||||
|
|
||||||
// Heal heal an existing donut
|
// Heal heal an existing donut
|
||||||
func (donut API) Heal() error { |
func (donut API) Heal() error { |
||||||
var missingDisks []missingDisk |
if err := donut.listDonutBuckets(); err != nil { |
||||||
nodeNumber := 0 |
return iodine.New(err, nil) |
||||||
|
} |
||||||
|
disks := make(map[int]disk.Disk) |
||||||
for _, node := range donut.nodes { |
for _, node := range donut.nodes { |
||||||
disks, err := node.ListDisks() |
nDisks, err := node.ListDisks() |
||||||
if err != nil { |
if err != nil { |
||||||
return iodine.New(err, nil) |
return iodine.New(err, nil) |
||||||
} |
} |
||||||
for i, disk := range disks { |
for k, v := range nDisks { |
||||||
_, err := disk.ListDir(donut.config.DonutName) |
disks[k] = v |
||||||
if err == nil { |
} |
||||||
continue |
} |
||||||
} |
|
||||||
missingDisk := missingDisk{ |
missingDisks := make(map[int]disk.Disk) |
||||||
nodeNumber: nodeNumber, |
for order, disk := range disks { |
||||||
sliceNumber: i, |
if !disk.IsUsable() { |
||||||
|
missingDisks[order] = disk |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
bucketMetadata, err := donut.getDonutBucketMetadata() |
||||||
|
if err != nil { |
||||||
|
return iodine.New(err, nil) |
||||||
|
} |
||||||
|
|
||||||
|
for _, disk := range missingDisks { |
||||||
|
disk.MakeDir(donut.config.DonutName) |
||||||
|
bucketMetadataWriter, err := disk.CreateFile(filepath.Join(donut.config.DonutName, bucketMetadataConfig)) |
||||||
|
if err != nil { |
||||||
|
return iodine.New(err, nil) |
||||||
|
} |
||||||
|
defer bucketMetadataWriter.Close() |
||||||
|
jenc := json.NewEncoder(bucketMetadataWriter) |
||||||
|
if err := jenc.Encode(bucketMetadata); err != nil { |
||||||
|
return iodine.New(err, nil) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
for order, disk := range missingDisks { |
||||||
|
for bucket := range bucketMetadata.Buckets { |
||||||
|
bucketSlice := fmt.Sprintf("%s$0$%d", bucket, order) // TODO handle node slices
|
||||||
|
err := disk.MakeDir(filepath.Join(donut.config.DonutName, bucketSlice)) |
||||||
|
if err != nil { |
||||||
|
return iodine.New(err, nil) |
||||||
} |
} |
||||||
missingDisks = append(missingDisks, missingDisk) |
|
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
return nil |
return nil |
||||||
|
// TODO heal data
|
||||||
} |
} |
||||||
|
@ -1,57 +0,0 @@ |
|||||||
/* |
|
||||||
* Minimalist Object Storage, (C) 2015 Minio, Inc. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
|
|
||||||
package donut |
|
||||||
|
|
||||||
import ( |
|
||||||
"fmt" |
|
||||||
"os" |
|
||||||
"strings" |
|
||||||
|
|
||||||
"github.com/minio/minio/pkg/donut/disk" |
|
||||||
"github.com/minio/minio/pkg/iodine" |
|
||||||
) |
|
||||||
|
|
||||||
// Rebalance -
|
|
||||||
func (donut API) Rebalance() error { |
|
||||||
var totalOffSetLength int |
|
||||||
var newDisks []disk.Disk |
|
||||||
var existingDirs []os.FileInfo |
|
||||||
for _, node := range donut.nodes { |
|
||||||
disks, err := node.ListDisks() |
|
||||||
if err != nil { |
|
||||||
return iodine.New(err, nil) |
|
||||||
} |
|
||||||
totalOffSetLength = len(disks) |
|
||||||
fmt.Println(totalOffSetLength) |
|
||||||
for _, disk := range disks { |
|
||||||
dirs, err := disk.ListDir(donut.config.DonutName) |
|
||||||
if err != nil { |
|
||||||
return iodine.New(err, nil) |
|
||||||
} |
|
||||||
if len(dirs) == 0 { |
|
||||||
newDisks = append(newDisks, disk) |
|
||||||
} |
|
||||||
existingDirs = append(existingDirs, dirs...) |
|
||||||
} |
|
||||||
} |
|
||||||
for _, dir := range existingDirs { |
|
||||||
splits := strings.Split(dir.Name(), "$") |
|
||||||
bucketName, segment, offset := splits[0], splits[1], splits[2] |
|
||||||
fmt.Println(bucketName, segment, offset) |
|
||||||
} |
|
||||||
return nil |
|
||||||
} |
|
Loading…
Reference in new issue