// getBucketMetadataWriters - func (donut API) getBucketMetadataWriters() ([]io.WriteCloser, *probe.Error) { var writers []io.WriteCloser for _, node := range donut.nodes { disks, err := node.ListDisks() if err != nil { return nil, err.Trace() } writers = make([]io.WriteCloser, len(disks)) for order, disk := range disks { bucketMetaDataWriter, err := disk.CreateFile(filepath.Join(donut.config.DonutName, bucketMetadataConfig)) if err != nil { return nil, err.Trace() } writers[order] = bucketMetaDataWriter } } return writers, nil }
// healBuckets heal bucket slices func (donut API) healBuckets() *probe.Error { if err := donut.listDonutBuckets(); err != nil { return err.Trace() } bucketMetadata, err := donut.getDonutBucketMetadata() if err != nil { return err.Trace() } disks := make(map[int]disk.Disk) for _, node := range donut.nodes { nDisks, err := node.ListDisks() if err != nil { return err.Trace() } for k, v := range nDisks { disks[k] = v } } for order, disk := range disks { if disk.IsUsable() { disk.MakeDir(donut.config.DonutName) bucketMetadataWriter, err := disk.CreateFile(filepath.Join(donut.config.DonutName, bucketMetadataConfig)) if err != nil { return err.Trace() } defer bucketMetadataWriter.Close() jenc := json.NewEncoder(bucketMetadataWriter) if err := jenc.Encode(bucketMetadata); err != nil { return probe.NewError(err) } 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 err.Trace() } } } } return nil }
// getObjectWriters - func (b bucket) getObjectWriters(objectName, objectMeta string) ([]io.WriteCloser, *probe.Error) { var writers []io.WriteCloser nodeSlice := 0 for _, node := range b.nodes { disks, err := node.ListDisks() if err != nil { return nil, err.Trace() } writers = make([]io.WriteCloser, len(disks)) for order, disk := range disks { bucketSlice := fmt.Sprintf("%s$%d$%d", b.name, nodeSlice, order) objectPath := filepath.Join(b.donutName, bucketSlice, objectName, objectMeta) objectSlice, err := disk.CreateFile(objectPath) if err != nil { return nil, err.Trace() } writers[order] = objectSlice } nodeSlice = nodeSlice + 1 } return writers, nil }