mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
etcdserver: sort Members() in Cluster
This commit is contained in:
parent
4089475c90
commit
af42f4a56b
@ -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]
|
||||||
|
@ -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)
|
||||||
|
@ -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] }
|
|
||||||
|
@ -27,6 +27,7 @@ import (
|
|||||||
"net/url"
|
"net/url"
|
||||||
"path"
|
"path"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
@ -1751,5 +1752,12 @@ type fakeCluster struct {
|
|||||||
|
|
||||||
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 {
|
||||||
|
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] }
|
func (c *fakeCluster) Member(id uint64) *etcdserver.Member { return c.members[id] }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user