mirror of
https://github.com/minio/minio.git
synced 2025-11-07 04:42:56 -05:00
Adding donut backend and setting as default
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
package donut
|
||||
|
||||
import "io"
|
||||
import (
|
||||
"io"
|
||||
)
|
||||
|
||||
// INTERFACES
|
||||
|
||||
@@ -21,6 +23,7 @@ type Bucket interface {
|
||||
|
||||
// Node interface
|
||||
type Node interface {
|
||||
CreateBucket(bucket string) error
|
||||
GetBuckets() ([]string, error)
|
||||
GetDonutMetadata(bucket, object string) (map[string]string, error)
|
||||
GetMetadata(bucket, object string) (map[string]string, error)
|
||||
|
||||
@@ -35,6 +35,9 @@ func (driver donutDriver) CreateBucket(bucketName string) error {
|
||||
nodes := make([]string, 16)
|
||||
for i := 0; i < 16; i++ {
|
||||
nodes[i] = "localhost"
|
||||
if node, ok := driver.nodes["localhost"]; ok {
|
||||
node.CreateBucket(bucketName + ":0:" + strconv.Itoa(i))
|
||||
}
|
||||
}
|
||||
bucket := bucketDriver{
|
||||
nodes: nodes,
|
||||
@@ -63,7 +66,15 @@ func (driver donutDriver) GetObjectWriter(bucketName, objectName string) (Object
|
||||
}
|
||||
for i, nodeID := range nodes {
|
||||
if node, ok := driver.nodes[nodeID]; ok == true {
|
||||
writer, _ := node.GetWriter(bucketName+":0:"+strconv.Itoa(i), objectName)
|
||||
writer, err := node.GetWriter(bucketName+":0:"+strconv.Itoa(i), objectName)
|
||||
if err != nil {
|
||||
for _, writerToClose := range writers {
|
||||
if writerToClose != nil {
|
||||
writerToClose.CloseWithError(err)
|
||||
}
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
writers[i] = writer
|
||||
}
|
||||
}
|
||||
@@ -111,7 +122,19 @@ func (driver donutDriver) GetObjectMetadata(bucketName, object string) (map[stri
|
||||
return nil, err
|
||||
}
|
||||
if node, ok := driver.nodes[nodes[0]]; ok {
|
||||
return node.GetMetadata(bucketName+":0:0", object)
|
||||
bucketID := bucketName + ":0:0"
|
||||
metadata, err := node.GetMetadata(bucketID, object)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
donutMetadata, err := node.GetDonutMetadata(bucketID, object)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
metadata["sys.created"] = donutMetadata["created"]
|
||||
metadata["sys.md5"] = donutMetadata["md5"]
|
||||
metadata["sys.size"] = donutMetadata["size"]
|
||||
return metadata, nil
|
||||
}
|
||||
return nil, errors.New("Cannot connect to node: " + nodes[0])
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"time"
|
||||
)
|
||||
|
||||
func Test(t *testing.T) { TestingT(t) }
|
||||
@@ -162,6 +163,11 @@ func (s *MySuite) TestNewObjectCanBeWritten(c *C) {
|
||||
|
||||
actualMetadata, err := donut.GetObjectMetadata("foo", "obj")
|
||||
c.Assert(err, IsNil)
|
||||
expectedMetadata["sys.md5"] = "b10a8db164e0754105b7a99be72e3fe5"
|
||||
expectedMetadata["sys.size"] = "11"
|
||||
_, err = time.Parse(time.RFC3339Nano, actualMetadata["sys.created"])
|
||||
c.Assert(err, IsNil)
|
||||
expectedMetadata["sys.created"] = actualMetadata["sys.created"]
|
||||
c.Assert(actualMetadata, DeepEquals, expectedMetadata)
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
)
|
||||
|
||||
func newDonutFileWriter(objectDir string) (Writer, error) {
|
||||
dataFile, err := os.OpenFile(path.Join(objectDir, "data"), os.O_WRONLY|os.O_CREATE|os.O_TRUNC|os.O_EXCL, 0600)
|
||||
dataFile, err := os.OpenFile(path.Join(objectDir, "data"), os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0600)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ import (
|
||||
func erasureReader(readers []io.ReadCloser, donutMetadata map[string]string, writer *io.PipeWriter) {
|
||||
// TODO handle errors
|
||||
totalChunks, _ := strconv.Atoi(donutMetadata["chunkCount"])
|
||||
totalLeft, _ := strconv.Atoi(donutMetadata["totalLength"])
|
||||
totalLeft, _ := strconv.Atoi(donutMetadata["size"])
|
||||
blockSize, _ := strconv.Atoi(donutMetadata["blockSize"])
|
||||
k, _ := strconv.Atoi(donutMetadata["erasureK"])
|
||||
m, _ := strconv.Atoi(donutMetadata["erasureM"])
|
||||
@@ -110,7 +110,7 @@ func erasureGoroutine(r *io.PipeReader, eWriter erasureWriter, isClosed chan<- b
|
||||
metadata["erasureM"] = "8"
|
||||
metadata["erasureTechnique"] = "Cauchy"
|
||||
metadata["md5"] = hex.EncodeToString(dataMd5sum)
|
||||
metadata["totalLength"] = strconv.Itoa(totalLength)
|
||||
metadata["size"] = strconv.Itoa(totalLength)
|
||||
for _, nodeWriter := range eWriter.writers {
|
||||
if nodeWriter != nil {
|
||||
nodeWriter.SetMetadata(eWriter.metadata)
|
||||
|
||||
@@ -16,6 +16,11 @@ type localDirectoryNode struct {
|
||||
root string
|
||||
}
|
||||
|
||||
func (d localDirectoryNode) CreateBucket(bucket string) error {
|
||||
objectPath := path.Join(d.root, bucket)
|
||||
return os.MkdirAll(objectPath, 0700)
|
||||
}
|
||||
|
||||
func (d localDirectoryNode) GetBuckets() ([]string, error) {
|
||||
return nil, errors.New("Not Implemented")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user