Merge branch 'master' of github.com:coreos/etcd

Conflicts:
	server/peer_server_handlers.go
This commit is contained in:
Yicheng Qin
2014-05-08 13:17:51 -07:00
13 changed files with 96 additions and 130 deletions

View File

@@ -696,8 +696,8 @@ func (s *PeerServer) monitorActiveSize() {
// Retrieve target active size and actual active size.
activeSize := s.ClusterConfig().ActiveSize
peerCount := s.registry.Count()
peers := s.registry.Names()
peerCount := s.registry.Count()
if index := sort.SearchStrings(peers, s.Config.Name); index < len(peers) && peers[index] == s.Config.Name {
peers = append(peers[:index], peers[index+1:]...)
}

View File

@@ -223,8 +223,9 @@ func (ps *PeerServer) setClusterConfigHttpHandler(w http.ResponseWriter, req *ht
// Retrieves a list of peers and standbys.
func (ps *PeerServer) getMachinesHttpHandler(w http.ResponseWriter, req *http.Request) {
machines := make([]*machineMessage, 0)
leader := ps.raftServer.Leader()
for _, name := range ps.registry.Names() {
if msg := ps.getMachineMessage(name); msg != nil {
if msg := ps.getMachineMessage(name, leader); msg != nil {
machines = append(machines, msg)
}
}
@@ -234,21 +235,27 @@ func (ps *PeerServer) getMachinesHttpHandler(w http.ResponseWriter, req *http.Re
// Retrieve single peer or standby.
func (ps *PeerServer) getMachineHttpHandler(w http.ResponseWriter, req *http.Request) {
vars := mux.Vars(req)
json.NewEncoder(w).Encode(ps.getMachineMessage(vars["name"]))
m := ps.getMachineMessage(vars["name"], ps.raftServer.Leader())
json.NewEncoder(w).Encode(m)
}
func (ps *PeerServer) getMachineMessage(name string) *machineMessage {
func (ps *PeerServer) getMachineMessage(name string, leader string) *machineMessage {
if !ps.registry.Exists(name) {
return nil
}
clientURL, _ := ps.registry.ClientURL(name)
peerURL, _ := ps.registry.PeerURL(name)
return &machineMessage{
msg := &machineMessage{
Name: name,
State: raft.Follower,
ClientURL: clientURL,
PeerURL: peerURL,
}
if name == leader {
msg.State = raft.Leader
}
return msg
}
// Response to the name request
@@ -300,6 +307,7 @@ func (ps *PeerServer) UpgradeHttpHandler(w http.ResponseWriter, req *http.Reques
// machineMessage represents information about a peer or standby in the registry.
type machineMessage struct {
Name string `json:"name"`
State string `json:"state"`
ClientURL string `json:"clientURL"`
PeerURL string `json:"peerURL"`
}

View File

@@ -33,7 +33,7 @@ type raftServerStats struct {
}
func NewRaftServerStats(name string) *raftServerStats {
return &raftServerStats{
stats := &raftServerStats{
Name: name,
StartTime: time.Now(),
sendRateQueue: &statsQueue{
@@ -43,6 +43,8 @@ func NewRaftServerStats(name string) *raftServerStats {
back: -1,
},
}
stats.LeaderInfo.startTime = time.Now()
return stats
}
func (ss *raftServerStats) RecvAppendReq(leaderName string, pkgSize int) {

View File

@@ -38,19 +38,6 @@ func NewRegistry(s store.Store) *Registry {
}
}
// Names returns a list of cached peer names.
func (r *Registry) Names() []string {
r.Lock()
defer r.Unlock()
names := make([]string, 0, len(r.peers))
for name := range r.peers {
names = append(names, name)
}
sort.Sort(sort.StringSlice(names))
return names
}
// Register adds a peer to the registry.
func (r *Registry) Register(name string, peerURL string, machURL string) error {
// Write data to store.
@@ -167,6 +154,17 @@ func (r *Registry) UpdatePeerURL(name string, peerURL string) error {
return nil
}
func (r *Registry) name(key, name string) (string, bool) {
return name, true
}
// Names returns a list of cached peer names.
func (r *Registry) Names() []string {
names := r.urls(RegistryKey, "", "", r.name)
sort.Sort(sort.StringSlice(names))
return names
}
// Retrieves the Client URLs for all nodes.
func (r *Registry) ClientURLs(leaderName, selfName string) []string {
return r.urls(RegistryKey, leaderName, selfName, r.clientURL)

View File

@@ -90,6 +90,13 @@ func TestV2GetKeyRecursively(t *testing.T) {
//
func TestV2WatchKey(t *testing.T) {
tests.RunServer(func(s *server.Server) {
// There exists a little gap between etcd ready to serve and
// it actually serves the first request, which means the response
// delay could be a little bigger.
// This test is time sensitive, so it does one request to ensure
// that the server is working.
tests.Get(fmt.Sprintf("%s%s", s.URL(), "/v2/keys/foo/bar"))
var watchResp *http.Response
c := make(chan bool)
go func() {