mirror of
https://github.com/minio/minio.git
synced 2025-04-15 16:39:16 -04:00
Merge pull request #795 from harshavardhana/pr_out_probe_revamped_to_provide_for_a_new_wrappederror_struct_to_wrap_probes_as_error_interface
Probe revamped to provide for a new WrappedError struct to wrap probes as error interface
This commit is contained in:
commit
b4c8b4877e
10
disks.go
10
disks.go
@ -29,27 +29,27 @@ import (
|
|||||||
func isUsable(mountPath string) (bool, *probe.Error) {
|
func isUsable(mountPath string) (bool, *probe.Error) {
|
||||||
mntpoint, err := os.Stat(mountPath)
|
mntpoint, err := os.Stat(mountPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, probe.New(err)
|
return false, probe.NewError(err)
|
||||||
}
|
}
|
||||||
parent, err := os.Stat("/")
|
parent, err := os.Stat("/")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, probe.New(err)
|
return false, probe.NewError(err)
|
||||||
}
|
}
|
||||||
mntpointSt := mntpoint.Sys().(*syscall.Stat_t)
|
mntpointSt := mntpoint.Sys().(*syscall.Stat_t)
|
||||||
parentSt := parent.Sys().(*syscall.Stat_t)
|
parentSt := parent.Sys().(*syscall.Stat_t)
|
||||||
|
|
||||||
if mntpointSt.Dev == parentSt.Dev {
|
if mntpointSt.Dev == parentSt.Dev {
|
||||||
return false, probe.New(fmt.Errorf("Not mounted %s", mountPath))
|
return false, probe.NewError(fmt.Errorf("Not mounted %s", mountPath))
|
||||||
}
|
}
|
||||||
testFile, err := ioutil.TempFile(mountPath, "writetest-")
|
testFile, err := ioutil.TempFile(mountPath, "writetest-")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, probe.New(err)
|
return false, probe.NewError(err)
|
||||||
}
|
}
|
||||||
// close the file, to avoid leaky fd's
|
// close the file, to avoid leaky fd's
|
||||||
defer testFile.Close()
|
defer testFile.Close()
|
||||||
testFileName := testFile.Name()
|
testFileName := testFile.Name()
|
||||||
if err := os.Remove(testFileName); err != nil {
|
if err := os.Remove(testFileName); err != nil {
|
||||||
return false, probe.New(err)
|
return false, probe.NewError(err)
|
||||||
}
|
}
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@ func GenerateAccessKeyID() ([]byte, *probe.Error) {
|
|||||||
alpha := make([]byte, MinioAccessID)
|
alpha := make([]byte, MinioAccessID)
|
||||||
_, err := rand.Read(alpha)
|
_, err := rand.Read(alpha)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
for i := 0; i < MinioAccessID; i++ {
|
for i := 0; i < MinioAccessID; i++ {
|
||||||
alpha[i] = alphaNumericTable[alpha[i]%byte(len(alphaNumericTable))]
|
alpha[i] = alphaNumericTable[alpha[i]%byte(len(alphaNumericTable))]
|
||||||
@ -45,7 +45,7 @@ func GenerateSecretAccessKey() ([]byte, *probe.Error) {
|
|||||||
rb := make([]byte, MinioSecretID)
|
rb := make([]byte, MinioSecretID)
|
||||||
_, err := rand.Read(rb)
|
_, err := rand.Read(rb)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
return []byte(base64.StdEncoding.EncodeToString(rb))[:MinioSecretID], nil
|
return []byte(base64.StdEncoding.EncodeToString(rb))[:MinioSecretID], nil
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ func getAuthConfigPath() (string, *probe.Error) {
|
|||||||
}
|
}
|
||||||
u, err := user.Current()
|
u, err := user.Current()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", probe.New(err)
|
return "", probe.NewError(err)
|
||||||
}
|
}
|
||||||
authConfigPath := filepath.Join(u.HomeDir, ".minio", "users.json")
|
authConfigPath := filepath.Join(u.HomeDir, ".minio", "users.json")
|
||||||
return authConfigPath, nil
|
return authConfigPath, nil
|
||||||
|
@ -38,74 +38,70 @@ func GetMemStats(url string) ([]byte, *probe.Error) {
|
|||||||
Method: "MemStats.Get",
|
Method: "MemStats.Get",
|
||||||
Request: rpc.Args{Request: ""},
|
Request: rpc.Args{Request: ""},
|
||||||
}
|
}
|
||||||
req, err := NewRequest(url, op, http.DefaultTransport)
|
req, perr := NewRequest(url, op, http.DefaultTransport)
|
||||||
if err != nil {
|
if perr != nil {
|
||||||
return nil, err.Trace()
|
return nil, perr.Trace()
|
||||||
}
|
}
|
||||||
resp, err := req.Do()
|
resp, perr := req.Do()
|
||||||
defer closeResp(resp)
|
defer closeResp(resp)
|
||||||
if err != nil {
|
if perr != nil {
|
||||||
return nil, err.Trace()
|
return nil, perr.Trace()
|
||||||
}
|
}
|
||||||
var reply rpc.MemStatsReply
|
var reply rpc.MemStatsReply
|
||||||
if err := jsonrpc.DecodeClientResponse(resp.Body, &reply); err != nil {
|
if err := jsonrpc.DecodeClientResponse(resp.Body, &reply); err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
{
|
|
||||||
jsonRespBytes, err := json.MarshalIndent(reply, "", "\t")
|
jsonRespBytes, err := json.MarshalIndent(reply, "", "\t")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
return jsonRespBytes, nil
|
return jsonRespBytes, nil
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSysInfo get system status of the server at given url
|
// GetSysInfo get system status of the server at given url
|
||||||
func GetSysInfo(url string) ([]byte, error) {
|
func GetSysInfo(url string) ([]byte, *probe.Error) {
|
||||||
op := RPCOps{
|
op := RPCOps{
|
||||||
Method: "SysInfo.Get",
|
Method: "SysInfo.Get",
|
||||||
Request: rpc.Args{Request: ""},
|
Request: rpc.Args{Request: ""},
|
||||||
}
|
}
|
||||||
req, err := NewRequest(url, op, http.DefaultTransport)
|
req, perr := NewRequest(url, op, http.DefaultTransport)
|
||||||
if err != nil {
|
if perr != nil {
|
||||||
return nil, err.Trace()
|
return nil, perr.Trace()
|
||||||
}
|
}
|
||||||
resp, err := req.Do()
|
resp, perr := req.Do()
|
||||||
defer closeResp(resp)
|
defer closeResp(resp)
|
||||||
if err != nil {
|
if perr != nil {
|
||||||
return nil, err.Trace()
|
return nil, perr.Trace()
|
||||||
}
|
}
|
||||||
var reply rpc.SysInfoReply
|
var reply rpc.SysInfoReply
|
||||||
if err := jsonrpc.DecodeClientResponse(resp.Body, &reply); err != nil {
|
if err := jsonrpc.DecodeClientResponse(resp.Body, &reply); err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
{
|
|
||||||
jsonRespBytes, err := json.MarshalIndent(reply, "", "\t")
|
jsonRespBytes, err := json.MarshalIndent(reply, "", "\t")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
return jsonRespBytes, nil
|
return jsonRespBytes, nil
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetAuthKeys get access key id and secret access key
|
// GetAuthKeys get access key id and secret access key
|
||||||
func GetAuthKeys(url string) ([]byte, error) {
|
func GetAuthKeys(url string) ([]byte, *probe.Error) {
|
||||||
op := RPCOps{
|
op := RPCOps{
|
||||||
Method: "Auth.Get",
|
Method: "Auth.Get",
|
||||||
Request: rpc.Args{Request: ""},
|
Request: rpc.Args{Request: ""},
|
||||||
}
|
}
|
||||||
req, err := NewRequest(url, op, http.DefaultTransport)
|
req, perr := NewRequest(url, op, http.DefaultTransport)
|
||||||
if err != nil {
|
if perr != nil {
|
||||||
return nil, err.Trace()
|
return nil, perr.Trace()
|
||||||
}
|
}
|
||||||
resp, err := req.Do()
|
resp, perr := req.Do()
|
||||||
defer closeResp(resp)
|
defer closeResp(resp)
|
||||||
if err != nil {
|
if perr != nil {
|
||||||
return nil, err.Trace()
|
return nil, perr.Trace()
|
||||||
}
|
}
|
||||||
var reply rpc.AuthReply
|
var reply rpc.AuthReply
|
||||||
if err := jsonrpc.DecodeClientResponse(resp.Body, &reply); err != nil {
|
if err := jsonrpc.DecodeClientResponse(resp.Body, &reply); err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
authConfig := &auth.Config{}
|
authConfig := &auth.Config{}
|
||||||
authConfig.Version = "0.0.1"
|
authConfig.Version = "0.0.1"
|
||||||
@ -118,13 +114,11 @@ func GetAuthKeys(url string) ([]byte, error) {
|
|||||||
if err := auth.SaveConfig(authConfig); err != nil {
|
if err := auth.SaveConfig(authConfig); err != nil {
|
||||||
return nil, err.Trace()
|
return nil, err.Trace()
|
||||||
}
|
}
|
||||||
{
|
|
||||||
jsonRespBytes, err := json.MarshalIndent(reply, "", "\t")
|
jsonRespBytes, err := json.MarshalIndent(reply, "", "\t")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
return jsonRespBytes, nil
|
return jsonRespBytes, nil
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add more functions here for other RPC messages
|
// Add more functions here for other RPC messages
|
||||||
|
@ -40,11 +40,11 @@ type RPCRequest struct {
|
|||||||
func NewRequest(url string, op RPCOps, transport http.RoundTripper) (*RPCRequest, *probe.Error) {
|
func NewRequest(url string, op RPCOps, transport http.RoundTripper) (*RPCRequest, *probe.Error) {
|
||||||
params, err := json.EncodeClientRequest(op.Method, op.Request)
|
params, err := json.EncodeClientRequest(op.Method, op.Request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
req, err := http.NewRequest("POST", url, bytes.NewReader(params))
|
req, err := http.NewRequest("POST", url, bytes.NewReader(params))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
rpcReq := &RPCRequest{}
|
rpcReq := &RPCRequest{}
|
||||||
rpcReq.req = req
|
rpcReq.req = req
|
||||||
@ -60,7 +60,10 @@ func NewRequest(url string, op RPCOps, transport http.RoundTripper) (*RPCRequest
|
|||||||
func (r RPCRequest) Do() (*http.Response, *probe.Error) {
|
func (r RPCRequest) Do() (*http.Response, *probe.Error) {
|
||||||
resp, err := r.transport.RoundTrip(r.req)
|
resp, err := r.transport.RoundTrip(r.req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
if werr, ok := probe.ToWrappedError(err); ok {
|
||||||
|
return nil, werr.ToError().Trace()
|
||||||
|
}
|
||||||
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,7 @@ type bucket struct {
|
|||||||
// newBucket - instantiate a new bucket
|
// newBucket - instantiate a new bucket
|
||||||
func newBucket(bucketName, aclType, donutName string, nodes map[string]node) (bucket, BucketMetadata, *probe.Error) {
|
func newBucket(bucketName, aclType, donutName string, nodes map[string]node) (bucket, BucketMetadata, *probe.Error) {
|
||||||
if strings.TrimSpace(bucketName) == "" || strings.TrimSpace(donutName) == "" {
|
if strings.TrimSpace(bucketName) == "" || strings.TrimSpace(donutName) == "" {
|
||||||
return bucket{}, BucketMetadata{}, probe.New(InvalidArgument{})
|
return bucket{}, BucketMetadata{}, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
|
|
||||||
b := bucket{}
|
b := bucket{}
|
||||||
@ -128,7 +128,7 @@ func (b bucket) getBucketMetadata() (*AllBuckets, *probe.Error) {
|
|||||||
return metadata, nil
|
return metadata, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetObjectMetadata - get metadata for an object
|
// GetObjectMetadata - get metadata for an object
|
||||||
@ -223,7 +223,7 @@ func (b bucket) ReadObject(objectName string) (reader io.ReadCloser, size int64,
|
|||||||
}
|
}
|
||||||
// check if object exists
|
// check if object exists
|
||||||
if _, ok := bucketMetadata.Buckets[b.getBucketName()].BucketObjects[objectName]; !ok {
|
if _, ok := bucketMetadata.Buckets[b.getBucketName()].BucketObjects[objectName]; !ok {
|
||||||
return nil, 0, probe.New(ObjectNotFound{Object: objectName})
|
return nil, 0, probe.NewError(ObjectNotFound{Object: objectName})
|
||||||
}
|
}
|
||||||
objMetadata, err := b.readObjectMetadata(normalizeObjectName(objectName))
|
objMetadata, err := b.readObjectMetadata(normalizeObjectName(objectName))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -239,7 +239,7 @@ func (b bucket) WriteObject(objectName string, objectData io.Reader, size int64,
|
|||||||
b.lock.Lock()
|
b.lock.Lock()
|
||||||
defer b.lock.Unlock()
|
defer b.lock.Unlock()
|
||||||
if objectName == "" || objectData == nil {
|
if objectName == "" || objectData == nil {
|
||||||
return ObjectMetadata{}, probe.New(InvalidArgument{})
|
return ObjectMetadata{}, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
writers, err := b.getObjectWriters(normalizeObjectName(objectName), "data")
|
writers, err := b.getObjectWriters(normalizeObjectName(objectName), "data")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -266,7 +266,7 @@ func (b bucket) WriteObject(objectName string, objectData io.Reader, size int64,
|
|||||||
totalLength, err := io.Copy(mw, objectData)
|
totalLength, err := io.Copy(mw, objectData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
CleanupWritersOnError(writers)
|
CleanupWritersOnError(writers)
|
||||||
return ObjectMetadata{}, probe.New(err)
|
return ObjectMetadata{}, probe.NewError(err)
|
||||||
}
|
}
|
||||||
objMetadata.Size = totalLength
|
objMetadata.Size = totalLength
|
||||||
case false:
|
case false:
|
||||||
@ -306,7 +306,7 @@ func (b bucket) WriteObject(objectName string, objectData io.Reader, size int64,
|
|||||||
//
|
//
|
||||||
// Signature mismatch occurred all temp files to be removed and all data purged.
|
// Signature mismatch occurred all temp files to be removed and all data purged.
|
||||||
CleanupWritersOnError(writers)
|
CleanupWritersOnError(writers)
|
||||||
return ObjectMetadata{}, probe.New(SignatureDoesNotMatch{})
|
return ObjectMetadata{}, probe.NewError(SignatureDoesNotMatch{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
objMetadata.MD5Sum = hex.EncodeToString(dataMD5sum)
|
objMetadata.MD5Sum = hex.EncodeToString(dataMD5sum)
|
||||||
@ -337,24 +337,24 @@ func (b bucket) isMD5SumEqual(expectedMD5Sum, actualMD5Sum string) *probe.Error
|
|||||||
if strings.TrimSpace(expectedMD5Sum) != "" && strings.TrimSpace(actualMD5Sum) != "" {
|
if strings.TrimSpace(expectedMD5Sum) != "" && strings.TrimSpace(actualMD5Sum) != "" {
|
||||||
expectedMD5SumBytes, err := hex.DecodeString(expectedMD5Sum)
|
expectedMD5SumBytes, err := hex.DecodeString(expectedMD5Sum)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return probe.New(err)
|
return probe.NewError(err)
|
||||||
}
|
}
|
||||||
actualMD5SumBytes, err := hex.DecodeString(actualMD5Sum)
|
actualMD5SumBytes, err := hex.DecodeString(actualMD5Sum)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return probe.New(err)
|
return probe.NewError(err)
|
||||||
}
|
}
|
||||||
if !bytes.Equal(expectedMD5SumBytes, actualMD5SumBytes) {
|
if !bytes.Equal(expectedMD5SumBytes, actualMD5SumBytes) {
|
||||||
return probe.New(BadDigest{})
|
return probe.NewError(BadDigest{})
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return probe.New(InvalidArgument{})
|
return probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
|
|
||||||
// writeObjectMetadata - write additional object metadata
|
// writeObjectMetadata - write additional object metadata
|
||||||
func (b bucket) writeObjectMetadata(objectName string, objMetadata ObjectMetadata) *probe.Error {
|
func (b bucket) writeObjectMetadata(objectName string, objMetadata ObjectMetadata) *probe.Error {
|
||||||
if objMetadata.Object == "" {
|
if objMetadata.Object == "" {
|
||||||
return probe.New(InvalidArgument{})
|
return probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
objMetadataWriters, err := b.getObjectWriters(objectName, objectMetadataConfig)
|
objMetadataWriters, err := b.getObjectWriters(objectName, objectMetadataConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -365,7 +365,7 @@ func (b bucket) writeObjectMetadata(objectName string, objMetadata ObjectMetadat
|
|||||||
if err := jenc.Encode(&objMetadata); err != nil {
|
if err := jenc.Encode(&objMetadata); err != nil {
|
||||||
// Close writers and purge all temporary entries
|
// Close writers and purge all temporary entries
|
||||||
CleanupWritersOnError(objMetadataWriters)
|
CleanupWritersOnError(objMetadataWriters)
|
||||||
return probe.New(err)
|
return probe.NewError(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, objMetadataWriter := range objMetadataWriters {
|
for _, objMetadataWriter := range objMetadataWriters {
|
||||||
@ -377,7 +377,7 @@ func (b bucket) writeObjectMetadata(objectName string, objMetadata ObjectMetadat
|
|||||||
// readObjectMetadata - read object metadata
|
// readObjectMetadata - read object metadata
|
||||||
func (b bucket) readObjectMetadata(objectName string) (ObjectMetadata, *probe.Error) {
|
func (b bucket) readObjectMetadata(objectName string) (ObjectMetadata, *probe.Error) {
|
||||||
if objectName == "" {
|
if objectName == "" {
|
||||||
return ObjectMetadata{}, probe.New(InvalidArgument{})
|
return ObjectMetadata{}, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
objMetadata := ObjectMetadata{}
|
objMetadata := ObjectMetadata{}
|
||||||
objMetadataReaders, err := b.getObjectReaders(objectName, objectMetadataConfig)
|
objMetadataReaders, err := b.getObjectReaders(objectName, objectMetadataConfig)
|
||||||
@ -395,7 +395,7 @@ func (b bucket) readObjectMetadata(objectName string) (ObjectMetadata, *probe.Er
|
|||||||
return objMetadata, nil
|
return objMetadata, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ObjectMetadata{}, probe.New(err)
|
return ObjectMetadata{}, probe.NewError(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -415,12 +415,12 @@ func normalizeObjectName(objectName string) string {
|
|||||||
// getDataAndParity - calculate k, m (data and parity) values from number of disks
|
// getDataAndParity - calculate k, m (data and parity) values from number of disks
|
||||||
func (b bucket) getDataAndParity(totalWriters int) (k uint8, m uint8, err *probe.Error) {
|
func (b bucket) getDataAndParity(totalWriters int) (k uint8, m uint8, err *probe.Error) {
|
||||||
if totalWriters <= 1 {
|
if totalWriters <= 1 {
|
||||||
return 0, 0, probe.New(InvalidArgument{})
|
return 0, 0, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
quotient := totalWriters / 2 // not using float or abs to let integer round off to lower value
|
quotient := totalWriters / 2 // not using float or abs to let integer round off to lower value
|
||||||
// quotient cannot be bigger than (255 / 2) = 127
|
// quotient cannot be bigger than (255 / 2) = 127
|
||||||
if quotient > 127 {
|
if quotient > 127 {
|
||||||
return 0, 0, probe.New(ParityOverflow{})
|
return 0, 0, probe.NewError(ParityOverflow{})
|
||||||
}
|
}
|
||||||
remainder := totalWriters % 2 // will be 1 for odd and 0 for even numbers
|
remainder := totalWriters % 2 // will be 1 for odd and 0 for even numbers
|
||||||
k = uint8(quotient + remainder)
|
k = uint8(quotient + remainder)
|
||||||
@ -450,7 +450,7 @@ func (b bucket) writeObjectData(k, m uint8, writers []io.WriteCloser, objectData
|
|||||||
return 0, 0, err.Trace()
|
return 0, 0, err.Trace()
|
||||||
}
|
}
|
||||||
if _, err := writer.Write(inputData); err != nil {
|
if _, err := writer.Write(inputData); err != nil {
|
||||||
return 0, 0, probe.New(err)
|
return 0, 0, probe.NewError(err)
|
||||||
}
|
}
|
||||||
for blockIndex, block := range encodedBlocks {
|
for blockIndex, block := range encodedBlocks {
|
||||||
errCh := make(chan error, 1)
|
errCh := make(chan error, 1)
|
||||||
@ -461,7 +461,7 @@ func (b bucket) writeObjectData(k, m uint8, writers []io.WriteCloser, objectData
|
|||||||
}(writers[blockIndex], bytes.NewReader(block), errCh)
|
}(writers[blockIndex], bytes.NewReader(block), errCh)
|
||||||
if err := <-errCh; err != nil {
|
if err := <-errCh; err != nil {
|
||||||
// Returning error is fine here CleanupErrors() would cleanup writers
|
// Returning error is fine here CleanupErrors() would cleanup writers
|
||||||
return 0, 0, probe.New(err)
|
return 0, 0, probe.NewError(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
chunkCount = chunkCount + 1
|
chunkCount = chunkCount + 1
|
||||||
@ -473,7 +473,7 @@ func (b bucket) writeObjectData(k, m uint8, writers []io.WriteCloser, objectData
|
|||||||
func (b bucket) readObjectData(objectName string, writer *io.PipeWriter, objMetadata ObjectMetadata) {
|
func (b bucket) readObjectData(objectName string, writer *io.PipeWriter, objMetadata ObjectMetadata) {
|
||||||
readers, err := b.getObjectReaders(objectName, "data")
|
readers, err := b.getObjectReaders(objectName, "data")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
writer.CloseWithError(err.Trace())
|
writer.CloseWithError(probe.NewWrappedError(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
for _, reader := range readers {
|
for _, reader := range readers {
|
||||||
@ -484,12 +484,12 @@ func (b bucket) readObjectData(objectName string, writer *io.PipeWriter, objMeta
|
|||||||
var err error
|
var err error
|
||||||
expectedMd5sum, err = hex.DecodeString(objMetadata.MD5Sum)
|
expectedMd5sum, err = hex.DecodeString(objMetadata.MD5Sum)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
writer.CloseWithError(probe.New(err))
|
writer.CloseWithError(probe.NewWrappedError(probe.NewError(err)))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
expected512Sum, err = hex.DecodeString(objMetadata.SHA512Sum)
|
expected512Sum, err = hex.DecodeString(objMetadata.SHA512Sum)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
writer.CloseWithError(probe.New(err))
|
writer.CloseWithError(probe.NewWrappedError(probe.NewError(err)))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -499,23 +499,23 @@ func (b bucket) readObjectData(objectName string, writer *io.PipeWriter, objMeta
|
|||||||
switch len(readers) > 1 {
|
switch len(readers) > 1 {
|
||||||
case true:
|
case true:
|
||||||
if objMetadata.ErasureTechnique == "" {
|
if objMetadata.ErasureTechnique == "" {
|
||||||
writer.CloseWithError(probe.New(MissingErasureTechnique{}))
|
writer.CloseWithError(probe.NewWrappedError(probe.NewError(MissingErasureTechnique{})))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
encoder, err := newEncoder(objMetadata.DataDisks, objMetadata.ParityDisks, objMetadata.ErasureTechnique)
|
encoder, err := newEncoder(objMetadata.DataDisks, objMetadata.ParityDisks, objMetadata.ErasureTechnique)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
writer.CloseWithError(err.Trace())
|
writer.CloseWithError(probe.NewWrappedError(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
totalLeft := objMetadata.Size
|
totalLeft := objMetadata.Size
|
||||||
for i := 0; i < objMetadata.ChunkCount; i++ {
|
for i := 0; i < objMetadata.ChunkCount; i++ {
|
||||||
decodedData, err := b.decodeEncodedData(totalLeft, int64(objMetadata.BlockSize), readers, encoder, writer)
|
decodedData, err := b.decodeEncodedData(totalLeft, int64(objMetadata.BlockSize), readers, encoder, writer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
writer.CloseWithError(err.Trace())
|
writer.CloseWithError(probe.NewWrappedError(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if _, err := io.Copy(mwriter, bytes.NewReader(decodedData)); err != nil {
|
if _, err := io.Copy(mwriter, bytes.NewReader(decodedData)); err != nil {
|
||||||
writer.CloseWithError(probe.New(err))
|
writer.CloseWithError(probe.NewWrappedError(probe.NewError(err)))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
totalLeft = totalLeft - int64(objMetadata.BlockSize)
|
totalLeft = totalLeft - int64(objMetadata.BlockSize)
|
||||||
@ -523,17 +523,17 @@ func (b bucket) readObjectData(objectName string, writer *io.PipeWriter, objMeta
|
|||||||
case false:
|
case false:
|
||||||
_, err := io.Copy(writer, readers[0])
|
_, err := io.Copy(writer, readers[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
writer.CloseWithError(probe.New(err))
|
writer.CloseWithError(probe.NewWrappedError(probe.NewError(err)))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// check if decodedData md5sum matches
|
// check if decodedData md5sum matches
|
||||||
if !bytes.Equal(expectedMd5sum, hasher.Sum(nil)) {
|
if !bytes.Equal(expectedMd5sum, hasher.Sum(nil)) {
|
||||||
writer.CloseWithError(probe.New(ChecksumMismatch{}))
|
writer.CloseWithError(probe.NewWrappedError(probe.NewError(ChecksumMismatch{})))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if !bytes.Equal(expected512Sum, sum512hasher.Sum(nil)) {
|
if !bytes.Equal(expected512Sum, sum512hasher.Sum(nil)) {
|
||||||
writer.CloseWithError(probe.New(ChecksumMismatch{}))
|
writer.CloseWithError(probe.NewWrappedError(probe.NewError(ChecksumMismatch{})))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
writer.Close()
|
writer.Close()
|
||||||
@ -557,7 +557,7 @@ func (b bucket) decodeEncodedData(totalLeft, blockSize int64, readers map[int]io
|
|||||||
var bytesBuffer bytes.Buffer
|
var bytesBuffer bytes.Buffer
|
||||||
_, err := io.CopyN(&bytesBuffer, reader, int64(curChunkSize))
|
_, err := io.CopyN(&bytesBuffer, reader, int64(curChunkSize))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
encodedBytes[i] = bytesBuffer.Bytes()
|
encodedBytes[i] = bytesBuffer.Bytes()
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,7 @@ func getDonutConfigPath() (string, *probe.Error) {
|
|||||||
}
|
}
|
||||||
u, err := user.Current()
|
u, err := user.Current()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", probe.New(err)
|
return "", probe.NewError(err)
|
||||||
}
|
}
|
||||||
donutConfigPath := filepath.Join(u.HomeDir, ".minio", "donut.json")
|
donutConfigPath := filepath.Join(u.HomeDir, ".minio", "donut.json")
|
||||||
return donutConfigPath, nil
|
return donutConfigPath, nil
|
||||||
|
@ -39,20 +39,20 @@ type Disk struct {
|
|||||||
// New - instantiate new disk
|
// New - instantiate new disk
|
||||||
func New(diskPath string) (Disk, *probe.Error) {
|
func New(diskPath string) (Disk, *probe.Error) {
|
||||||
if diskPath == "" {
|
if diskPath == "" {
|
||||||
return Disk{}, probe.New(InvalidArgument{})
|
return Disk{}, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
st, err := os.Stat(diskPath)
|
st, err := os.Stat(diskPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Disk{}, probe.New(err)
|
return Disk{}, probe.NewError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !st.IsDir() {
|
if !st.IsDir() {
|
||||||
return Disk{}, probe.New(syscall.ENOTDIR)
|
return Disk{}, probe.NewError(syscall.ENOTDIR)
|
||||||
}
|
}
|
||||||
s := syscall.Statfs_t{}
|
s := syscall.Statfs_t{}
|
||||||
err = syscall.Statfs(diskPath, &s)
|
err = syscall.Statfs(diskPath, &s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Disk{}, probe.New(err)
|
return Disk{}, probe.NewError(err)
|
||||||
}
|
}
|
||||||
disk := Disk{
|
disk := Disk{
|
||||||
lock: &sync.Mutex{},
|
lock: &sync.Mutex{},
|
||||||
@ -64,7 +64,7 @@ func New(diskPath string) (Disk, *probe.Error) {
|
|||||||
disk.fsInfo["MountPoint"] = disk.path
|
disk.fsInfo["MountPoint"] = disk.path
|
||||||
return disk, nil
|
return disk, nil
|
||||||
}
|
}
|
||||||
return Disk{}, probe.New(UnsupportedFilesystem{Type: strconv.FormatInt(int64(s.Type), 10)})
|
return Disk{}, probe.NewError(UnsupportedFilesystem{Type: strconv.FormatInt(int64(s.Type), 10)})
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsUsable - is disk usable, alive
|
// IsUsable - is disk usable, alive
|
||||||
@ -103,7 +103,7 @@ func (disk Disk) MakeDir(dirname string) *probe.Error {
|
|||||||
disk.lock.Lock()
|
disk.lock.Lock()
|
||||||
defer disk.lock.Unlock()
|
defer disk.lock.Unlock()
|
||||||
if err := os.MkdirAll(filepath.Join(disk.path, dirname), 0700); err != nil {
|
if err := os.MkdirAll(filepath.Join(disk.path, dirname), 0700); err != nil {
|
||||||
return probe.New(err)
|
return probe.NewError(err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -115,12 +115,12 @@ func (disk Disk) ListDir(dirname string) ([]os.FileInfo, *probe.Error) {
|
|||||||
|
|
||||||
dir, err := os.Open(filepath.Join(disk.path, dirname))
|
dir, err := os.Open(filepath.Join(disk.path, dirname))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
defer dir.Close()
|
defer dir.Close()
|
||||||
contents, err := dir.Readdir(-1)
|
contents, err := dir.Readdir(-1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
var directories []os.FileInfo
|
var directories []os.FileInfo
|
||||||
for _, content := range contents {
|
for _, content := range contents {
|
||||||
@ -139,12 +139,12 @@ func (disk Disk) ListFiles(dirname string) ([]os.FileInfo, *probe.Error) {
|
|||||||
|
|
||||||
dir, err := os.Open(filepath.Join(disk.path, dirname))
|
dir, err := os.Open(filepath.Join(disk.path, dirname))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
defer dir.Close()
|
defer dir.Close()
|
||||||
contents, err := dir.Readdir(-1)
|
contents, err := dir.Readdir(-1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
var files []os.FileInfo
|
var files []os.FileInfo
|
||||||
for _, content := range contents {
|
for _, content := range contents {
|
||||||
@ -162,12 +162,12 @@ func (disk Disk) CreateFile(filename string) (*atomic.File, *probe.Error) {
|
|||||||
defer disk.lock.Unlock()
|
defer disk.lock.Unlock()
|
||||||
|
|
||||||
if filename == "" {
|
if filename == "" {
|
||||||
return nil, probe.New(InvalidArgument{})
|
return nil, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
|
|
||||||
f, err := atomic.FileCreate(filepath.Join(disk.path, filename))
|
f, err := atomic.FileCreate(filepath.Join(disk.path, filename))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return f, nil
|
return f, nil
|
||||||
@ -179,11 +179,11 @@ func (disk Disk) Open(filename string) (*os.File, *probe.Error) {
|
|||||||
defer disk.lock.Unlock()
|
defer disk.lock.Unlock()
|
||||||
|
|
||||||
if filename == "" {
|
if filename == "" {
|
||||||
return nil, probe.New(InvalidArgument{})
|
return nil, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
dataFile, err := os.Open(filepath.Join(disk.path, filename))
|
dataFile, err := os.Open(filepath.Join(disk.path, filename))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
return dataFile, nil
|
return dataFile, nil
|
||||||
}
|
}
|
||||||
@ -194,11 +194,11 @@ func (disk Disk) OpenFile(filename string, flags int, perm os.FileMode) (*os.Fil
|
|||||||
defer disk.lock.Unlock()
|
defer disk.lock.Unlock()
|
||||||
|
|
||||||
if filename == "" {
|
if filename == "" {
|
||||||
return nil, probe.New(InvalidArgument{})
|
return nil, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
dataFile, err := os.OpenFile(filepath.Join(disk.path, filename), flags, perm)
|
dataFile, err := os.OpenFile(filepath.Join(disk.path, filename), flags, perm)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
return dataFile, nil
|
return dataFile, nil
|
||||||
}
|
}
|
||||||
|
@ -38,8 +38,8 @@ func (s *MyDiskSuite) SetUpSuite(c *C) {
|
|||||||
path, err := ioutil.TempDir(os.TempDir(), "disk-")
|
path, err := ioutil.TempDir(os.TempDir(), "disk-")
|
||||||
c.Assert(err, IsNil)
|
c.Assert(err, IsNil)
|
||||||
s.path = path
|
s.path = path
|
||||||
d, err := New(s.path)
|
d, perr := New(s.path)
|
||||||
c.Assert(err, IsNil)
|
c.Assert(perr, IsNil)
|
||||||
s.disk = d
|
s.disk = d
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ const (
|
|||||||
// makeBucket - make a new bucket
|
// makeBucket - make a new bucket
|
||||||
func (donut API) makeBucket(bucket string, acl BucketACL) *probe.Error {
|
func (donut API) makeBucket(bucket string, acl BucketACL) *probe.Error {
|
||||||
if bucket == "" || strings.TrimSpace(bucket) == "" {
|
if bucket == "" || strings.TrimSpace(bucket) == "" {
|
||||||
return probe.New(InvalidArgument{})
|
return probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
return donut.makeDonutBucket(bucket, acl.String())
|
return donut.makeDonutBucket(bucket, acl.String())
|
||||||
}
|
}
|
||||||
@ -65,7 +65,7 @@ func (donut API) getBucketMetadata(bucketName string) (BucketMetadata, *probe.Er
|
|||||||
return BucketMetadata{}, err.Trace()
|
return BucketMetadata{}, err.Trace()
|
||||||
}
|
}
|
||||||
if _, ok := donut.buckets[bucketName]; !ok {
|
if _, ok := donut.buckets[bucketName]; !ok {
|
||||||
return BucketMetadata{}, probe.New(BucketNotFound{Bucket: bucketName})
|
return BucketMetadata{}, probe.NewError(BucketNotFound{Bucket: bucketName})
|
||||||
}
|
}
|
||||||
metadata, err := donut.getDonutBucketMetadata()
|
metadata, err := donut.getDonutBucketMetadata()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -86,7 +86,7 @@ func (donut API) setBucketMetadata(bucketName string, bucketMetadata map[string]
|
|||||||
oldBucketMetadata := metadata.Buckets[bucketName]
|
oldBucketMetadata := metadata.Buckets[bucketName]
|
||||||
acl, ok := bucketMetadata["acl"]
|
acl, ok := bucketMetadata["acl"]
|
||||||
if !ok {
|
if !ok {
|
||||||
return probe.New(InvalidArgument{})
|
return probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
oldBucketMetadata.ACL = BucketACL(acl)
|
oldBucketMetadata.ACL = BucketACL(acl)
|
||||||
metadata.Buckets[bucketName] = oldBucketMetadata
|
metadata.Buckets[bucketName] = oldBucketMetadata
|
||||||
@ -117,7 +117,7 @@ func (donut API) listObjects(bucket, prefix, marker, delimiter string, maxkeys i
|
|||||||
return ListObjectsResults{}, err.Trace()
|
return ListObjectsResults{}, err.Trace()
|
||||||
}
|
}
|
||||||
if _, ok := donut.buckets[bucket]; !ok {
|
if _, ok := donut.buckets[bucket]; !ok {
|
||||||
return ListObjectsResults{}, probe.New(BucketNotFound{Bucket: bucket})
|
return ListObjectsResults{}, probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
listObjects, err := donut.buckets[bucket].ListObjects(prefix, marker, delimiter, maxkeys)
|
listObjects, err := donut.buckets[bucket].ListObjects(prefix, marker, delimiter, maxkeys)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -129,23 +129,23 @@ func (donut API) listObjects(bucket, prefix, marker, delimiter string, maxkeys i
|
|||||||
// putObject - put object
|
// putObject - put object
|
||||||
func (donut API) putObject(bucket, object, expectedMD5Sum string, reader io.Reader, size int64, metadata map[string]string, signature *Signature) (ObjectMetadata, *probe.Error) {
|
func (donut API) putObject(bucket, object, expectedMD5Sum string, reader io.Reader, size int64, metadata map[string]string, signature *Signature) (ObjectMetadata, *probe.Error) {
|
||||||
if bucket == "" || strings.TrimSpace(bucket) == "" {
|
if bucket == "" || strings.TrimSpace(bucket) == "" {
|
||||||
return ObjectMetadata{}, probe.New(InvalidArgument{})
|
return ObjectMetadata{}, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
if object == "" || strings.TrimSpace(object) == "" {
|
if object == "" || strings.TrimSpace(object) == "" {
|
||||||
return ObjectMetadata{}, probe.New(InvalidArgument{})
|
return ObjectMetadata{}, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
if err := donut.listDonutBuckets(); err != nil {
|
if err := donut.listDonutBuckets(); err != nil {
|
||||||
return ObjectMetadata{}, err.Trace()
|
return ObjectMetadata{}, err.Trace()
|
||||||
}
|
}
|
||||||
if _, ok := donut.buckets[bucket]; !ok {
|
if _, ok := donut.buckets[bucket]; !ok {
|
||||||
return ObjectMetadata{}, probe.New(BucketNotFound{Bucket: bucket})
|
return ObjectMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
bucketMeta, err := donut.getDonutBucketMetadata()
|
bucketMeta, err := donut.getDonutBucketMetadata()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ObjectMetadata{}, err.Trace()
|
return ObjectMetadata{}, err.Trace()
|
||||||
}
|
}
|
||||||
if _, ok := bucketMeta.Buckets[bucket].BucketObjects[object]; ok {
|
if _, ok := bucketMeta.Buckets[bucket].BucketObjects[object]; ok {
|
||||||
return ObjectMetadata{}, probe.New(ObjectExists{Object: object})
|
return ObjectMetadata{}, probe.NewError(ObjectExists{Object: object})
|
||||||
}
|
}
|
||||||
objMetadata, err := donut.buckets[bucket].WriteObject(object, reader, size, expectedMD5Sum, metadata, signature)
|
objMetadata, err := donut.buckets[bucket].WriteObject(object, reader, size, expectedMD5Sum, metadata, signature)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -161,26 +161,26 @@ func (donut API) putObject(bucket, object, expectedMD5Sum string, reader io.Read
|
|||||||
// putObject - put object
|
// putObject - put object
|
||||||
func (donut API) putObjectPart(bucket, object, expectedMD5Sum, uploadID string, partID int, reader io.Reader, size int64, metadata map[string]string, signature *Signature) (PartMetadata, *probe.Error) {
|
func (donut API) putObjectPart(bucket, object, expectedMD5Sum, uploadID string, partID int, reader io.Reader, size int64, metadata map[string]string, signature *Signature) (PartMetadata, *probe.Error) {
|
||||||
if bucket == "" || strings.TrimSpace(bucket) == "" {
|
if bucket == "" || strings.TrimSpace(bucket) == "" {
|
||||||
return PartMetadata{}, probe.New(InvalidArgument{})
|
return PartMetadata{}, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
if object == "" || strings.TrimSpace(object) == "" {
|
if object == "" || strings.TrimSpace(object) == "" {
|
||||||
return PartMetadata{}, probe.New(InvalidArgument{})
|
return PartMetadata{}, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
if err := donut.listDonutBuckets(); err != nil {
|
if err := donut.listDonutBuckets(); err != nil {
|
||||||
return PartMetadata{}, err.Trace()
|
return PartMetadata{}, err.Trace()
|
||||||
}
|
}
|
||||||
if _, ok := donut.buckets[bucket]; !ok {
|
if _, ok := donut.buckets[bucket]; !ok {
|
||||||
return PartMetadata{}, probe.New(BucketNotFound{Bucket: bucket})
|
return PartMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
bucketMeta, err := donut.getDonutBucketMetadata()
|
bucketMeta, err := donut.getDonutBucketMetadata()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return PartMetadata{}, err.Trace()
|
return PartMetadata{}, err.Trace()
|
||||||
}
|
}
|
||||||
if _, ok := bucketMeta.Buckets[bucket].Multiparts[object]; !ok {
|
if _, ok := bucketMeta.Buckets[bucket].Multiparts[object]; !ok {
|
||||||
return PartMetadata{}, probe.New(InvalidUploadID{UploadID: uploadID})
|
return PartMetadata{}, probe.NewError(InvalidUploadID{UploadID: uploadID})
|
||||||
}
|
}
|
||||||
if _, ok := bucketMeta.Buckets[bucket].BucketObjects[object]; ok {
|
if _, ok := bucketMeta.Buckets[bucket].BucketObjects[object]; ok {
|
||||||
return PartMetadata{}, probe.New(ObjectExists{Object: object})
|
return PartMetadata{}, probe.NewError(ObjectExists{Object: object})
|
||||||
}
|
}
|
||||||
objectPart := object + "/" + "multipart" + "/" + strconv.Itoa(partID)
|
objectPart := object + "/" + "multipart" + "/" + strconv.Itoa(partID)
|
||||||
objmetadata, err := donut.buckets[bucket].WriteObject(objectPart, reader, size, expectedMD5Sum, metadata, signature)
|
objmetadata, err := donut.buckets[bucket].WriteObject(objectPart, reader, size, expectedMD5Sum, metadata, signature)
|
||||||
@ -205,16 +205,16 @@ func (donut API) putObjectPart(bucket, object, expectedMD5Sum, uploadID string,
|
|||||||
// getObject - get object
|
// getObject - get object
|
||||||
func (donut API) getObject(bucket, object string) (reader io.ReadCloser, size int64, err *probe.Error) {
|
func (donut API) getObject(bucket, object string) (reader io.ReadCloser, size int64, err *probe.Error) {
|
||||||
if bucket == "" || strings.TrimSpace(bucket) == "" {
|
if bucket == "" || strings.TrimSpace(bucket) == "" {
|
||||||
return nil, 0, probe.New(InvalidArgument{})
|
return nil, 0, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
if object == "" || strings.TrimSpace(object) == "" {
|
if object == "" || strings.TrimSpace(object) == "" {
|
||||||
return nil, 0, probe.New(InvalidArgument{})
|
return nil, 0, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
if err := donut.listDonutBuckets(); err != nil {
|
if err := donut.listDonutBuckets(); err != nil {
|
||||||
return nil, 0, err.Trace()
|
return nil, 0, err.Trace()
|
||||||
}
|
}
|
||||||
if _, ok := donut.buckets[bucket]; !ok {
|
if _, ok := donut.buckets[bucket]; !ok {
|
||||||
return nil, 0, probe.New(BucketNotFound{Bucket: bucket})
|
return nil, 0, probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
return donut.buckets[bucket].ReadObject(object)
|
return donut.buckets[bucket].ReadObject(object)
|
||||||
}
|
}
|
||||||
@ -225,14 +225,14 @@ func (donut API) getObjectMetadata(bucket, object string) (ObjectMetadata, *prob
|
|||||||
return ObjectMetadata{}, err.Trace()
|
return ObjectMetadata{}, err.Trace()
|
||||||
}
|
}
|
||||||
if _, ok := donut.buckets[bucket]; !ok {
|
if _, ok := donut.buckets[bucket]; !ok {
|
||||||
return ObjectMetadata{}, probe.New(BucketNotFound{Bucket: bucket})
|
return ObjectMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
bucketMeta, err := donut.getDonutBucketMetadata()
|
bucketMeta, err := donut.getDonutBucketMetadata()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ObjectMetadata{}, err.Trace()
|
return ObjectMetadata{}, err.Trace()
|
||||||
}
|
}
|
||||||
if _, ok := bucketMeta.Buckets[bucket].BucketObjects[object]; !ok {
|
if _, ok := bucketMeta.Buckets[bucket].BucketObjects[object]; !ok {
|
||||||
return ObjectMetadata{}, probe.New(ObjectNotFound{Object: object})
|
return ObjectMetadata{}, probe.NewError(ObjectNotFound{Object: object})
|
||||||
}
|
}
|
||||||
objectMetadata, err := donut.buckets[bucket].GetObjectMetadata(object)
|
objectMetadata, err := donut.buckets[bucket].GetObjectMetadata(object)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -247,7 +247,7 @@ func (donut API) newMultipartUpload(bucket, object, contentType string) (string,
|
|||||||
return "", err.Trace()
|
return "", err.Trace()
|
||||||
}
|
}
|
||||||
if _, ok := donut.buckets[bucket]; !ok {
|
if _, ok := donut.buckets[bucket]; !ok {
|
||||||
return "", probe.New(BucketNotFound{Bucket: bucket})
|
return "", probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
allbuckets, err := donut.getDonutBucketMetadata()
|
allbuckets, err := donut.getDonutBucketMetadata()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -283,16 +283,16 @@ func (donut API) newMultipartUpload(bucket, object, contentType string) (string,
|
|||||||
// listObjectParts list all object parts
|
// listObjectParts list all object parts
|
||||||
func (donut API) listObjectParts(bucket, object string, resources ObjectResourcesMetadata) (ObjectResourcesMetadata, *probe.Error) {
|
func (donut API) listObjectParts(bucket, object string, resources ObjectResourcesMetadata) (ObjectResourcesMetadata, *probe.Error) {
|
||||||
if bucket == "" || strings.TrimSpace(bucket) == "" {
|
if bucket == "" || strings.TrimSpace(bucket) == "" {
|
||||||
return ObjectResourcesMetadata{}, probe.New(InvalidArgument{})
|
return ObjectResourcesMetadata{}, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
if object == "" || strings.TrimSpace(object) == "" {
|
if object == "" || strings.TrimSpace(object) == "" {
|
||||||
return ObjectResourcesMetadata{}, probe.New(InvalidArgument{})
|
return ObjectResourcesMetadata{}, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
if err := donut.listDonutBuckets(); err != nil {
|
if err := donut.listDonutBuckets(); err != nil {
|
||||||
return ObjectResourcesMetadata{}, err.Trace()
|
return ObjectResourcesMetadata{}, err.Trace()
|
||||||
}
|
}
|
||||||
if _, ok := donut.buckets[bucket]; !ok {
|
if _, ok := donut.buckets[bucket]; !ok {
|
||||||
return ObjectResourcesMetadata{}, probe.New(BucketNotFound{Bucket: bucket})
|
return ObjectResourcesMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
allBuckets, err := donut.getDonutBucketMetadata()
|
allBuckets, err := donut.getDonutBucketMetadata()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -300,10 +300,10 @@ func (donut API) listObjectParts(bucket, object string, resources ObjectResource
|
|||||||
}
|
}
|
||||||
bucketMetadata := allBuckets.Buckets[bucket]
|
bucketMetadata := allBuckets.Buckets[bucket]
|
||||||
if _, ok := bucketMetadata.Multiparts[object]; !ok {
|
if _, ok := bucketMetadata.Multiparts[object]; !ok {
|
||||||
return ObjectResourcesMetadata{}, probe.New(InvalidUploadID{UploadID: resources.UploadID})
|
return ObjectResourcesMetadata{}, probe.NewError(InvalidUploadID{UploadID: resources.UploadID})
|
||||||
}
|
}
|
||||||
if bucketMetadata.Multiparts[object].UploadID != resources.UploadID {
|
if bucketMetadata.Multiparts[object].UploadID != resources.UploadID {
|
||||||
return ObjectResourcesMetadata{}, probe.New(InvalidUploadID{UploadID: resources.UploadID})
|
return ObjectResourcesMetadata{}, probe.NewError(InvalidUploadID{UploadID: resources.UploadID})
|
||||||
}
|
}
|
||||||
objectResourcesMetadata := resources
|
objectResourcesMetadata := resources
|
||||||
objectResourcesMetadata.Bucket = bucket
|
objectResourcesMetadata.Bucket = bucket
|
||||||
@ -326,7 +326,7 @@ func (donut API) listObjectParts(bucket, object string, resources ObjectResource
|
|||||||
}
|
}
|
||||||
part, ok := bucketMetadata.Multiparts[object].Parts[strconv.Itoa(i)]
|
part, ok := bucketMetadata.Multiparts[object].Parts[strconv.Itoa(i)]
|
||||||
if !ok {
|
if !ok {
|
||||||
return ObjectResourcesMetadata{}, probe.New(InvalidPart{})
|
return ObjectResourcesMetadata{}, probe.NewError(InvalidPart{})
|
||||||
}
|
}
|
||||||
parts = append(parts, &part)
|
parts = append(parts, &part)
|
||||||
}
|
}
|
||||||
@ -338,16 +338,16 @@ func (donut API) listObjectParts(bucket, object string, resources ObjectResource
|
|||||||
// completeMultipartUpload complete an incomplete multipart upload
|
// completeMultipartUpload complete an incomplete multipart upload
|
||||||
func (donut API) completeMultipartUpload(bucket, object, uploadID string, data io.Reader, signature *Signature) (ObjectMetadata, *probe.Error) {
|
func (donut API) completeMultipartUpload(bucket, object, uploadID string, data io.Reader, signature *Signature) (ObjectMetadata, *probe.Error) {
|
||||||
if bucket == "" || strings.TrimSpace(bucket) == "" {
|
if bucket == "" || strings.TrimSpace(bucket) == "" {
|
||||||
return ObjectMetadata{}, probe.New(InvalidArgument{})
|
return ObjectMetadata{}, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
if object == "" || strings.TrimSpace(object) == "" {
|
if object == "" || strings.TrimSpace(object) == "" {
|
||||||
return ObjectMetadata{}, probe.New(InvalidArgument{})
|
return ObjectMetadata{}, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
if err := donut.listDonutBuckets(); err != nil {
|
if err := donut.listDonutBuckets(); err != nil {
|
||||||
return ObjectMetadata{}, err.Trace()
|
return ObjectMetadata{}, err.Trace()
|
||||||
}
|
}
|
||||||
if _, ok := donut.buckets[bucket]; !ok {
|
if _, ok := donut.buckets[bucket]; !ok {
|
||||||
return ObjectMetadata{}, probe.New(BucketNotFound{Bucket: bucket})
|
return ObjectMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
allBuckets, err := donut.getDonutBucketMetadata()
|
allBuckets, err := donut.getDonutBucketMetadata()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -355,17 +355,17 @@ func (donut API) completeMultipartUpload(bucket, object, uploadID string, data i
|
|||||||
}
|
}
|
||||||
bucketMetadata := allBuckets.Buckets[bucket]
|
bucketMetadata := allBuckets.Buckets[bucket]
|
||||||
if _, ok := bucketMetadata.Multiparts[object]; !ok {
|
if _, ok := bucketMetadata.Multiparts[object]; !ok {
|
||||||
return ObjectMetadata{}, probe.New(InvalidUploadID{UploadID: uploadID})
|
return ObjectMetadata{}, probe.NewError(InvalidUploadID{UploadID: uploadID})
|
||||||
}
|
}
|
||||||
if bucketMetadata.Multiparts[object].UploadID != uploadID {
|
if bucketMetadata.Multiparts[object].UploadID != uploadID {
|
||||||
return ObjectMetadata{}, probe.New(InvalidUploadID{UploadID: uploadID})
|
return ObjectMetadata{}, probe.NewError(InvalidUploadID{UploadID: uploadID})
|
||||||
}
|
}
|
||||||
var partBytes []byte
|
var partBytes []byte
|
||||||
{
|
{
|
||||||
var err error
|
var err error
|
||||||
partBytes, err = ioutil.ReadAll(data)
|
partBytes, err = ioutil.ReadAll(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ObjectMetadata{}, probe.New(err)
|
return ObjectMetadata{}, probe.NewError(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if signature != nil {
|
if signature != nil {
|
||||||
@ -374,19 +374,19 @@ func (donut API) completeMultipartUpload(bucket, object, uploadID string, data i
|
|||||||
return ObjectMetadata{}, err.Trace()
|
return ObjectMetadata{}, err.Trace()
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return ObjectMetadata{}, probe.New(SignatureDoesNotMatch{})
|
return ObjectMetadata{}, probe.NewError(SignatureDoesNotMatch{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
parts := &CompleteMultipartUpload{}
|
parts := &CompleteMultipartUpload{}
|
||||||
if err := xml.Unmarshal(partBytes, parts); err != nil {
|
if err := xml.Unmarshal(partBytes, parts); err != nil {
|
||||||
return ObjectMetadata{}, probe.New(MalformedXML{})
|
return ObjectMetadata{}, probe.NewError(MalformedXML{})
|
||||||
}
|
}
|
||||||
if !sort.IsSorted(completedParts(parts.Part)) {
|
if !sort.IsSorted(completedParts(parts.Part)) {
|
||||||
return ObjectMetadata{}, probe.New(InvalidPartOrder{})
|
return ObjectMetadata{}, probe.NewError(InvalidPartOrder{})
|
||||||
}
|
}
|
||||||
for _, part := range parts.Part {
|
for _, part := range parts.Part {
|
||||||
if strings.Trim(part.ETag, "\"") != bucketMetadata.Multiparts[object].Parts[strconv.Itoa(part.PartNumber)].ETag {
|
if strings.Trim(part.ETag, "\"") != bucketMetadata.Multiparts[object].Parts[strconv.Itoa(part.PartNumber)].ETag {
|
||||||
return ObjectMetadata{}, probe.New(InvalidPart{})
|
return ObjectMetadata{}, probe.NewError(InvalidPart{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var finalETagBytes []byte
|
var finalETagBytes []byte
|
||||||
@ -395,7 +395,7 @@ func (donut API) completeMultipartUpload(bucket, object, uploadID string, data i
|
|||||||
for _, part := range bucketMetadata.Multiparts[object].Parts {
|
for _, part := range bucketMetadata.Multiparts[object].Parts {
|
||||||
partETagBytes, err := hex.DecodeString(part.ETag)
|
partETagBytes, err := hex.DecodeString(part.ETag)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ObjectMetadata{}, probe.New(err)
|
return ObjectMetadata{}, probe.NewError(err)
|
||||||
}
|
}
|
||||||
finalETagBytes = append(finalETagBytes, partETagBytes...)
|
finalETagBytes = append(finalETagBytes, partETagBytes...)
|
||||||
finalSize += part.Size
|
finalSize += part.Size
|
||||||
@ -416,7 +416,7 @@ func (donut API) listMultipartUploads(bucket string, resources BucketMultipartRe
|
|||||||
return BucketMultipartResourcesMetadata{}, err.Trace()
|
return BucketMultipartResourcesMetadata{}, err.Trace()
|
||||||
}
|
}
|
||||||
if _, ok := donut.buckets[bucket]; !ok {
|
if _, ok := donut.buckets[bucket]; !ok {
|
||||||
return BucketMultipartResourcesMetadata{}, probe.New(BucketNotFound{Bucket: bucket})
|
return BucketMultipartResourcesMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
allbuckets, err := donut.getDonutBucketMetadata()
|
allbuckets, err := donut.getDonutBucketMetadata()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -474,7 +474,7 @@ func (donut API) abortMultipartUpload(bucket, object, uploadID string) *probe.Er
|
|||||||
return err.Trace()
|
return err.Trace()
|
||||||
}
|
}
|
||||||
if _, ok := donut.buckets[bucket]; !ok {
|
if _, ok := donut.buckets[bucket]; !ok {
|
||||||
return probe.New(BucketNotFound{Bucket: bucket})
|
return probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
allbuckets, err := donut.getDonutBucketMetadata()
|
allbuckets, err := donut.getDonutBucketMetadata()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -482,10 +482,10 @@ func (donut API) abortMultipartUpload(bucket, object, uploadID string) *probe.Er
|
|||||||
}
|
}
|
||||||
bucketMetadata := allbuckets.Buckets[bucket]
|
bucketMetadata := allbuckets.Buckets[bucket]
|
||||||
if _, ok := bucketMetadata.Multiparts[object]; !ok {
|
if _, ok := bucketMetadata.Multiparts[object]; !ok {
|
||||||
return probe.New(InvalidUploadID{UploadID: uploadID})
|
return probe.NewError(InvalidUploadID{UploadID: uploadID})
|
||||||
}
|
}
|
||||||
if bucketMetadata.Multiparts[object].UploadID != uploadID {
|
if bucketMetadata.Multiparts[object].UploadID != uploadID {
|
||||||
return probe.New(InvalidUploadID{UploadID: uploadID})
|
return probe.NewError(InvalidUploadID{UploadID: uploadID})
|
||||||
}
|
}
|
||||||
delete(bucketMetadata.Multiparts, object)
|
delete(bucketMetadata.Multiparts, object)
|
||||||
|
|
||||||
@ -557,7 +557,7 @@ func (donut API) setDonutBucketMetadata(metadata *AllBuckets) *probe.Error {
|
|||||||
jenc := json.NewEncoder(writer)
|
jenc := json.NewEncoder(writer)
|
||||||
if err := jenc.Encode(metadata); err != nil {
|
if err := jenc.Encode(metadata); err != nil {
|
||||||
CleanupWritersOnError(writers)
|
CleanupWritersOnError(writers)
|
||||||
return probe.New(err)
|
return probe.NewError(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, writer := range writers {
|
for _, writer := range writers {
|
||||||
@ -584,7 +584,7 @@ func (donut API) getDonutBucketMetadata() (*AllBuckets, *probe.Error) {
|
|||||||
return metadata, nil
|
return metadata, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -594,7 +594,7 @@ func (donut API) makeDonutBucket(bucketName, acl string) *probe.Error {
|
|||||||
return err.Trace()
|
return err.Trace()
|
||||||
}
|
}
|
||||||
if _, ok := donut.buckets[bucketName]; ok {
|
if _, ok := donut.buckets[bucketName]; ok {
|
||||||
return probe.New(BucketExists{Bucket: bucketName})
|
return probe.NewError(BucketExists{Bucket: bucketName})
|
||||||
}
|
}
|
||||||
bucket, bucketMetadata, err := newBucket(bucketName, acl, donut.config.DonutName, donut.nodes)
|
bucket, bucketMetadata, err := newBucket(bucketName, acl, donut.config.DonutName, donut.nodes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -662,7 +662,7 @@ func (donut API) listDonutBuckets() *probe.Error {
|
|||||||
for _, dir := range dirs {
|
for _, dir := range dirs {
|
||||||
splitDir := strings.Split(dir.Name(), "$")
|
splitDir := strings.Split(dir.Name(), "$")
|
||||||
if len(splitDir) < 3 {
|
if len(splitDir) < 3 {
|
||||||
return probe.New(CorruptedBackend{Backend: dir.Name()})
|
return probe.NewError(CorruptedBackend{Backend: dir.Name()})
|
||||||
}
|
}
|
||||||
bucketName := splitDir[0]
|
bucketName := splitDir[0]
|
||||||
// we dont need this once we cache from makeDonutBucket()
|
// we dont need this once we cache from makeDonutBucket()
|
||||||
|
@ -67,15 +67,15 @@ func (s *MyDonutSuite) SetUpSuite(c *C) {
|
|||||||
conf.NodeDiskMap = createTestNodeDiskMap(root)
|
conf.NodeDiskMap = createTestNodeDiskMap(root)
|
||||||
conf.MaxSize = 100000
|
conf.MaxSize = 100000
|
||||||
SetDonutConfigPath(filepath.Join(root, "donut.json"))
|
SetDonutConfigPath(filepath.Join(root, "donut.json"))
|
||||||
err = SaveConfig(conf)
|
perr := SaveConfig(conf)
|
||||||
c.Assert(err, IsNil)
|
c.Assert(perr, IsNil)
|
||||||
|
|
||||||
dd, err = New()
|
dd, perr = New()
|
||||||
c.Assert(err, IsNil)
|
c.Assert(perr, IsNil)
|
||||||
|
|
||||||
// testing empty donut
|
// testing empty donut
|
||||||
buckets, err := dd.ListBuckets(nil)
|
buckets, perr := dd.ListBuckets(nil)
|
||||||
c.Assert(err, IsNil)
|
c.Assert(perr, IsNil)
|
||||||
c.Assert(len(buckets), Equals, 0)
|
c.Assert(len(buckets), Equals, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ func New() (Interface, *probe.Error) {
|
|||||||
if len(a.config.NodeDiskMap) > 0 {
|
if len(a.config.NodeDiskMap) > 0 {
|
||||||
for k, v := range a.config.NodeDiskMap {
|
for k, v := range a.config.NodeDiskMap {
|
||||||
if len(v) == 0 {
|
if len(v) == 0 {
|
||||||
return nil, probe.New(InvalidDisksArgument{})
|
return nil, probe.NewError(InvalidDisksArgument{})
|
||||||
}
|
}
|
||||||
err := a.AttachNode(k, v)
|
err := a.AttachNode(k, v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -131,19 +131,19 @@ func (donut API) GetObject(w io.Writer, bucket string, object string, start, len
|
|||||||
defer donut.lock.Unlock()
|
defer donut.lock.Unlock()
|
||||||
|
|
||||||
if !IsValidBucket(bucket) {
|
if !IsValidBucket(bucket) {
|
||||||
return 0, probe.New(BucketNameInvalid{Bucket: bucket})
|
return 0, probe.NewError(BucketNameInvalid{Bucket: bucket})
|
||||||
}
|
}
|
||||||
if !IsValidObjectName(object) {
|
if !IsValidObjectName(object) {
|
||||||
return 0, probe.New(ObjectNameInvalid{Object: object})
|
return 0, probe.NewError(ObjectNameInvalid{Object: object})
|
||||||
}
|
}
|
||||||
if start < 0 {
|
if start < 0 {
|
||||||
return 0, probe.New(InvalidRange{
|
return 0, probe.NewError(InvalidRange{
|
||||||
Start: start,
|
Start: start,
|
||||||
Length: length,
|
Length: length,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
if !donut.storedBuckets.Exists(bucket) {
|
if !donut.storedBuckets.Exists(bucket) {
|
||||||
return 0, probe.New(BucketNotFound{Bucket: bucket})
|
return 0, probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
objectKey := bucket + "/" + object
|
objectKey := bucket + "/" + object
|
||||||
data, ok := donut.objects.Get(objectKey)
|
data, ok := donut.objects.Get(objectKey)
|
||||||
@ -156,7 +156,7 @@ func (donut API) GetObject(w io.Writer, bucket string, object string, start, len
|
|||||||
}
|
}
|
||||||
if start > 0 {
|
if start > 0 {
|
||||||
if _, err := io.CopyN(ioutil.Discard, reader, start); err != nil {
|
if _, err := io.CopyN(ioutil.Discard, reader, start); err != nil {
|
||||||
return 0, probe.New(err)
|
return 0, probe.NewError(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// new proxy writer to capture data read from disk
|
// new proxy writer to capture data read from disk
|
||||||
@ -166,12 +166,12 @@ func (donut API) GetObject(w io.Writer, bucket string, object string, start, len
|
|||||||
if length > 0 {
|
if length > 0 {
|
||||||
written, err = io.CopyN(pw, reader, length)
|
written, err = io.CopyN(pw, reader, length)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, probe.New(err)
|
return 0, probe.NewError(err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
written, err = io.CopyN(pw, reader, size)
|
written, err = io.CopyN(pw, reader, size)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, probe.New(err)
|
return 0, probe.NewError(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -180,23 +180,23 @@ func (donut API) GetObject(w io.Writer, bucket string, object string, start, len
|
|||||||
pw.writtenBytes = nil
|
pw.writtenBytes = nil
|
||||||
go debug.FreeOSMemory()
|
go debug.FreeOSMemory()
|
||||||
if !ok {
|
if !ok {
|
||||||
return 0, probe.New(InternalError{})
|
return 0, probe.NewError(InternalError{})
|
||||||
}
|
}
|
||||||
return written, nil
|
return written, nil
|
||||||
}
|
}
|
||||||
return 0, probe.New(ObjectNotFound{Object: object})
|
return 0, probe.NewError(ObjectNotFound{Object: object})
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
var err error
|
var err error
|
||||||
if start == 0 && length == 0 {
|
if start == 0 && length == 0 {
|
||||||
written, err = io.CopyN(w, bytes.NewBuffer(data), int64(donut.objects.Len(objectKey)))
|
written, err = io.CopyN(w, bytes.NewBuffer(data), int64(donut.objects.Len(objectKey)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, probe.New(err)
|
return 0, probe.NewError(err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
written, err = io.CopyN(w, bytes.NewBuffer(data[start:]), length)
|
written, err = io.CopyN(w, bytes.NewBuffer(data[start:]), length)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, probe.New(err)
|
return 0, probe.NewError(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return written, nil
|
return written, nil
|
||||||
@ -214,12 +214,12 @@ func (donut API) GetBucketMetadata(bucket string, signature *Signature) (BucketM
|
|||||||
return BucketMetadata{}, err.Trace()
|
return BucketMetadata{}, err.Trace()
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return BucketMetadata{}, probe.New(SignatureDoesNotMatch{})
|
return BucketMetadata{}, probe.NewError(SignatureDoesNotMatch{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !IsValidBucket(bucket) {
|
if !IsValidBucket(bucket) {
|
||||||
return BucketMetadata{}, probe.New(BucketNameInvalid{Bucket: bucket})
|
return BucketMetadata{}, probe.NewError(BucketNameInvalid{Bucket: bucket})
|
||||||
}
|
}
|
||||||
if !donut.storedBuckets.Exists(bucket) {
|
if !donut.storedBuckets.Exists(bucket) {
|
||||||
if len(donut.config.NodeDiskMap) > 0 {
|
if len(donut.config.NodeDiskMap) > 0 {
|
||||||
@ -231,7 +231,7 @@ func (donut API) GetBucketMetadata(bucket string, signature *Signature) (BucketM
|
|||||||
storedBucket.bucketMetadata = bucketMetadata
|
storedBucket.bucketMetadata = bucketMetadata
|
||||||
donut.storedBuckets.Set(bucket, storedBucket)
|
donut.storedBuckets.Set(bucket, storedBucket)
|
||||||
}
|
}
|
||||||
return BucketMetadata{}, probe.New(BucketNotFound{Bucket: bucket})
|
return BucketMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
return donut.storedBuckets.Get(bucket).(storedBucket).bucketMetadata, nil
|
return donut.storedBuckets.Get(bucket).(storedBucket).bucketMetadata, nil
|
||||||
}
|
}
|
||||||
@ -247,15 +247,15 @@ func (donut API) SetBucketMetadata(bucket string, metadata map[string]string, si
|
|||||||
return err.Trace()
|
return err.Trace()
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return probe.New(SignatureDoesNotMatch{})
|
return probe.NewError(SignatureDoesNotMatch{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !IsValidBucket(bucket) {
|
if !IsValidBucket(bucket) {
|
||||||
return probe.New(BucketNameInvalid{Bucket: bucket})
|
return probe.NewError(BucketNameInvalid{Bucket: bucket})
|
||||||
}
|
}
|
||||||
if !donut.storedBuckets.Exists(bucket) {
|
if !donut.storedBuckets.Exists(bucket) {
|
||||||
return probe.New(BucketNotFound{Bucket: bucket})
|
return probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
if len(donut.config.NodeDiskMap) > 0 {
|
if len(donut.config.NodeDiskMap) > 0 {
|
||||||
if err := donut.setBucketMetadata(bucket, metadata); err != nil {
|
if err := donut.setBucketMetadata(bucket, metadata); err != nil {
|
||||||
@ -273,18 +273,18 @@ func isMD5SumEqual(expectedMD5Sum, actualMD5Sum string) *probe.Error {
|
|||||||
if strings.TrimSpace(expectedMD5Sum) != "" && strings.TrimSpace(actualMD5Sum) != "" {
|
if strings.TrimSpace(expectedMD5Sum) != "" && strings.TrimSpace(actualMD5Sum) != "" {
|
||||||
expectedMD5SumBytes, err := hex.DecodeString(expectedMD5Sum)
|
expectedMD5SumBytes, err := hex.DecodeString(expectedMD5Sum)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return probe.New(err)
|
return probe.NewError(err)
|
||||||
}
|
}
|
||||||
actualMD5SumBytes, err := hex.DecodeString(actualMD5Sum)
|
actualMD5SumBytes, err := hex.DecodeString(actualMD5Sum)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return probe.New(err)
|
return probe.NewError(err)
|
||||||
}
|
}
|
||||||
if !bytes.Equal(expectedMD5SumBytes, actualMD5SumBytes) {
|
if !bytes.Equal(expectedMD5SumBytes, actualMD5SumBytes) {
|
||||||
return probe.New(BadDigest{})
|
return probe.NewError(BadDigest{})
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return probe.New(InvalidArgument{})
|
return probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateObject - create an object
|
// CreateObject - create an object
|
||||||
@ -305,7 +305,7 @@ func (donut API) createObject(bucket, key, contentType, expectedMD5Sum string, s
|
|||||||
if len(donut.config.NodeDiskMap) == 0 {
|
if len(donut.config.NodeDiskMap) == 0 {
|
||||||
if size > int64(donut.config.MaxSize) {
|
if size > int64(donut.config.MaxSize) {
|
||||||
generic := GenericObjectError{Bucket: bucket, Object: key}
|
generic := GenericObjectError{Bucket: bucket, Object: key}
|
||||||
return ObjectMetadata{}, probe.New(EntityTooLarge{
|
return ObjectMetadata{}, probe.NewError(EntityTooLarge{
|
||||||
GenericObjectError: generic,
|
GenericObjectError: generic,
|
||||||
Size: strconv.FormatInt(size, 10),
|
Size: strconv.FormatInt(size, 10),
|
||||||
MaxSize: strconv.FormatUint(donut.config.MaxSize, 10),
|
MaxSize: strconv.FormatUint(donut.config.MaxSize, 10),
|
||||||
@ -313,19 +313,19 @@ func (donut API) createObject(bucket, key, contentType, expectedMD5Sum string, s
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !IsValidBucket(bucket) {
|
if !IsValidBucket(bucket) {
|
||||||
return ObjectMetadata{}, probe.New(BucketNameInvalid{Bucket: bucket})
|
return ObjectMetadata{}, probe.NewError(BucketNameInvalid{Bucket: bucket})
|
||||||
}
|
}
|
||||||
if !IsValidObjectName(key) {
|
if !IsValidObjectName(key) {
|
||||||
return ObjectMetadata{}, probe.New(ObjectNameInvalid{Object: key})
|
return ObjectMetadata{}, probe.NewError(ObjectNameInvalid{Object: key})
|
||||||
}
|
}
|
||||||
if !donut.storedBuckets.Exists(bucket) {
|
if !donut.storedBuckets.Exists(bucket) {
|
||||||
return ObjectMetadata{}, probe.New(BucketNotFound{Bucket: bucket})
|
return ObjectMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
storedBucket := donut.storedBuckets.Get(bucket).(storedBucket)
|
storedBucket := donut.storedBuckets.Get(bucket).(storedBucket)
|
||||||
// get object key
|
// get object key
|
||||||
objectKey := bucket + "/" + key
|
objectKey := bucket + "/" + key
|
||||||
if _, ok := storedBucket.objectMetadata[objectKey]; ok == true {
|
if _, ok := storedBucket.objectMetadata[objectKey]; ok == true {
|
||||||
return ObjectMetadata{}, probe.New(ObjectExists{Object: key})
|
return ObjectMetadata{}, probe.NewError(ObjectExists{Object: key})
|
||||||
}
|
}
|
||||||
|
|
||||||
if contentType == "" {
|
if contentType == "" {
|
||||||
@ -336,7 +336,7 @@ func (donut API) createObject(bucket, key, contentType, expectedMD5Sum string, s
|
|||||||
expectedMD5SumBytes, err := base64.StdEncoding.DecodeString(strings.TrimSpace(expectedMD5Sum))
|
expectedMD5SumBytes, err := base64.StdEncoding.DecodeString(strings.TrimSpace(expectedMD5Sum))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// pro-actively close the connection
|
// pro-actively close the connection
|
||||||
return ObjectMetadata{}, probe.New(InvalidDigest{Md5: expectedMD5Sum})
|
return ObjectMetadata{}, probe.NewError(InvalidDigest{Md5: expectedMD5Sum})
|
||||||
}
|
}
|
||||||
expectedMD5Sum = hex.EncodeToString(expectedMD5SumBytes)
|
expectedMD5Sum = hex.EncodeToString(expectedMD5SumBytes)
|
||||||
}
|
}
|
||||||
@ -375,7 +375,7 @@ func (donut API) createObject(bucket, key, contentType, expectedMD5Sum string, s
|
|||||||
sha256hash.Write(byteBuffer[0:length])
|
sha256hash.Write(byteBuffer[0:length])
|
||||||
ok := donut.objects.Append(objectKey, byteBuffer[0:length])
|
ok := donut.objects.Append(objectKey, byteBuffer[0:length])
|
||||||
if !ok {
|
if !ok {
|
||||||
return ObjectMetadata{}, probe.New(InternalError{})
|
return ObjectMetadata{}, probe.NewError(InternalError{})
|
||||||
}
|
}
|
||||||
totalLength += int64(length)
|
totalLength += int64(length)
|
||||||
go debug.FreeOSMemory()
|
go debug.FreeOSMemory()
|
||||||
@ -383,17 +383,17 @@ func (donut API) createObject(bucket, key, contentType, expectedMD5Sum string, s
|
|||||||
if totalLength != size {
|
if totalLength != size {
|
||||||
// Delete perhaps the object is already saved, due to the nature of append()
|
// Delete perhaps the object is already saved, due to the nature of append()
|
||||||
donut.objects.Delete(objectKey)
|
donut.objects.Delete(objectKey)
|
||||||
return ObjectMetadata{}, probe.New(IncompleteBody{Bucket: bucket, Object: key})
|
return ObjectMetadata{}, probe.NewError(IncompleteBody{Bucket: bucket, Object: key})
|
||||||
}
|
}
|
||||||
if err != io.EOF {
|
if err != io.EOF {
|
||||||
return ObjectMetadata{}, probe.New(err)
|
return ObjectMetadata{}, probe.NewError(err)
|
||||||
}
|
}
|
||||||
md5SumBytes := hash.Sum(nil)
|
md5SumBytes := hash.Sum(nil)
|
||||||
md5Sum := hex.EncodeToString(md5SumBytes)
|
md5Sum := hex.EncodeToString(md5SumBytes)
|
||||||
// Verify if the written object is equal to what is expected, only if it is requested as such
|
// Verify if the written object is equal to what is expected, only if it is requested as such
|
||||||
if strings.TrimSpace(expectedMD5Sum) != "" {
|
if strings.TrimSpace(expectedMD5Sum) != "" {
|
||||||
if err := isMD5SumEqual(strings.TrimSpace(expectedMD5Sum), md5Sum); err != nil {
|
if err := isMD5SumEqual(strings.TrimSpace(expectedMD5Sum), md5Sum); err != nil {
|
||||||
return ObjectMetadata{}, probe.New(BadDigest{})
|
return ObjectMetadata{}, probe.NewError(BadDigest{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if signature != nil {
|
if signature != nil {
|
||||||
@ -402,7 +402,7 @@ func (donut API) createObject(bucket, key, contentType, expectedMD5Sum string, s
|
|||||||
return ObjectMetadata{}, err.Trace()
|
return ObjectMetadata{}, err.Trace()
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return ObjectMetadata{}, probe.New(SignatureDoesNotMatch{})
|
return ObjectMetadata{}, probe.NewError(SignatureDoesNotMatch{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -433,7 +433,7 @@ func (donut API) MakeBucket(bucketName, acl string, location io.Reader, signatur
|
|||||||
if location != nil {
|
if location != nil {
|
||||||
locationConstraintBytes, err := ioutil.ReadAll(location)
|
locationConstraintBytes, err := ioutil.ReadAll(location)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return probe.New(InternalError{})
|
return probe.NewError(InternalError{})
|
||||||
}
|
}
|
||||||
locationSum = hex.EncodeToString(sha256.Sum256(locationConstraintBytes)[:])
|
locationSum = hex.EncodeToString(sha256.Sum256(locationConstraintBytes)[:])
|
||||||
}
|
}
|
||||||
@ -444,21 +444,21 @@ func (donut API) MakeBucket(bucketName, acl string, location io.Reader, signatur
|
|||||||
return err.Trace()
|
return err.Trace()
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return probe.New(SignatureDoesNotMatch{})
|
return probe.NewError(SignatureDoesNotMatch{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if donut.storedBuckets.Stats().Items == totalBuckets {
|
if donut.storedBuckets.Stats().Items == totalBuckets {
|
||||||
return probe.New(TooManyBuckets{Bucket: bucketName})
|
return probe.NewError(TooManyBuckets{Bucket: bucketName})
|
||||||
}
|
}
|
||||||
if !IsValidBucket(bucketName) {
|
if !IsValidBucket(bucketName) {
|
||||||
return probe.New(BucketNameInvalid{Bucket: bucketName})
|
return probe.NewError(BucketNameInvalid{Bucket: bucketName})
|
||||||
}
|
}
|
||||||
if !IsValidBucketACL(acl) {
|
if !IsValidBucketACL(acl) {
|
||||||
return probe.New(InvalidACL{ACL: acl})
|
return probe.NewError(InvalidACL{ACL: acl})
|
||||||
}
|
}
|
||||||
if donut.storedBuckets.Exists(bucketName) {
|
if donut.storedBuckets.Exists(bucketName) {
|
||||||
return probe.New(BucketExists{Bucket: bucketName})
|
return probe.NewError(BucketExists{Bucket: bucketName})
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.TrimSpace(acl) == "" {
|
if strings.TrimSpace(acl) == "" {
|
||||||
@ -493,18 +493,18 @@ func (donut API) ListObjects(bucket string, resources BucketResourcesMetadata, s
|
|||||||
return nil, BucketResourcesMetadata{}, err.Trace()
|
return nil, BucketResourcesMetadata{}, err.Trace()
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, BucketResourcesMetadata{}, probe.New(SignatureDoesNotMatch{})
|
return nil, BucketResourcesMetadata{}, probe.NewError(SignatureDoesNotMatch{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !IsValidBucket(bucket) {
|
if !IsValidBucket(bucket) {
|
||||||
return nil, BucketResourcesMetadata{IsTruncated: false}, probe.New(BucketNameInvalid{Bucket: bucket})
|
return nil, BucketResourcesMetadata{IsTruncated: false}, probe.NewError(BucketNameInvalid{Bucket: bucket})
|
||||||
}
|
}
|
||||||
if !IsValidPrefix(resources.Prefix) {
|
if !IsValidPrefix(resources.Prefix) {
|
||||||
return nil, BucketResourcesMetadata{IsTruncated: false}, probe.New(ObjectNameInvalid{Object: resources.Prefix})
|
return nil, BucketResourcesMetadata{IsTruncated: false}, probe.NewError(ObjectNameInvalid{Object: resources.Prefix})
|
||||||
}
|
}
|
||||||
if !donut.storedBuckets.Exists(bucket) {
|
if !donut.storedBuckets.Exists(bucket) {
|
||||||
return nil, BucketResourcesMetadata{IsTruncated: false}, probe.New(BucketNotFound{Bucket: bucket})
|
return nil, BucketResourcesMetadata{IsTruncated: false}, probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
var results []ObjectMetadata
|
var results []ObjectMetadata
|
||||||
var keys []string
|
var keys []string
|
||||||
@ -593,10 +593,10 @@ func (donut API) ListBuckets(signature *Signature) ([]BucketMetadata, *probe.Err
|
|||||||
if signature != nil {
|
if signature != nil {
|
||||||
ok, err := signature.DoesSignatureMatch("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")
|
ok, err := signature.DoesSignatureMatch("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, err.Trace()
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, probe.New(SignatureDoesNotMatch{})
|
return nil, probe.NewError(SignatureDoesNotMatch{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -630,19 +630,19 @@ func (donut API) GetObjectMetadata(bucket, key string, signature *Signature) (Ob
|
|||||||
return ObjectMetadata{}, err.Trace()
|
return ObjectMetadata{}, err.Trace()
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return ObjectMetadata{}, probe.New(SignatureDoesNotMatch{})
|
return ObjectMetadata{}, probe.NewError(SignatureDoesNotMatch{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if bucket exists
|
// check if bucket exists
|
||||||
if !IsValidBucket(bucket) {
|
if !IsValidBucket(bucket) {
|
||||||
return ObjectMetadata{}, probe.New(BucketNameInvalid{Bucket: bucket})
|
return ObjectMetadata{}, probe.NewError(BucketNameInvalid{Bucket: bucket})
|
||||||
}
|
}
|
||||||
if !IsValidObjectName(key) {
|
if !IsValidObjectName(key) {
|
||||||
return ObjectMetadata{}, probe.New(ObjectNameInvalid{Object: key})
|
return ObjectMetadata{}, probe.NewError(ObjectNameInvalid{Object: key})
|
||||||
}
|
}
|
||||||
if !donut.storedBuckets.Exists(bucket) {
|
if !donut.storedBuckets.Exists(bucket) {
|
||||||
return ObjectMetadata{}, probe.New(BucketNotFound{Bucket: bucket})
|
return ObjectMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
storedBucket := donut.storedBuckets.Get(bucket).(storedBucket)
|
storedBucket := donut.storedBuckets.Get(bucket).(storedBucket)
|
||||||
objectKey := bucket + "/" + key
|
objectKey := bucket + "/" + key
|
||||||
@ -659,7 +659,7 @@ func (donut API) GetObjectMetadata(bucket, key string, signature *Signature) (Ob
|
|||||||
donut.storedBuckets.Set(bucket, storedBucket)
|
donut.storedBuckets.Set(bucket, storedBucket)
|
||||||
return objMetadata, nil
|
return objMetadata, nil
|
||||||
}
|
}
|
||||||
return ObjectMetadata{}, probe.New(ObjectNotFound{Object: key})
|
return ObjectMetadata{}, probe.NewError(ObjectNotFound{Object: key})
|
||||||
}
|
}
|
||||||
|
|
||||||
// evictedObject callback function called when an item is evicted from memory
|
// evictedObject callback function called when an item is evicted from memory
|
||||||
|
@ -45,12 +45,12 @@ func (s *MyCacheSuite) SetUpSuite(c *C) {
|
|||||||
s.root = root
|
s.root = root
|
||||||
|
|
||||||
SetDonutConfigPath(filepath.Join(root, "donut.json"))
|
SetDonutConfigPath(filepath.Join(root, "donut.json"))
|
||||||
dc, err = New()
|
dc, _ = New()
|
||||||
c.Assert(err, IsNil)
|
|
||||||
|
|
||||||
// testing empty cache
|
// testing empty cache
|
||||||
buckets, err := dc.ListBuckets(nil)
|
var buckets []BucketMetadata
|
||||||
c.Assert(err, IsNil)
|
buckets, perr := dc.ListBuckets(nil)
|
||||||
|
c.Assert(perr, IsNil)
|
||||||
c.Assert(len(buckets), Equals, 0)
|
c.Assert(len(buckets), Equals, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ func getErasureTechnique(technique string) (encoding.Technique, *probe.Error) {
|
|||||||
case technique == "Vandermonde":
|
case technique == "Vandermonde":
|
||||||
return encoding.Cauchy, nil
|
return encoding.Cauchy, nil
|
||||||
default:
|
default:
|
||||||
return encoding.None, probe.New(InvalidErasureTechnique{Technique: technique})
|
return encoding.None, probe.NewError(InvalidErasureTechnique{Technique: technique})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,7 +52,7 @@ func newEncoder(k, m uint8, technique string) (encoder, *probe.Error) {
|
|||||||
{
|
{
|
||||||
params, err := encoding.ValidateParams(k, m, t)
|
params, err := encoding.ValidateParams(k, m, t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return encoder{}, probe.New(err)
|
return encoder{}, probe.NewError(err)
|
||||||
}
|
}
|
||||||
e.encoder = encoding.NewErasure(params)
|
e.encoder = encoding.NewErasure(params)
|
||||||
e.k = k
|
e.k = k
|
||||||
@ -66,7 +66,7 @@ func newEncoder(k, m uint8, technique string) (encoder, *probe.Error) {
|
|||||||
// GetEncodedBlockLen - wrapper around erasure function with the same name
|
// GetEncodedBlockLen - wrapper around erasure function with the same name
|
||||||
func (e encoder) GetEncodedBlockLen(dataLength int) (int, *probe.Error) {
|
func (e encoder) GetEncodedBlockLen(dataLength int) (int, *probe.Error) {
|
||||||
if dataLength <= 0 {
|
if dataLength <= 0 {
|
||||||
return 0, probe.New(InvalidArgument{})
|
return 0, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
return encoding.GetEncodedBlockLen(dataLength, e.k), nil
|
return encoding.GetEncodedBlockLen(dataLength, e.k), nil
|
||||||
}
|
}
|
||||||
@ -74,11 +74,11 @@ func (e encoder) GetEncodedBlockLen(dataLength int) (int, *probe.Error) {
|
|||||||
// Encode - erasure code input bytes
|
// Encode - erasure code input bytes
|
||||||
func (e encoder) Encode(data []byte) ([][]byte, *probe.Error) {
|
func (e encoder) Encode(data []byte) ([][]byte, *probe.Error) {
|
||||||
if data == nil {
|
if data == nil {
|
||||||
return nil, probe.New(InvalidArgument{})
|
return nil, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
encodedData, err := e.encoder.Encode(data)
|
encodedData, err := e.encoder.Encode(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
return encodedData, nil
|
return encodedData, nil
|
||||||
}
|
}
|
||||||
@ -86,7 +86,7 @@ func (e encoder) Encode(data []byte) ([][]byte, *probe.Error) {
|
|||||||
func (e encoder) EncodeStream(data io.Reader, size int64) ([][]byte, []byte, *probe.Error) {
|
func (e encoder) EncodeStream(data io.Reader, size int64) ([][]byte, []byte, *probe.Error) {
|
||||||
encodedData, inputData, err := e.encoder.EncodeStream(data, size)
|
encodedData, inputData, err := e.encoder.EncodeStream(data, size)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, probe.New(err)
|
return nil, nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
return encodedData, inputData, nil
|
return encodedData, inputData, nil
|
||||||
}
|
}
|
||||||
@ -95,7 +95,7 @@ func (e encoder) EncodeStream(data io.Reader, size int64) ([][]byte, []byte, *pr
|
|||||||
func (e encoder) Decode(encodedData [][]byte, dataLength int) ([]byte, *probe.Error) {
|
func (e encoder) Decode(encodedData [][]byte, dataLength int) ([]byte, *probe.Error) {
|
||||||
decodedData, err := e.encoder.Decode(encodedData, dataLength)
|
decodedData, err := e.encoder.Decode(encodedData, dataLength)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
return decodedData, nil
|
return decodedData, nil
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,7 @@ func (donut API) healBuckets() *probe.Error {
|
|||||||
defer bucketMetadataWriter.Close()
|
defer bucketMetadataWriter.Close()
|
||||||
jenc := json.NewEncoder(bucketMetadataWriter)
|
jenc := json.NewEncoder(bucketMetadataWriter)
|
||||||
if err := jenc.Encode(bucketMetadata); err != nil {
|
if err := jenc.Encode(bucketMetadata); err != nil {
|
||||||
return probe.New(err)
|
return probe.NewError(err)
|
||||||
}
|
}
|
||||||
for bucket := range bucketMetadata.Buckets {
|
for bucket := range bucketMetadata.Buckets {
|
||||||
bucketSlice := fmt.Sprintf("%s$0$%d", bucket, order) // TODO handle node slices
|
bucketSlice := fmt.Sprintf("%s$0$%d", bucket, order) // TODO handle node slices
|
||||||
|
@ -41,7 +41,7 @@ func (donut API) Info() (nodeDiskMap map[string][]string, err *probe.Error) {
|
|||||||
// AttachNode - attach node
|
// AttachNode - attach node
|
||||||
func (donut API) AttachNode(hostname string, disks []string) *probe.Error {
|
func (donut API) AttachNode(hostname string, disks []string) *probe.Error {
|
||||||
if hostname == "" || len(disks) == 0 {
|
if hostname == "" || len(disks) == 0 {
|
||||||
return probe.New(InvalidArgument{})
|
return probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
node, err := newNode(hostname)
|
node, err := newNode(hostname)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -71,7 +71,7 @@ func (donut API) DetachNode(hostname string) *probe.Error {
|
|||||||
|
|
||||||
// Rebalance - rebalance an existing donut with new disks and nodes
|
// Rebalance - rebalance an existing donut with new disks and nodes
|
||||||
func (donut API) Rebalance() *probe.Error {
|
func (donut API) Rebalance() *probe.Error {
|
||||||
return probe.New(APINotImplemented{API: "management.Rebalance"})
|
return probe.NewError(APINotImplemented{API: "management.Rebalance"})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Heal - heal your donuts
|
// Heal - heal your donuts
|
||||||
|
@ -45,10 +45,10 @@ func (donut API) NewMultipartUpload(bucket, key, contentType string, signature *
|
|||||||
defer donut.lock.Unlock()
|
defer donut.lock.Unlock()
|
||||||
|
|
||||||
if !IsValidBucket(bucket) {
|
if !IsValidBucket(bucket) {
|
||||||
return "", probe.New(BucketNameInvalid{Bucket: bucket})
|
return "", probe.NewError(BucketNameInvalid{Bucket: bucket})
|
||||||
}
|
}
|
||||||
if !IsValidObjectName(key) {
|
if !IsValidObjectName(key) {
|
||||||
return "", probe.New(ObjectNameInvalid{Object: key})
|
return "", probe.NewError(ObjectNameInvalid{Object: key})
|
||||||
}
|
}
|
||||||
if signature != nil {
|
if signature != nil {
|
||||||
ok, err := signature.DoesSignatureMatch("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")
|
ok, err := signature.DoesSignatureMatch("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")
|
||||||
@ -56,19 +56,19 @@ func (donut API) NewMultipartUpload(bucket, key, contentType string, signature *
|
|||||||
return "", err.Trace()
|
return "", err.Trace()
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return "", probe.New(SignatureDoesNotMatch{})
|
return "", probe.NewError(SignatureDoesNotMatch{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(donut.config.NodeDiskMap) > 0 {
|
if len(donut.config.NodeDiskMap) > 0 {
|
||||||
return donut.newMultipartUpload(bucket, key, contentType)
|
return donut.newMultipartUpload(bucket, key, contentType)
|
||||||
}
|
}
|
||||||
if !donut.storedBuckets.Exists(bucket) {
|
if !donut.storedBuckets.Exists(bucket) {
|
||||||
return "", probe.New(BucketNotFound{Bucket: bucket})
|
return "", probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
storedBucket := donut.storedBuckets.Get(bucket).(storedBucket)
|
storedBucket := donut.storedBuckets.Get(bucket).(storedBucket)
|
||||||
objectKey := bucket + "/" + key
|
objectKey := bucket + "/" + key
|
||||||
if _, ok := storedBucket.objectMetadata[objectKey]; ok == true {
|
if _, ok := storedBucket.objectMetadata[objectKey]; ok == true {
|
||||||
return "", probe.New(ObjectExists{Object: key})
|
return "", probe.NewError(ObjectExists{Object: key})
|
||||||
}
|
}
|
||||||
id := []byte(strconv.Itoa(rand.Int()) + bucket + key + time.Now().UTC().String())
|
id := []byte(strconv.Itoa(rand.Int()) + bucket + key + time.Now().UTC().String())
|
||||||
uploadIDSum := sha512.Sum512(id)
|
uploadIDSum := sha512.Sum512(id)
|
||||||
@ -93,10 +93,10 @@ func (donut API) AbortMultipartUpload(bucket, key, uploadID string, signature *S
|
|||||||
defer donut.lock.Unlock()
|
defer donut.lock.Unlock()
|
||||||
|
|
||||||
if !IsValidBucket(bucket) {
|
if !IsValidBucket(bucket) {
|
||||||
return probe.New(BucketNameInvalid{Bucket: bucket})
|
return probe.NewError(BucketNameInvalid{Bucket: bucket})
|
||||||
}
|
}
|
||||||
if !IsValidObjectName(key) {
|
if !IsValidObjectName(key) {
|
||||||
return probe.New(ObjectNameInvalid{Object: key})
|
return probe.NewError(ObjectNameInvalid{Object: key})
|
||||||
}
|
}
|
||||||
if signature != nil {
|
if signature != nil {
|
||||||
ok, err := signature.DoesSignatureMatch("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")
|
ok, err := signature.DoesSignatureMatch("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")
|
||||||
@ -104,18 +104,18 @@ func (donut API) AbortMultipartUpload(bucket, key, uploadID string, signature *S
|
|||||||
return err.Trace()
|
return err.Trace()
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return probe.New(SignatureDoesNotMatch{})
|
return probe.NewError(SignatureDoesNotMatch{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(donut.config.NodeDiskMap) > 0 {
|
if len(donut.config.NodeDiskMap) > 0 {
|
||||||
return donut.abortMultipartUpload(bucket, key, uploadID)
|
return donut.abortMultipartUpload(bucket, key, uploadID)
|
||||||
}
|
}
|
||||||
if !donut.storedBuckets.Exists(bucket) {
|
if !donut.storedBuckets.Exists(bucket) {
|
||||||
return probe.New(BucketNotFound{Bucket: bucket})
|
return probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
storedBucket := donut.storedBuckets.Get(bucket).(storedBucket)
|
storedBucket := donut.storedBuckets.Get(bucket).(storedBucket)
|
||||||
if storedBucket.multiPartSession[key].UploadID != uploadID {
|
if storedBucket.multiPartSession[key].UploadID != uploadID {
|
||||||
return probe.New(InvalidUploadID{UploadID: uploadID})
|
return probe.NewError(InvalidUploadID{UploadID: uploadID})
|
||||||
}
|
}
|
||||||
donut.cleanupMultipartSession(bucket, key, uploadID)
|
donut.cleanupMultipartSession(bucket, key, uploadID)
|
||||||
return nil
|
return nil
|
||||||
@ -135,10 +135,10 @@ func (donut API) CreateObjectPart(bucket, key, uploadID string, partID int, cont
|
|||||||
// createObject - internal wrapper function called by CreateObjectPart
|
// createObject - internal wrapper function called by CreateObjectPart
|
||||||
func (donut API) createObjectPart(bucket, key, uploadID string, partID int, contentType, expectedMD5Sum string, size int64, data io.Reader, signature *Signature) (string, *probe.Error) {
|
func (donut API) createObjectPart(bucket, key, uploadID string, partID int, contentType, expectedMD5Sum string, size int64, data io.Reader, signature *Signature) (string, *probe.Error) {
|
||||||
if !IsValidBucket(bucket) {
|
if !IsValidBucket(bucket) {
|
||||||
return "", probe.New(BucketNameInvalid{Bucket: bucket})
|
return "", probe.NewError(BucketNameInvalid{Bucket: bucket})
|
||||||
}
|
}
|
||||||
if !IsValidObjectName(key) {
|
if !IsValidObjectName(key) {
|
||||||
return "", probe.New(ObjectNameInvalid{Object: key})
|
return "", probe.NewError(ObjectNameInvalid{Object: key})
|
||||||
}
|
}
|
||||||
if len(donut.config.NodeDiskMap) > 0 {
|
if len(donut.config.NodeDiskMap) > 0 {
|
||||||
metadata := make(map[string]string)
|
metadata := make(map[string]string)
|
||||||
@ -151,7 +151,7 @@ func (donut API) createObjectPart(bucket, key, uploadID string, partID int, cont
|
|||||||
expectedMD5SumBytes, err := base64.StdEncoding.DecodeString(strings.TrimSpace(expectedMD5Sum))
|
expectedMD5SumBytes, err := base64.StdEncoding.DecodeString(strings.TrimSpace(expectedMD5Sum))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// pro-actively close the connection
|
// pro-actively close the connection
|
||||||
return "", probe.New(InvalidDigest{Md5: expectedMD5Sum})
|
return "", probe.NewError(InvalidDigest{Md5: expectedMD5Sum})
|
||||||
}
|
}
|
||||||
expectedMD5Sum = hex.EncodeToString(expectedMD5SumBytes)
|
expectedMD5Sum = hex.EncodeToString(expectedMD5SumBytes)
|
||||||
}
|
}
|
||||||
@ -163,12 +163,12 @@ func (donut API) createObjectPart(bucket, key, uploadID string, partID int, cont
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !donut.storedBuckets.Exists(bucket) {
|
if !donut.storedBuckets.Exists(bucket) {
|
||||||
return "", probe.New(BucketNotFound{Bucket: bucket})
|
return "", probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
strBucket := donut.storedBuckets.Get(bucket).(storedBucket)
|
strBucket := donut.storedBuckets.Get(bucket).(storedBucket)
|
||||||
// Verify upload id
|
// Verify upload id
|
||||||
if strBucket.multiPartSession[key].UploadID != uploadID {
|
if strBucket.multiPartSession[key].UploadID != uploadID {
|
||||||
return "", probe.New(InvalidUploadID{UploadID: uploadID})
|
return "", probe.NewError(InvalidUploadID{UploadID: uploadID})
|
||||||
}
|
}
|
||||||
|
|
||||||
// get object key
|
// get object key
|
||||||
@ -185,7 +185,7 @@ func (donut API) createObjectPart(bucket, key, uploadID string, partID int, cont
|
|||||||
expectedMD5SumBytes, err := base64.StdEncoding.DecodeString(strings.TrimSpace(expectedMD5Sum))
|
expectedMD5SumBytes, err := base64.StdEncoding.DecodeString(strings.TrimSpace(expectedMD5Sum))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// pro-actively close the connection
|
// pro-actively close the connection
|
||||||
return "", probe.New(InvalidDigest{Md5: expectedMD5Sum})
|
return "", probe.NewError(InvalidDigest{Md5: expectedMD5Sum})
|
||||||
}
|
}
|
||||||
expectedMD5Sum = hex.EncodeToString(expectedMD5SumBytes)
|
expectedMD5Sum = hex.EncodeToString(expectedMD5SumBytes)
|
||||||
}
|
}
|
||||||
@ -204,17 +204,17 @@ func (donut API) createObjectPart(bucket, key, uploadID string, partID int, cont
|
|||||||
sha256hash.Write(byteBuffer[0:length])
|
sha256hash.Write(byteBuffer[0:length])
|
||||||
ok := donut.multiPartObjects[uploadID].Append(partID, byteBuffer[0:length])
|
ok := donut.multiPartObjects[uploadID].Append(partID, byteBuffer[0:length])
|
||||||
if !ok {
|
if !ok {
|
||||||
return "", probe.New(InternalError{})
|
return "", probe.NewError(InternalError{})
|
||||||
}
|
}
|
||||||
totalLength += int64(length)
|
totalLength += int64(length)
|
||||||
go debug.FreeOSMemory()
|
go debug.FreeOSMemory()
|
||||||
}
|
}
|
||||||
if totalLength != size {
|
if totalLength != size {
|
||||||
donut.multiPartObjects[uploadID].Delete(partID)
|
donut.multiPartObjects[uploadID].Delete(partID)
|
||||||
return "", probe.New(IncompleteBody{Bucket: bucket, Object: key})
|
return "", probe.NewError(IncompleteBody{Bucket: bucket, Object: key})
|
||||||
}
|
}
|
||||||
if err != io.EOF {
|
if err != io.EOF {
|
||||||
return "", probe.New(err)
|
return "", probe.NewError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
md5SumBytes := hash.Sum(nil)
|
md5SumBytes := hash.Sum(nil)
|
||||||
@ -233,7 +233,7 @@ func (donut API) createObjectPart(bucket, key, uploadID string, partID int, cont
|
|||||||
return "", err.Trace()
|
return "", err.Trace()
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return "", probe.New(SignatureDoesNotMatch{})
|
return "", probe.NewError(SignatureDoesNotMatch{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -271,11 +271,11 @@ func (donut API) CompleteMultipartUpload(bucket, key, uploadID string, data io.R
|
|||||||
|
|
||||||
if !IsValidBucket(bucket) {
|
if !IsValidBucket(bucket) {
|
||||||
donut.lock.Unlock()
|
donut.lock.Unlock()
|
||||||
return ObjectMetadata{}, probe.New(BucketNameInvalid{Bucket: bucket})
|
return ObjectMetadata{}, probe.NewError(BucketNameInvalid{Bucket: bucket})
|
||||||
}
|
}
|
||||||
if !IsValidObjectName(key) {
|
if !IsValidObjectName(key) {
|
||||||
donut.lock.Unlock()
|
donut.lock.Unlock()
|
||||||
return ObjectMetadata{}, probe.New(ObjectNameInvalid{Object: key})
|
return ObjectMetadata{}, probe.NewError(ObjectNameInvalid{Object: key})
|
||||||
}
|
}
|
||||||
if len(donut.config.NodeDiskMap) > 0 {
|
if len(donut.config.NodeDiskMap) > 0 {
|
||||||
donut.lock.Unlock()
|
donut.lock.Unlock()
|
||||||
@ -284,18 +284,18 @@ func (donut API) CompleteMultipartUpload(bucket, key, uploadID string, data io.R
|
|||||||
|
|
||||||
if !donut.storedBuckets.Exists(bucket) {
|
if !donut.storedBuckets.Exists(bucket) {
|
||||||
donut.lock.Unlock()
|
donut.lock.Unlock()
|
||||||
return ObjectMetadata{}, probe.New(BucketNotFound{Bucket: bucket})
|
return ObjectMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
storedBucket := donut.storedBuckets.Get(bucket).(storedBucket)
|
storedBucket := donut.storedBuckets.Get(bucket).(storedBucket)
|
||||||
// Verify upload id
|
// Verify upload id
|
||||||
if storedBucket.multiPartSession[key].UploadID != uploadID {
|
if storedBucket.multiPartSession[key].UploadID != uploadID {
|
||||||
donut.lock.Unlock()
|
donut.lock.Unlock()
|
||||||
return ObjectMetadata{}, probe.New(InvalidUploadID{UploadID: uploadID})
|
return ObjectMetadata{}, probe.NewError(InvalidUploadID{UploadID: uploadID})
|
||||||
}
|
}
|
||||||
partBytes, err := ioutil.ReadAll(data)
|
partBytes, err := ioutil.ReadAll(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
donut.lock.Unlock()
|
donut.lock.Unlock()
|
||||||
return ObjectMetadata{}, probe.New(err)
|
return ObjectMetadata{}, probe.NewError(err)
|
||||||
}
|
}
|
||||||
if signature != nil {
|
if signature != nil {
|
||||||
ok, err := signature.DoesSignatureMatch(hex.EncodeToString(sha256.Sum256(partBytes)[:]))
|
ok, err := signature.DoesSignatureMatch(hex.EncodeToString(sha256.Sum256(partBytes)[:]))
|
||||||
@ -305,17 +305,17 @@ func (donut API) CompleteMultipartUpload(bucket, key, uploadID string, data io.R
|
|||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
donut.lock.Unlock()
|
donut.lock.Unlock()
|
||||||
return ObjectMetadata{}, probe.New(SignatureDoesNotMatch{})
|
return ObjectMetadata{}, probe.NewError(SignatureDoesNotMatch{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
parts := &CompleteMultipartUpload{}
|
parts := &CompleteMultipartUpload{}
|
||||||
if err := xml.Unmarshal(partBytes, parts); err != nil {
|
if err := xml.Unmarshal(partBytes, parts); err != nil {
|
||||||
donut.lock.Unlock()
|
donut.lock.Unlock()
|
||||||
return ObjectMetadata{}, probe.New(MalformedXML{})
|
return ObjectMetadata{}, probe.NewError(MalformedXML{})
|
||||||
}
|
}
|
||||||
if !sort.IsSorted(completedParts(parts.Part)) {
|
if !sort.IsSorted(completedParts(parts.Part)) {
|
||||||
donut.lock.Unlock()
|
donut.lock.Unlock()
|
||||||
return ObjectMetadata{}, probe.New(InvalidPartOrder{})
|
return ObjectMetadata{}, probe.NewError(InvalidPartOrder{})
|
||||||
}
|
}
|
||||||
|
|
||||||
var size int64
|
var size int64
|
||||||
@ -325,7 +325,7 @@ func (donut API) CompleteMultipartUpload(bucket, key, uploadID string, data io.R
|
|||||||
object, ok := donut.multiPartObjects[uploadID].Get(parts.Part[i].PartNumber)
|
object, ok := donut.multiPartObjects[uploadID].Get(parts.Part[i].PartNumber)
|
||||||
if ok == false {
|
if ok == false {
|
||||||
donut.lock.Unlock()
|
donut.lock.Unlock()
|
||||||
return ObjectMetadata{}, probe.New(InvalidPart{})
|
return ObjectMetadata{}, probe.NewError(InvalidPart{})
|
||||||
}
|
}
|
||||||
size += int64(len(object))
|
size += int64(len(object))
|
||||||
calcMD5Bytes := md5.Sum(object)
|
calcMD5Bytes := md5.Sum(object)
|
||||||
@ -333,15 +333,15 @@ func (donut API) CompleteMultipartUpload(bucket, key, uploadID string, data io.R
|
|||||||
recvMD5Bytes, err := hex.DecodeString(strings.Trim(recvMD5, "\""))
|
recvMD5Bytes, err := hex.DecodeString(strings.Trim(recvMD5, "\""))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
donut.lock.Unlock()
|
donut.lock.Unlock()
|
||||||
return ObjectMetadata{}, probe.New(InvalidDigest{Md5: recvMD5})
|
return ObjectMetadata{}, probe.NewError(InvalidDigest{Md5: recvMD5})
|
||||||
}
|
}
|
||||||
if !bytes.Equal(recvMD5Bytes, calcMD5Bytes[:]) {
|
if !bytes.Equal(recvMD5Bytes, calcMD5Bytes[:]) {
|
||||||
donut.lock.Unlock()
|
donut.lock.Unlock()
|
||||||
return ObjectMetadata{}, probe.New(BadDigest{})
|
return ObjectMetadata{}, probe.NewError(BadDigest{})
|
||||||
}
|
}
|
||||||
if _, err := io.Copy(&fullObject, bytes.NewBuffer(object)); err != nil {
|
if _, err := io.Copy(&fullObject, bytes.NewBuffer(object)); err != nil {
|
||||||
donut.lock.Unlock()
|
donut.lock.Unlock()
|
||||||
return ObjectMetadata{}, probe.New(err)
|
return ObjectMetadata{}, probe.NewError(err)
|
||||||
}
|
}
|
||||||
object = nil
|
object = nil
|
||||||
go debug.FreeOSMemory()
|
go debug.FreeOSMemory()
|
||||||
@ -386,12 +386,12 @@ func (donut API) ListMultipartUploads(bucket string, resources BucketMultipartRe
|
|||||||
return BucketMultipartResourcesMetadata{}, err.Trace()
|
return BucketMultipartResourcesMetadata{}, err.Trace()
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return BucketMultipartResourcesMetadata{}, probe.New(SignatureDoesNotMatch{})
|
return BucketMultipartResourcesMetadata{}, probe.NewError(SignatureDoesNotMatch{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !IsValidBucket(bucket) {
|
if !IsValidBucket(bucket) {
|
||||||
return BucketMultipartResourcesMetadata{}, probe.New(BucketNameInvalid{Bucket: bucket})
|
return BucketMultipartResourcesMetadata{}, probe.NewError(BucketNameInvalid{Bucket: bucket})
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(donut.config.NodeDiskMap) > 0 {
|
if len(donut.config.NodeDiskMap) > 0 {
|
||||||
@ -399,7 +399,7 @@ func (donut API) ListMultipartUploads(bucket string, resources BucketMultipartRe
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !donut.storedBuckets.Exists(bucket) {
|
if !donut.storedBuckets.Exists(bucket) {
|
||||||
return BucketMultipartResourcesMetadata{}, probe.New(BucketNotFound{Bucket: bucket})
|
return BucketMultipartResourcesMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
|
|
||||||
storedBucket := donut.storedBuckets.Get(bucket).(storedBucket)
|
storedBucket := donut.storedBuckets.Get(bucket).(storedBucket)
|
||||||
@ -468,15 +468,15 @@ func (donut API) ListObjectParts(bucket, key string, resources ObjectResourcesMe
|
|||||||
return ObjectResourcesMetadata{}, err.Trace()
|
return ObjectResourcesMetadata{}, err.Trace()
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return ObjectResourcesMetadata{}, probe.New(SignatureDoesNotMatch{})
|
return ObjectResourcesMetadata{}, probe.NewError(SignatureDoesNotMatch{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !IsValidBucket(bucket) {
|
if !IsValidBucket(bucket) {
|
||||||
return ObjectResourcesMetadata{}, probe.New(BucketNameInvalid{Bucket: bucket})
|
return ObjectResourcesMetadata{}, probe.NewError(BucketNameInvalid{Bucket: bucket})
|
||||||
}
|
}
|
||||||
if !IsValidObjectName(key) {
|
if !IsValidObjectName(key) {
|
||||||
return ObjectResourcesMetadata{}, probe.New(ObjectNameInvalid{Object: key})
|
return ObjectResourcesMetadata{}, probe.NewError(ObjectNameInvalid{Object: key})
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(donut.config.NodeDiskMap) > 0 {
|
if len(donut.config.NodeDiskMap) > 0 {
|
||||||
@ -484,14 +484,14 @@ func (donut API) ListObjectParts(bucket, key string, resources ObjectResourcesMe
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !donut.storedBuckets.Exists(bucket) {
|
if !donut.storedBuckets.Exists(bucket) {
|
||||||
return ObjectResourcesMetadata{}, probe.New(BucketNotFound{Bucket: bucket})
|
return ObjectResourcesMetadata{}, probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
storedBucket := donut.storedBuckets.Get(bucket).(storedBucket)
|
storedBucket := donut.storedBuckets.Get(bucket).(storedBucket)
|
||||||
if _, ok := storedBucket.multiPartSession[key]; ok == false {
|
if _, ok := storedBucket.multiPartSession[key]; ok == false {
|
||||||
return ObjectResourcesMetadata{}, probe.New(ObjectNotFound{Object: key})
|
return ObjectResourcesMetadata{}, probe.NewError(ObjectNotFound{Object: key})
|
||||||
}
|
}
|
||||||
if storedBucket.multiPartSession[key].UploadID != resources.UploadID {
|
if storedBucket.multiPartSession[key].UploadID != resources.UploadID {
|
||||||
return ObjectResourcesMetadata{}, probe.New(InvalidUploadID{UploadID: resources.UploadID})
|
return ObjectResourcesMetadata{}, probe.NewError(InvalidUploadID{UploadID: resources.UploadID})
|
||||||
}
|
}
|
||||||
storedParts := storedBucket.partMetadata[key]
|
storedParts := storedBucket.partMetadata[key]
|
||||||
objectResourcesMetadata := resources
|
objectResourcesMetadata := resources
|
||||||
@ -515,7 +515,7 @@ func (donut API) ListObjectParts(bucket, key string, resources ObjectResourcesMe
|
|||||||
}
|
}
|
||||||
part, ok := storedParts[i]
|
part, ok := storedParts[i]
|
||||||
if !ok {
|
if !ok {
|
||||||
return ObjectResourcesMetadata{}, probe.New(InvalidPart{})
|
return ObjectResourcesMetadata{}, probe.NewError(InvalidPart{})
|
||||||
}
|
}
|
||||||
parts = append(parts, &part)
|
parts = append(parts, &part)
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ type node struct {
|
|||||||
// newNode - instantiates a new node
|
// newNode - instantiates a new node
|
||||||
func newNode(hostname string) (node, *probe.Error) {
|
func newNode(hostname string) (node, *probe.Error) {
|
||||||
if hostname == "" {
|
if hostname == "" {
|
||||||
return node{}, probe.New(InvalidArgument{})
|
return node{}, probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
disks := make(map[int]disk.Disk)
|
disks := make(map[int]disk.Disk)
|
||||||
n := node{
|
n := node{
|
||||||
@ -53,7 +53,7 @@ func (n node) ListDisks() (map[int]disk.Disk, *probe.Error) {
|
|||||||
// AttachDisk - attach a disk
|
// AttachDisk - attach a disk
|
||||||
func (n node) AttachDisk(disk disk.Disk, diskOrder int) *probe.Error {
|
func (n node) AttachDisk(disk disk.Disk, diskOrder int) *probe.Error {
|
||||||
if diskOrder < 0 {
|
if diskOrder < 0 {
|
||||||
return probe.New(InvalidArgument{})
|
return probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
n.disks[diskOrder] = disk
|
n.disks[diskOrder] = disk
|
||||||
return nil
|
return nil
|
||||||
@ -67,10 +67,10 @@ func (n node) DetachDisk(diskOrder int) *probe.Error {
|
|||||||
|
|
||||||
// SaveConfig - save node configuration
|
// SaveConfig - save node configuration
|
||||||
func (n node) SaveConfig() *probe.Error {
|
func (n node) SaveConfig() *probe.Error {
|
||||||
return probe.New(NotImplemented{Function: "SaveConfig"})
|
return probe.NewError(NotImplemented{Function: "SaveConfig"})
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoadConfig - load node configuration from saved configs
|
// LoadConfig - load node configuration from saved configs
|
||||||
func (n node) LoadConfig() *probe.Error {
|
func (n node) LoadConfig() *probe.Error {
|
||||||
return probe.New(NotImplemented{Function: "LoadConfig"})
|
return probe.NewError(NotImplemented{Function: "LoadConfig"})
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,7 @@ func urlEncodeName(name string) (string, *probe.Error) {
|
|||||||
default:
|
default:
|
||||||
len := utf8.RuneLen(s)
|
len := utf8.RuneLen(s)
|
||||||
if len < 0 {
|
if len < 0 {
|
||||||
return "", probe.New(InvalidArgument{})
|
return "", probe.NewError(InvalidArgument{})
|
||||||
}
|
}
|
||||||
u := make([]byte, len)
|
u := make([]byte, len)
|
||||||
utf8.EncodeRune(u, s)
|
utf8.EncodeRune(u, s)
|
||||||
@ -220,12 +220,12 @@ func (r *Signature) DoesSignatureMatch(hashedPayload string) (bool, *probe.Error
|
|||||||
var date string
|
var date string
|
||||||
if date = r.Request.Header.Get(http.CanonicalHeaderKey("x-amz-date")); date == "" {
|
if date = r.Request.Header.Get(http.CanonicalHeaderKey("x-amz-date")); date == "" {
|
||||||
if date = r.Request.Header.Get("Date"); date == "" {
|
if date = r.Request.Header.Get("Date"); date == "" {
|
||||||
return false, probe.New(MissingDateHeader{})
|
return false, probe.NewError(MissingDateHeader{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
t, err := time.Parse(iso8601Format, date)
|
t, err := time.Parse(iso8601Format, date)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, probe.New(err)
|
return false, probe.NewError(err)
|
||||||
}
|
}
|
||||||
canonicalRequest := r.getCanonicalRequest()
|
canonicalRequest := r.getCanonicalRequest()
|
||||||
stringToSign := r.getStringToSign(canonicalRequest, t)
|
stringToSign := r.getStringToSign(canonicalRequest, t)
|
||||||
|
@ -66,11 +66,11 @@ type Error struct {
|
|||||||
tracePoints []tracePoint
|
tracePoints []tracePoint
|
||||||
}
|
}
|
||||||
|
|
||||||
// New function instantiates an error probe for tracing. Original errors.error (golang's error
|
// NewError function instantiates an error probe for tracing. Original errors.error (golang's error
|
||||||
// interface) is injected in only once during this New call. Rest of the time, you
|
// interface) is injected in only once during this New call. Rest of the time, you
|
||||||
// trace the return path with Probe.Trace and finally handle reporting or quitting
|
// trace the return path with Probe.Trace and finally handle reporting or quitting
|
||||||
// at the top level.
|
// at the top level.
|
||||||
func New(e error) *Error {
|
func NewError(e error) *Error {
|
||||||
if e == nil {
|
if e == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -124,17 +124,9 @@ func (e *Error) Untrace() {
|
|||||||
e.tracePoints = e.tracePoints[:l-1]
|
e.tracePoints = e.tracePoints[:l-1]
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error returns error string.
|
|
||||||
func (e *Error) Error() string {
|
|
||||||
if e == nil {
|
|
||||||
return "<nil>"
|
|
||||||
}
|
|
||||||
return e.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns error message.
|
// String returns error message.
|
||||||
func (e *Error) String() string {
|
func (e *Error) String() string {
|
||||||
if e == nil {
|
if e == nil || e.e == nil {
|
||||||
return "<nil>"
|
return "<nil>"
|
||||||
}
|
}
|
||||||
e.lock.RLock()
|
e.lock.RLock()
|
||||||
@ -164,7 +156,7 @@ func (e *Error) String() string {
|
|||||||
|
|
||||||
// JSON returns JSON formated error trace.
|
// JSON returns JSON formated error trace.
|
||||||
func (e *Error) JSON() string {
|
func (e *Error) JSON() string {
|
||||||
if e == nil {
|
if e == nil || e.e == nil {
|
||||||
return "<nil>"
|
return "<nil>"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -187,8 +179,38 @@ func (e *Error) JSON() string {
|
|||||||
return string(jBytes)
|
return string(jBytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToError returns original emnedded error.
|
// ToError returns original embedded error.
|
||||||
func (e *Error) ToError() error {
|
func (e *Error) ToError() error {
|
||||||
// No need to lock. "e.e" is set once during New and never changed.
|
// No need to lock. "e.e" is set once during New and never changed.
|
||||||
return e.e
|
return e.e
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WrappedError implements container for *probe.Error
|
||||||
|
type WrappedError struct {
|
||||||
|
err *Error
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewWrappedError function wraps a *probe.Error into a 'error' compatible duck type
|
||||||
|
func NewWrappedError(err *Error) error {
|
||||||
|
return &WrappedError{err: err}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error interface method
|
||||||
|
func (w *WrappedError) Error() string {
|
||||||
|
return w.err.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToError get the *probe.Error embedded internally
|
||||||
|
func (w *WrappedError) ToError() *Error {
|
||||||
|
return w.err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToWrappedError try to convert generic 'error' into typed *WrappedError, returns true if yes, false otherwise
|
||||||
|
func ToWrappedError(err error) (*WrappedError, bool) {
|
||||||
|
switch e := err.(type) {
|
||||||
|
case *WrappedError:
|
||||||
|
return e, true
|
||||||
|
default:
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -13,33 +13,41 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package probe
|
package probe_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/minio/minio/pkg/probe"
|
||||||
|
. "gopkg.in/check.v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testDummy() *Error {
|
func Test(t *testing.T) { TestingT(t) }
|
||||||
_, e := os.Stat("this-file-cannot-exit-234234232423423")
|
|
||||||
es := New(e)
|
type MySuite struct{}
|
||||||
es.Trace("this is hell", "asdf")
|
|
||||||
|
var _ = Suite(&MySuite{})
|
||||||
|
|
||||||
|
func testDummy() *probe.Error {
|
||||||
|
_, e := os.Stat("this-file-cannot-exit")
|
||||||
|
es := probe.NewError(e)
|
||||||
|
es.Trace("Important info 1", "Import into 2")
|
||||||
return es
|
return es
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestProbe(t *testing.T) {
|
func (s *MySuite) TestProbe(c *C) {
|
||||||
es := testDummy()
|
es := testDummy()
|
||||||
if es == nil {
|
c.Assert(es, Not(Equals), nil)
|
||||||
t.Fail()
|
|
||||||
}
|
|
||||||
|
|
||||||
newES := es.Trace()
|
newES := es.Trace()
|
||||||
if newES == nil {
|
c.Assert(newES, Not(Equals), nil)
|
||||||
t.Fail()
|
}
|
||||||
}
|
|
||||||
/*
|
func (s *MySuite) TestWrappedError(c *C) {
|
||||||
fmt.Println(es)
|
_, e := os.Stat("this-file-cannot-exit")
|
||||||
fmt.Println(es.JSON())
|
es := probe.NewError(e) // *probe.Error
|
||||||
fmt.Println(es.ToError())
|
e = probe.NewWrappedError(es) // *probe.WrappedError
|
||||||
*/
|
_, ok := probe.ToWrappedError(e)
|
||||||
|
c.Assert(ok, Equals, true)
|
||||||
}
|
}
|
||||||
|
@ -52,17 +52,17 @@ type config struct {
|
|||||||
// CheckData - checks the validity of config data. Data sould be of type struct and contain a string type field called "Version"
|
// CheckData - checks the validity of config data. Data sould be of type struct and contain a string type field called "Version"
|
||||||
func CheckData(data interface{}) *probe.Error {
|
func CheckData(data interface{}) *probe.Error {
|
||||||
if !structs.IsStruct(data) {
|
if !structs.IsStruct(data) {
|
||||||
return probe.New(fmt.Errorf("Invalid argument type. Expecing \"struct\" type."))
|
return probe.NewError(fmt.Errorf("Invalid argument type. Expecing \"struct\" type."))
|
||||||
}
|
}
|
||||||
|
|
||||||
st := structs.New(data)
|
st := structs.New(data)
|
||||||
f, ok := st.FieldOk("Version")
|
f, ok := st.FieldOk("Version")
|
||||||
if !ok {
|
if !ok {
|
||||||
return probe.New(fmt.Errorf("Invalid type of struct argument. No [%s.Version] field found.", st.Name()))
|
return probe.NewError(fmt.Errorf("Invalid type of struct argument. No [%s.Version] field found.", st.Name()))
|
||||||
}
|
}
|
||||||
|
|
||||||
if f.Kind() != reflect.String {
|
if f.Kind() != reflect.String {
|
||||||
return probe.New(fmt.Errorf("Invalid type of struct argument. Expecting \"string\" type [%s.Version] field.", st.Name()))
|
return probe.NewError(fmt.Errorf("Invalid type of struct argument. Expecting \"string\" type [%s.Version] field.", st.Name()))
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@ -111,7 +111,7 @@ func (d config) Save(filename string) *probe.Error {
|
|||||||
|
|
||||||
jsonData, err := json.MarshalIndent(d.data, "", "\t")
|
jsonData, err := json.MarshalIndent(d.data, "", "\t")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return probe.New(err)
|
return probe.NewError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if runtime.GOOS == "windows" {
|
if runtime.GOOS == "windows" {
|
||||||
@ -120,7 +120,7 @@ func (d config) Save(filename string) *probe.Error {
|
|||||||
|
|
||||||
err = ioutil.WriteFile(filename, jsonData, 0600)
|
err = ioutil.WriteFile(filename, jsonData, 0600)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return probe.New(err)
|
return probe.NewError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@ -133,12 +133,12 @@ func (d *config) Load(filename string) *probe.Error {
|
|||||||
|
|
||||||
_, err := os.Stat(filename)
|
_, err := os.Stat(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return probe.New(err)
|
return probe.NewError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fileData, err := ioutil.ReadFile(filename)
|
fileData, err := ioutil.ReadFile(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return probe.New(err)
|
return probe.NewError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if runtime.GOOS == "windows" {
|
if runtime.GOOS == "windows" {
|
||||||
@ -147,7 +147,7 @@ func (d *config) Load(filename string) *probe.Error {
|
|||||||
|
|
||||||
err = json.Unmarshal(fileData, (*d).data)
|
err = json.Unmarshal(fileData, (*d).data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return probe.New(err)
|
return probe.NewError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := CheckData(*(*d).data); err != nil {
|
if err := CheckData(*(*d).data); err != nil {
|
||||||
@ -157,11 +157,11 @@ func (d *config) Load(filename string) *probe.Error {
|
|||||||
st := structs.New(*(*d).data)
|
st := structs.New(*(*d).data)
|
||||||
f, ok := st.FieldOk("Version")
|
f, ok := st.FieldOk("Version")
|
||||||
if !ok {
|
if !ok {
|
||||||
return probe.New(fmt.Errorf("Argument struct [%s] does not contain field \"Version\".", st.Name()))
|
return probe.NewError(fmt.Errorf("Argument struct [%s] does not contain field \"Version\".", st.Name()))
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*d).Version() != f.Value() {
|
if (*d).Version() != f.Value() {
|
||||||
return probe.New(fmt.Errorf("Version mismatch"))
|
return probe.NewError(fmt.Errorf("Version mismatch"))
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -24,7 +24,6 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/minio/minio/pkg/probe"
|
|
||||||
"github.com/minio/minio/pkg/utils/log"
|
"github.com/minio/minio/pkg/utils/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -99,12 +98,12 @@ func fileLogger(filename string) (chan<- []byte, error) {
|
|||||||
ch := make(chan []byte)
|
ch := make(chan []byte)
|
||||||
file, err := os.OpenFile(filename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
|
file, err := os.OpenFile(filename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, err
|
||||||
}
|
}
|
||||||
go func() {
|
go func() {
|
||||||
for message := range ch {
|
for message := range ch {
|
||||||
if _, err := io.Copy(file, bytes.NewBuffer(message)); err != nil {
|
if _, err := io.Copy(file, bytes.NewBuffer(message)); err != nil {
|
||||||
log.Errorln(probe.New(err))
|
log.Errorln(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
@ -41,7 +41,7 @@ func (r *httpRange) String() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Grab new range from request header
|
// Grab new range from request header
|
||||||
func getRequestedRange(hrange string, size int64) (*httpRange, error) {
|
func getRequestedRange(hrange string, size int64) (*httpRange, *probe.Error) {
|
||||||
r := &httpRange{
|
r := &httpRange{
|
||||||
start: 0,
|
start: 0,
|
||||||
length: 0,
|
length: 0,
|
||||||
@ -51,16 +51,16 @@ func getRequestedRange(hrange string, size int64) (*httpRange, error) {
|
|||||||
if hrange != "" {
|
if hrange != "" {
|
||||||
err := r.parseRange(hrange)
|
err := r.parseRange(hrange)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, err.Trace()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return r, nil
|
return r, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *httpRange) parse(ra string) error {
|
func (r *httpRange) parse(ra string) *probe.Error {
|
||||||
i := strings.Index(ra, "-")
|
i := strings.Index(ra, "-")
|
||||||
if i < 0 {
|
if i < 0 {
|
||||||
return probe.New(donut.InvalidRange{})
|
return probe.NewError(donut.InvalidRange{})
|
||||||
}
|
}
|
||||||
start, end := strings.TrimSpace(ra[:i]), strings.TrimSpace(ra[i+1:])
|
start, end := strings.TrimSpace(ra[:i]), strings.TrimSpace(ra[i+1:])
|
||||||
if start == "" {
|
if start == "" {
|
||||||
@ -68,7 +68,7 @@ func (r *httpRange) parse(ra string) error {
|
|||||||
// range start relative to the end of the file.
|
// range start relative to the end of the file.
|
||||||
i, err := strconv.ParseInt(end, 10, 64)
|
i, err := strconv.ParseInt(end, 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return probe.New(donut.InvalidRange{})
|
return probe.NewError(donut.InvalidRange{})
|
||||||
}
|
}
|
||||||
if i > r.size {
|
if i > r.size {
|
||||||
i = r.size
|
i = r.size
|
||||||
@ -78,7 +78,7 @@ func (r *httpRange) parse(ra string) error {
|
|||||||
} else {
|
} else {
|
||||||
i, err := strconv.ParseInt(start, 10, 64)
|
i, err := strconv.ParseInt(start, 10, 64)
|
||||||
if err != nil || i > r.size || i < 0 {
|
if err != nil || i > r.size || i < 0 {
|
||||||
return probe.New(donut.InvalidRange{})
|
return probe.NewError(donut.InvalidRange{})
|
||||||
}
|
}
|
||||||
r.start = i
|
r.start = i
|
||||||
if end == "" {
|
if end == "" {
|
||||||
@ -87,7 +87,7 @@ func (r *httpRange) parse(ra string) error {
|
|||||||
} else {
|
} else {
|
||||||
i, err := strconv.ParseInt(end, 10, 64)
|
i, err := strconv.ParseInt(end, 10, 64)
|
||||||
if err != nil || r.start > i {
|
if err != nil || r.start > i {
|
||||||
return probe.New(donut.InvalidRange{})
|
return probe.NewError(donut.InvalidRange{})
|
||||||
}
|
}
|
||||||
if i >= r.size {
|
if i >= r.size {
|
||||||
i = r.size - 1
|
i = r.size - 1
|
||||||
@ -99,26 +99,26 @@ func (r *httpRange) parse(ra string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// parseRange parses a Range header string as per RFC 2616.
|
// parseRange parses a Range header string as per RFC 2616.
|
||||||
func (r *httpRange) parseRange(s string) error {
|
func (r *httpRange) parseRange(s string) *probe.Error {
|
||||||
if s == "" {
|
if s == "" {
|
||||||
return probe.New(errors.New("header not present"))
|
return probe.NewError(errors.New("header not present"))
|
||||||
}
|
}
|
||||||
if !strings.HasPrefix(s, b) {
|
if !strings.HasPrefix(s, b) {
|
||||||
return probe.New(donut.InvalidRange{})
|
return probe.NewError(donut.InvalidRange{})
|
||||||
}
|
}
|
||||||
|
|
||||||
ras := strings.Split(s[len(b):], ",")
|
ras := strings.Split(s[len(b):], ",")
|
||||||
if len(ras) == 0 {
|
if len(ras) == 0 {
|
||||||
return probe.New(errors.New("invalid request"))
|
return probe.NewError(errors.New("invalid request"))
|
||||||
}
|
}
|
||||||
// Just pick the first one and ignore the rest, we only support one range per object
|
// Just pick the first one and ignore the rest, we only support one range per object
|
||||||
if len(ras) > 1 {
|
if len(ras) > 1 {
|
||||||
return probe.New(errors.New("multiple ranges specified"))
|
return probe.NewError(errors.New("multiple ranges specified"))
|
||||||
}
|
}
|
||||||
|
|
||||||
ra := strings.TrimSpace(ras[0])
|
ra := strings.TrimSpace(ras[0])
|
||||||
if ra == "" {
|
if ra == "" {
|
||||||
return probe.New(donut.InvalidRange{})
|
return probe.NewError(donut.InvalidRange{})
|
||||||
}
|
}
|
||||||
return r.parse(ra)
|
return r.parse(ra)
|
||||||
}
|
}
|
||||||
|
@ -72,7 +72,7 @@ func InitSignatureV4(req *http.Request) (*donut.Signature, *probe.Error) {
|
|||||||
var err error
|
var err error
|
||||||
accessKeyID, err = StripAccessKeyID(ah)
|
accessKeyID, err = StripAccessKeyID(ah)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
authConfig, err := auth.LoadConfig()
|
authConfig, err := auth.LoadConfig()
|
||||||
@ -80,7 +80,7 @@ func InitSignatureV4(req *http.Request) (*donut.Signature, *probe.Error) {
|
|||||||
return nil, err.Trace()
|
return nil, err.Trace()
|
||||||
}
|
}
|
||||||
if _, ok := authConfig.Users[accessKeyID]; !ok {
|
if _, ok := authConfig.Users[accessKeyID]; !ok {
|
||||||
return nil, probe.New(errors.New("AccessID not found"))
|
return nil, probe.NewError(errors.New("AccessID not found"))
|
||||||
}
|
}
|
||||||
signature := &donut.Signature{
|
signature := &donut.Signature{
|
||||||
AccessKeyID: authConfig.Users[accessKeyID].AccessKeyID,
|
AccessKeyID: authConfig.Users[accessKeyID].AccessKeyID,
|
||||||
|
@ -52,8 +52,8 @@ func (s *MyAPIDonutCacheSuite) SetUpSuite(c *C) {
|
|||||||
conf.Version = "0.0.1"
|
conf.Version = "0.0.1"
|
||||||
conf.MaxSize = 100000
|
conf.MaxSize = 100000
|
||||||
donut.SetDonutConfigPath(filepath.Join(root, "donut.json"))
|
donut.SetDonutConfigPath(filepath.Join(root, "donut.json"))
|
||||||
err = donut.SaveConfig(conf)
|
perr := donut.SaveConfig(conf)
|
||||||
c.Assert(err, IsNil)
|
c.Assert(perr, IsNil)
|
||||||
|
|
||||||
httpHandler, minioAPI := getAPIHandler(api.Config{RateLimit: 16})
|
httpHandler, minioAPI := getAPIHandler(api.Config{RateLimit: 16})
|
||||||
go startTM(minioAPI)
|
go startTM(minioAPI)
|
||||||
|
@ -71,8 +71,8 @@ func (s *MyAPIDonutSuite) SetUpSuite(c *C) {
|
|||||||
conf.NodeDiskMap = createTestNodeDiskMap(root)
|
conf.NodeDiskMap = createTestNodeDiskMap(root)
|
||||||
conf.MaxSize = 100000
|
conf.MaxSize = 100000
|
||||||
donut.SetDonutConfigPath(filepath.Join(root, "donut.json"))
|
donut.SetDonutConfigPath(filepath.Join(root, "donut.json"))
|
||||||
err = donut.SaveConfig(conf)
|
perr := donut.SaveConfig(conf)
|
||||||
c.Assert(err, IsNil)
|
c.Assert(perr, IsNil)
|
||||||
|
|
||||||
httpHandler, minioAPI := getAPIHandler(api.Config{RateLimit: 16})
|
httpHandler, minioAPI := getAPIHandler(api.Config{RateLimit: 16})
|
||||||
go startTM(minioAPI)
|
go startTM(minioAPI)
|
||||||
|
@ -60,13 +60,13 @@ func (s *MyAPISignatureV4Suite) SetUpSuite(c *C) {
|
|||||||
conf.NodeDiskMap = createTestNodeDiskMap(root)
|
conf.NodeDiskMap = createTestNodeDiskMap(root)
|
||||||
conf.MaxSize = 100000
|
conf.MaxSize = 100000
|
||||||
donut.SetDonutConfigPath(filepath.Join(root, "donut.json"))
|
donut.SetDonutConfigPath(filepath.Join(root, "donut.json"))
|
||||||
err = donut.SaveConfig(conf)
|
perr := donut.SaveConfig(conf)
|
||||||
c.Assert(err, IsNil)
|
c.Assert(perr, IsNil)
|
||||||
|
|
||||||
accessKeyID, err := auth.GenerateAccessKeyID()
|
accessKeyID, perr := auth.GenerateAccessKeyID()
|
||||||
c.Assert(err, IsNil)
|
c.Assert(perr, IsNil)
|
||||||
secretAccessKey, err := auth.GenerateSecretAccessKey()
|
secretAccessKey, perr := auth.GenerateSecretAccessKey()
|
||||||
c.Assert(err, IsNil)
|
c.Assert(perr, IsNil)
|
||||||
|
|
||||||
authConf := &auth.Config{}
|
authConf := &auth.Config{}
|
||||||
authConf.Users = make(map[string]*auth.User)
|
authConf.Users = make(map[string]*auth.User)
|
||||||
@ -79,8 +79,8 @@ func (s *MyAPISignatureV4Suite) SetUpSuite(c *C) {
|
|||||||
s.secretAccessKey = string(secretAccessKey)
|
s.secretAccessKey = string(secretAccessKey)
|
||||||
|
|
||||||
auth.SetAuthConfigPath(filepath.Join(root, "users.json"))
|
auth.SetAuthConfigPath(filepath.Join(root, "users.json"))
|
||||||
err = auth.SaveConfig(authConf)
|
perr = auth.SaveConfig(authConf)
|
||||||
c.Assert(err, IsNil)
|
c.Assert(perr, IsNil)
|
||||||
|
|
||||||
httpHandler, minioAPI := getAPIHandler(api.Config{RateLimit: 16})
|
httpHandler, minioAPI := getAPIHandler(api.Config{RateLimit: 16})
|
||||||
go startTM(minioAPI)
|
go startTM(minioAPI)
|
||||||
|
@ -41,7 +41,7 @@ type app struct {
|
|||||||
listeners []net.Listener
|
listeners []net.Listener
|
||||||
sds []httpdown.Server
|
sds []httpdown.Server
|
||||||
net *minNet
|
net *minNet
|
||||||
errors chan error
|
errors chan *probe.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// listen initailize listeners
|
// listen initailize listeners
|
||||||
@ -79,7 +79,7 @@ func (a *app) wait() {
|
|||||||
go func(s httpdown.Server) {
|
go func(s httpdown.Server) {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
if err := s.Wait(); err != nil {
|
if err := s.Wait(); err != nil {
|
||||||
a.errors <- probe.New(err)
|
a.errors <- probe.NewError(err)
|
||||||
}
|
}
|
||||||
}(s)
|
}(s)
|
||||||
}
|
}
|
||||||
@ -101,7 +101,7 @@ func (a *app) trapSignal(wg *sync.WaitGroup) {
|
|||||||
go func(s httpdown.Server) {
|
go func(s httpdown.Server) {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
if err := s.Stop(); err != nil {
|
if err := s.Stop(); err != nil {
|
||||||
a.errors <- probe.New(err)
|
a.errors <- probe.NewError(err)
|
||||||
}
|
}
|
||||||
}(s)
|
}(s)
|
||||||
}
|
}
|
||||||
@ -112,7 +112,7 @@ func (a *app) trapSignal(wg *sync.WaitGroup) {
|
|||||||
// we only return here if there's an error, otherwise the new process
|
// we only return here if there's an error, otherwise the new process
|
||||||
// will send us a TERM when it's ready to trigger the actual shutdown.
|
// will send us a TERM when it's ready to trigger the actual shutdown.
|
||||||
if _, err := a.net.StartProcess(); err != nil {
|
if _, err := a.net.StartProcess(); err != nil {
|
||||||
a.errors <- probe.New(err)
|
a.errors <- err.Trace()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -129,7 +129,7 @@ func ListenAndServe(servers ...*http.Server) *probe.Error {
|
|||||||
listeners: make([]net.Listener, 0, len(servers)),
|
listeners: make([]net.Listener, 0, len(servers)),
|
||||||
sds: make([]httpdown.Server, 0, len(servers)),
|
sds: make([]httpdown.Server, 0, len(servers)),
|
||||||
net: &minNet{},
|
net: &minNet{},
|
||||||
errors: make(chan error, 1+(len(servers)*2)),
|
errors: make(chan *probe.Error, 1+(len(servers)*2)),
|
||||||
}
|
}
|
||||||
|
|
||||||
// Acquire Listeners
|
// Acquire Listeners
|
||||||
@ -143,7 +143,7 @@ func ListenAndServe(servers ...*http.Server) *probe.Error {
|
|||||||
// Close the parent if we inherited and it wasn't init that started us.
|
// Close the parent if we inherited and it wasn't init that started us.
|
||||||
if os.Getenv("LISTEN_FDS") != "" && ppid != 1 {
|
if os.Getenv("LISTEN_FDS") != "" && ppid != 1 {
|
||||||
if err := syscall.Kill(ppid, syscall.SIGTERM); err != nil {
|
if err := syscall.Kill(ppid, syscall.SIGTERM); err != nil {
|
||||||
return probe.New(err)
|
return probe.NewError(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,7 +160,7 @@ func ListenAndServe(servers ...*http.Server) *probe.Error {
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
panic("unexpected nil error")
|
panic("unexpected nil error")
|
||||||
}
|
}
|
||||||
return probe.New(err)
|
return err.Trace()
|
||||||
case <-waitdone:
|
case <-waitdone:
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -176,7 +176,7 @@ func ListenAndServeLimited(connLimit int, servers ...*http.Server) *probe.Error
|
|||||||
listeners: make([]net.Listener, 0, len(servers)),
|
listeners: make([]net.Listener, 0, len(servers)),
|
||||||
sds: make([]httpdown.Server, 0, len(servers)),
|
sds: make([]httpdown.Server, 0, len(servers)),
|
||||||
net: &minNet{connLimit: connLimit},
|
net: &minNet{connLimit: connLimit},
|
||||||
errors: make(chan error, 1+(len(servers)*2)),
|
errors: make(chan *probe.Error, 1+(len(servers)*2)),
|
||||||
}
|
}
|
||||||
|
|
||||||
// Acquire Listeners
|
// Acquire Listeners
|
||||||
@ -190,7 +190,7 @@ func ListenAndServeLimited(connLimit int, servers ...*http.Server) *probe.Error
|
|||||||
// Close the parent if we inherited and it wasn't init that started us.
|
// Close the parent if we inherited and it wasn't init that started us.
|
||||||
if os.Getenv("LISTEN_FDS") != "" && ppid != 1 {
|
if os.Getenv("LISTEN_FDS") != "" && ppid != 1 {
|
||||||
if err := syscall.Kill(ppid, syscall.SIGTERM); err != nil {
|
if err := syscall.Kill(ppid, syscall.SIGTERM); err != nil {
|
||||||
return probe.New(err)
|
return probe.NewError(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -207,7 +207,7 @@ func ListenAndServeLimited(connLimit int, servers ...*http.Server) *probe.Error
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
panic("unexpected nil error")
|
panic("unexpected nil error")
|
||||||
}
|
}
|
||||||
return probe.New(err)
|
return err.Trace()
|
||||||
case <-waitdone:
|
case <-waitdone:
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -82,7 +82,7 @@ func (n *minNet) getInheritedListeners() *probe.Error {
|
|||||||
}
|
}
|
||||||
count, err := strconv.Atoi(countStr)
|
count, err := strconv.Atoi(countStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
retErr = probe.New(fmt.Errorf("found invalid count value: %s=%s", envCountKey, countStr))
|
retErr = probe.NewError(fmt.Errorf("found invalid count value: %s=%s", envCountKey, countStr))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,18 +92,18 @@ func (n *minNet) getInheritedListeners() *probe.Error {
|
|||||||
l, err := net.FileListener(file)
|
l, err := net.FileListener(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
file.Close()
|
file.Close()
|
||||||
retErr = probe.New(err)
|
retErr = probe.NewError(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if err := file.Close(); err != nil {
|
if err := file.Close(); err != nil {
|
||||||
retErr = probe.New(err)
|
retErr = probe.NewError(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
n.inheritedListeners = append(n.inheritedListeners, l)
|
n.inheritedListeners = append(n.inheritedListeners, l)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
if retErr != nil {
|
if retErr != nil {
|
||||||
return probe.New(retErr)
|
return retErr.Trace()
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -115,17 +115,17 @@ func (n *minNet) getInheritedListeners() *probe.Error {
|
|||||||
func (n *minNet) Listen(nett, laddr string) (net.Listener, *probe.Error) {
|
func (n *minNet) Listen(nett, laddr string) (net.Listener, *probe.Error) {
|
||||||
switch nett {
|
switch nett {
|
||||||
default:
|
default:
|
||||||
return nil, probe.New(net.UnknownNetworkError(nett))
|
return nil, probe.NewError(net.UnknownNetworkError(nett))
|
||||||
case "tcp", "tcp4", "tcp6":
|
case "tcp", "tcp4", "tcp6":
|
||||||
addr, err := net.ResolveTCPAddr(nett, laddr)
|
addr, err := net.ResolveTCPAddr(nett, laddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
return n.ListenTCP(nett, addr)
|
return n.ListenTCP(nett, addr)
|
||||||
case "unix", "unixpacket":
|
case "unix", "unixpacket":
|
||||||
addr, err := net.ResolveUnixAddr(nett, laddr)
|
addr, err := net.ResolveUnixAddr(nett, laddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
return n.ListenUnix(nett, addr)
|
return n.ListenUnix(nett, addr)
|
||||||
}
|
}
|
||||||
@ -158,7 +158,7 @@ func (n *minNet) ListenTCP(nett string, laddr *net.TCPAddr) (net.Listener, *prob
|
|||||||
// make a fresh listener
|
// make a fresh listener
|
||||||
l, err := net.ListenTCP(nett, laddr)
|
l, err := net.ListenTCP(nett, laddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
n.activeListeners = append(n.activeListeners, rateLimitedListener(l, n.connLimit))
|
n.activeListeners = append(n.activeListeners, rateLimitedListener(l, n.connLimit))
|
||||||
return l, nil
|
return l, nil
|
||||||
@ -191,7 +191,7 @@ func (n *minNet) ListenUnix(nett string, laddr *net.UnixAddr) (net.Listener, *pr
|
|||||||
// make a fresh listener
|
// make a fresh listener
|
||||||
l, err := net.ListenUnix(nett, laddr)
|
l, err := net.ListenUnix(nett, laddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
n.activeListeners = append(n.activeListeners, rateLimitedListener(l, n.connLimit))
|
n.activeListeners = append(n.activeListeners, rateLimitedListener(l, n.connLimit))
|
||||||
return l, nil
|
return l, nil
|
||||||
@ -240,7 +240,7 @@ func (n *minNet) StartProcess() (int, *probe.Error) {
|
|||||||
var err error
|
var err error
|
||||||
files[i], err = l.(fileListener).File()
|
files[i], err = l.(fileListener).File()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, probe.New(err)
|
return 0, probe.NewError(err)
|
||||||
}
|
}
|
||||||
defer files[i].Close()
|
defer files[i].Close()
|
||||||
}
|
}
|
||||||
@ -249,7 +249,7 @@ func (n *minNet) StartProcess() (int, *probe.Error) {
|
|||||||
// the file it points to has been changed we will use the updated symlink.
|
// the file it points to has been changed we will use the updated symlink.
|
||||||
argv0, err := exec.LookPath(os.Args[0])
|
argv0, err := exec.LookPath(os.Args[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, probe.New(err)
|
return 0, probe.NewError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pass on the environment and replace the old count key with the new one.
|
// Pass on the environment and replace the old count key with the new one.
|
||||||
@ -268,7 +268,7 @@ func (n *minNet) StartProcess() (int, *probe.Error) {
|
|||||||
Files: allFiles,
|
Files: allFiles,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, probe.New(err)
|
return 0, probe.NewError(err)
|
||||||
}
|
}
|
||||||
return process.Pid, nil
|
return process.Pid, nil
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ func getAuth(reply *AuthReply) *probe.Error {
|
|||||||
// Get auth keys
|
// Get auth keys
|
||||||
func (s *AuthService) Get(r *http.Request, args *Args, reply *AuthReply) error {
|
func (s *AuthService) Get(r *http.Request, args *Args, reply *AuthReply) error {
|
||||||
if err := getAuth(reply); err != nil {
|
if err := getAuth(reply); err != nil {
|
||||||
return err
|
return probe.NewWrappedError(err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -56,5 +56,8 @@ func setDonut(args *DonutArgs, reply *Reply) *probe.Error {
|
|||||||
|
|
||||||
// Set method
|
// Set method
|
||||||
func (s *DonutService) Set(r *http.Request, args *DonutArgs, reply *Reply) error {
|
func (s *DonutService) Set(r *http.Request, args *DonutArgs, reply *Reply) error {
|
||||||
return setDonut(args, reply)
|
if err := setDonut(args, reply); err != nil {
|
||||||
|
return probe.NewWrappedError(err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,7 @@ func setSysInfoReply(sis *SysInfoReply) *probe.Error {
|
|||||||
var err error
|
var err error
|
||||||
sis.Hostname, err = os.Hostname()
|
sis.Hostname, err = os.Hostname()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return probe.New(err)
|
return probe.NewError(err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -70,7 +70,7 @@ func setMemStatsReply(sis *MemStatsReply) *probe.Error {
|
|||||||
// Get method
|
// Get method
|
||||||
func (s *SysInfoService) Get(r *http.Request, args *Args, reply *SysInfoReply) error {
|
func (s *SysInfoService) Get(r *http.Request, args *Args, reply *SysInfoReply) error {
|
||||||
if err := setSysInfoReply(reply); err != nil {
|
if err := setSysInfoReply(reply); err != nil {
|
||||||
return err
|
return probe.NewWrappedError(err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -78,7 +78,7 @@ func (s *SysInfoService) Get(r *http.Request, args *Args, reply *SysInfoReply) e
|
|||||||
// Get method
|
// Get method
|
||||||
func (s *MemStatsService) Get(r *http.Request, args *Args, reply *MemStatsReply) error {
|
func (s *MemStatsService) Get(r *http.Request, args *Args, reply *MemStatsReply) error {
|
||||||
if err := setMemStatsReply(reply); err != nil {
|
if err := setMemStatsReply(reply); err != nil {
|
||||||
return err
|
return probe.NewWrappedError(err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -44,13 +44,13 @@ func getAPIServer(conf api.Config, apiHandler http.Handler) (*http.Server, *prob
|
|||||||
httpServer.TLSConfig.Certificates = make([]tls.Certificate, 1)
|
httpServer.TLSConfig.Certificates = make([]tls.Certificate, 1)
|
||||||
httpServer.TLSConfig.Certificates[0], err = tls.LoadX509KeyPair(conf.CertFile, conf.KeyFile)
|
httpServer.TLSConfig.Certificates[0], err = tls.LoadX509KeyPair(conf.CertFile, conf.KeyFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
host, port, err := net.SplitHostPort(conf.Address)
|
host, port, err := net.SplitHostPort(conf.Address)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var hosts []string
|
var hosts []string
|
||||||
@ -60,7 +60,7 @@ func getAPIServer(conf api.Config, apiHandler http.Handler) (*http.Server, *prob
|
|||||||
default:
|
default:
|
||||||
addrs, err := net.InterfaceAddrs()
|
addrs, err := net.InterfaceAddrs()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, probe.New(err)
|
return nil, probe.NewError(err)
|
||||||
}
|
}
|
||||||
for _, addr := range addrs {
|
for _, addr := range addrs {
|
||||||
if addr.Network() == "ip+net" {
|
if addr.Network() == "ip+net" {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user