diff --git a/weed/topology/rack.go b/weed/topology/rack.go index 1921c0c05..cb68204f7 100644 --- a/weed/topology/rack.go +++ b/weed/topology/rack.go @@ -2,6 +2,7 @@ package topology import ( "github.com/chrislusf/seaweedfs/weed/pb/master_pb" + "sort" "strconv" "time" ) @@ -46,17 +47,30 @@ func (r *Rack) GetOrCreateDataNode(ip string, port int, publicUrl string, maxVol return dn } +type DataNodePtrSlice []*DataNode +func (p DataNodePtrSlice) Len() int { return len(p) } +func (p DataNodePtrSlice) Less(i, j int) bool { return p[i].Url() < p[j].Url() } +func (p DataNodePtrSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + func (r *Rack) ToMap() interface{} { m := make(map[string]interface{}) m["Id"] = r.Id() m["Max"] = r.GetMaxVolumeCount() m["Free"] = r.FreeSpace() - var dns []interface{} + + var dataNodes DataNodePtrSlice for _, c := range r.Children() { - dn := c.(*DataNode) - dns = append(dns, dn.ToMap()) + dataNodes = append(dataNodes, c.(*DataNode)) } + sort.Sort(dataNodes) + + var dns []interface{} + for _, c := range dataNodes { + dns = append(dns, c.ToMap()) + } + m["DataNodes"] = dns + return m }