etcdserver: sort Members() in Cluster

This commit is contained in:
Jonathan Boulle 2014-10-23 15:57:27 -07:00
parent 4089475c90
commit af42f4a56b
4 changed files with 51 additions and 19 deletions

View File

@ -41,7 +41,8 @@ const (
type ClusterInfo interface { type ClusterInfo interface {
ID() uint64 ID() uint64
ClientURLs() []string ClientURLs() []string
Members() map[uint64]*Member // Members returns a slice of members sorted by their ID
Members() []*Member
Member(id uint64) *Member Member(id uint64) *Member
} }
@ -123,7 +124,20 @@ func newCluster(name string) *Cluster {
func (c Cluster) ID() uint64 { return c.id } func (c Cluster) ID() uint64 { return c.id }
func (c Cluster) Members() map[uint64]*Member { return c.members } func (c Cluster) Members() []*Member {
var sms SortableMemberSlice
for _, m := range c.members {
sms = append(sms, m)
}
sort.Sort(sms)
return []*Member(sms)
}
type SortableMemberSlice []*Member
func (s SortableMemberSlice) Len() int { return len(s) }
func (s SortableMemberSlice) Less(i, j int) bool { return s[i].ID < s[j].ID }
func (s SortableMemberSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (c *Cluster) Member(id uint64) *Member { func (c *Cluster) Member(id uint64) *Member {
return c.members[id] return c.members[id]

View File

@ -365,6 +365,28 @@ func TestClusterAddMember(t *testing.T) {
} }
} }
func TestClusterMembers(t *testing.T) {
cls := &Cluster{
members: map[uint64]*Member{
1: &Member{ID: 1},
20: &Member{ID: 20},
100: &Member{ID: 100},
5: &Member{ID: 5},
50: &Member{ID: 50},
},
}
w := []*Member{
&Member{ID: 1},
&Member{ID: 5},
&Member{ID: 20},
&Member{ID: 50},
&Member{ID: 100},
}
if g := cls.Members(); !reflect.DeepEqual(g, w) {
t.Fatalf("Members()=%#v, want %#v", g, w)
}
}
func TestClusterRemoveMember(t *testing.T) { func TestClusterRemoveMember(t *testing.T) {
st := &storeRecorder{} st := &storeRecorder{}
c := newTestCluster(nil) c := newTestCluster(nil)

View File

@ -25,7 +25,6 @@ import (
"net/http" "net/http"
"net/url" "net/url"
"path" "path"
"sort"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -160,12 +159,7 @@ func (h serverHandler) serveAdminMembers(w http.ResponseWriter, r *http.Request)
case "GET": case "GET":
idStr := strings.TrimPrefix(r.URL.Path, adminMembersPrefix) idStr := strings.TrimPrefix(r.URL.Path, adminMembersPrefix)
if idStr == "" { if idStr == "" {
msmap := h.clusterInfo.Members() ms := h.clusterInfo.Members()
ms := make(SortableMemberSlice, 0, len(msmap))
for _, m := range msmap {
ms = append(ms, m)
}
sort.Sort(ms)
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(ms); err != nil { if err := json.NewEncoder(w).Encode(ms); err != nil {
log.Printf("etcdhttp: %v", err) log.Printf("etcdhttp: %v", err)
@ -582,9 +576,3 @@ func trimNodeExternPrefix(n *store.NodeExtern, prefix string) *store.NodeExtern
} }
return n return n
} }
type SortableMemberSlice []*etcdserver.Member
func (s SortableMemberSlice) Len() int { return len(s) }
func (s SortableMemberSlice) Less(i, j int) bool { return s[i].ID < s[j].ID }
func (s SortableMemberSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }

View File

@ -27,6 +27,7 @@ import (
"net/url" "net/url"
"path" "path"
"reflect" "reflect"
"sort"
"strings" "strings"
"testing" "testing"
"time" "time"
@ -1749,7 +1750,14 @@ type fakeCluster struct {
members map[uint64]*etcdserver.Member members map[uint64]*etcdserver.Member
} }
func (c *fakeCluster) ID() uint64 { return c.id } func (c *fakeCluster) ID() uint64 { return c.id }
func (c *fakeCluster) ClientURLs() []string { return c.clientURLs } func (c *fakeCluster) ClientURLs() []string { return c.clientURLs }
func (c *fakeCluster) Members() map[uint64]*etcdserver.Member { return c.members } func (c *fakeCluster) Members() []*etcdserver.Member {
func (c *fakeCluster) Member(id uint64) *etcdserver.Member { return c.members[id] } var sms etcdserver.SortableMemberSlice
for _, m := range c.members {
sms = append(sms, m)
}
sort.Sort(sms)
return []*etcdserver.Member(sms)
}
func (c *fakeCluster) Member(id uint64) *etcdserver.Member { return c.members[id] }