aboutsummaryrefslogtreecommitdiff
path: root/go/topology/node.go
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2014-03-13 12:13:39 -0700
committerChris Lu <chris.lu@gmail.com>2014-03-13 12:13:39 -0700
commiteec67d60081e7435dcc2506093bceabf26f4938e (patch)
treeeffb2fa205e4c557e9e0b3665233c293d208635c /go/topology/node.go
parent946aa6d1e78bb98e73851b87c291406b8112cc82 (diff)
downloadseaweedfs-eec67d60081e7435dcc2506093bceabf26f4938e.tar.xz
seaweedfs-eec67d60081e7435dcc2506093bceabf26f4938e.zip
fix bug on volume growing failure where free space equals what's
required. more meaningful volume allocation errors
Diffstat (limited to 'go/topology/node.go')
-rw-r--r--go/topology/node.go10
1 files changed, 7 insertions, 3 deletions
diff --git a/go/topology/node.go b/go/topology/node.go
index abe363b39..c52414008 100644
--- a/go/topology/node.go
+++ b/go/topology/node.go
@@ -5,6 +5,7 @@ import (
"code.google.com/p/weed-fs/go/storage"
"errors"
"math/rand"
+ "strings"
)
type NodeId string
@@ -50,15 +51,18 @@ type NodeImpl struct {
}
// the first node must satisfy filterFirstNodeFn(), the rest nodes must have one free slot
-func (n *NodeImpl) RandomlyPickNodes(numberOfNodes int, filterFirstNodeFn func(dn Node) bool) (firstNode Node, restNodes []Node, err error) {
+func (n *NodeImpl) RandomlyPickNodes(numberOfNodes int, filterFirstNodeFn func(dn Node) error) (firstNode Node, restNodes []Node, err error) {
candidates := make([]Node, 0, len(n.children))
+ errs := make([]string, 0)
for _, node := range n.children {
- if filterFirstNodeFn(node) {
+ if err := filterFirstNodeFn(node); err == nil {
candidates = append(candidates, node)
+ } else {
+ errs = append(errs, string(node.Id())+":"+err.Error())
}
}
if len(candidates) == 0 {
- return nil, nil, errors.New("No matching data node found!")
+ return nil, nil, errors.New("No matching data node found! \n" + strings.Join(errs, "\n"))
}
firstNode = candidates[rand.Intn(len(candidates))]
glog.V(2).Infoln(n.Id(), "picked main node:", firstNode.Id())