Xiang Li 12 years ago
parent
commit
9a63723bbe
2 changed files with 30 additions and 5 deletions
  1. 4 1
      command.go
  2. 26 4
      raft_stats.go

+ 4 - 1
command.go

@@ -169,7 +169,10 @@ func (c *JoinCommand) Apply(raftServer *raft.Server) (interface{}, error) {
 	key := path.Join("_etcd/machines", c.Name)
 	value := fmt.Sprintf("raft=%s&etcd=%s&raftVersion=%s", c.RaftURL, c.EtcdURL, c.RaftVersion)
 	etcdStore.Set(key, value, time.Unix(0, 0), raftServer.CommitIndex())
-	r.peersStats[c.Name] = &peerStats{}
+
+	if c.Name != r.Name() {
+		r.peersStats[c.Name] = &peerStats{MinLatency: 1 << 63}
+	}
 
 	return b, err
 }

+ 26 - 4
raft_stats.go

@@ -1,14 +1,19 @@
 package main
 
 import (
+	"math"
 	"time"
 )
 
 type peerStats struct {
-	Latency    float64 `json:"latency"`
-	AvgLatency float64 `json:"averageLatency"`
-	FailCnt    uint64  `json:"failsCount"`
-	SuccCnt    uint64  `json:"successCount"`
+	Latency          float64 `json:"latency"`
+	AvgLatency       float64 `json:"averageLatency"`
+	avgLatencySquare float64
+	SdvLatency       float64 `json:"sdvLatency"`
+	MinLatency       float64 `json:"minLatency"`
+	MaxLatency       float64 `json:"maxLatency"`
+	FailCnt          uint64  `json:"failsCount"`
+	SuccCnt          uint64  `json:"successCount"`
 }
 
 func (ps *peerStats) Fail() {
@@ -16,8 +21,25 @@ func (ps *peerStats) Fail() {
 }
 
 func (ps *peerStats) Succ(d time.Duration) {
+
 	total := float64(ps.SuccCnt) * ps.AvgLatency
+	totalSquare := float64(ps.SuccCnt) * ps.avgLatencySquare
+
 	ps.SuccCnt++
+
 	ps.Latency = float64(d) / (1000000.0)
+
+	if ps.Latency > ps.MaxLatency {
+		ps.MaxLatency = ps.Latency
+	}
+
+	if ps.Latency < ps.MinLatency {
+		ps.MinLatency = ps.Latency
+	}
+
 	ps.AvgLatency = (total + ps.Latency) / float64(ps.SuccCnt)
+	ps.avgLatencySquare = (totalSquare + ps.Latency*ps.Latency) / float64(ps.SuccCnt)
+
+	// sdv = sqrt(avg(x^2) - avg(x)^2)
+	ps.SdvLatency = math.Sqrt(ps.avgLatencySquare - ps.AvgLatency*ps.AvgLatency)
 }