|
@@ -1,7 +1,6 @@
|
|
|
package main
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
- "container/list"
|
|
|
|
|
"fmt"
|
|
"fmt"
|
|
|
"math"
|
|
"math"
|
|
|
"sync"
|
|
"sync"
|
|
@@ -43,18 +42,21 @@ type raftServerStats struct {
|
|
|
SendAppendRequestCnt uint64
|
|
SendAppendRequestCnt uint64
|
|
|
SendAppendReqeustRate uint64
|
|
SendAppendReqeustRate uint64
|
|
|
sendRateQueue *statsQueue
|
|
sendRateQueue *statsQueue
|
|
|
- recvRateQueue *list.List
|
|
|
|
|
|
|
+ recvRateQueue *statsQueue
|
|
|
SendingPkgRate float64
|
|
SendingPkgRate float64
|
|
|
SendingBandwidthRate float64
|
|
SendingBandwidthRate float64
|
|
|
|
|
+ RecvingPkgRate float64
|
|
|
|
|
+ RecvingBandwidthRate float64
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (ss *raftServerStats) RecvAppendReq(leaderName string) {
|
|
|
|
|
|
|
+func (ss *raftServerStats) RecvAppendReq(leaderName string, pkgSize int) {
|
|
|
ss.State = raft.Follower
|
|
ss.State = raft.Follower
|
|
|
if leaderName != ss.Leader {
|
|
if leaderName != ss.Leader {
|
|
|
ss.Leader = leaderName
|
|
ss.Leader = leaderName
|
|
|
ss.leaderStartTime = time.Now()
|
|
ss.leaderStartTime = time.Now()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ ss.recvRateQueue.Insert(NewPackageStats(time.Now(), pkgSize))
|
|
|
ss.RecvAppendRequestCnt++
|
|
ss.RecvAppendRequestCnt++
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -129,7 +131,7 @@ func (q *statsQueue) Size() int {
|
|
|
|
|
|
|
|
// FrontAndBack gets the front and back elements in the queue
|
|
// FrontAndBack gets the front and back elements in the queue
|
|
|
// We must grab front and back together with the protection of the lock
|
|
// We must grab front and back together with the protection of the lock
|
|
|
-func (q *statsQueue) FrontAndBack() (*packageStats, *packageStats) {
|
|
|
|
|
|
|
+func (q *statsQueue) frontAndBack() (*packageStats, *packageStats) {
|
|
|
q.rwl.RLock()
|
|
q.rwl.RLock()
|
|
|
defer q.rwl.RUnlock()
|
|
defer q.rwl.RUnlock()
|
|
|
if q.size != 0 {
|
|
if q.size != 0 {
|
|
@@ -155,3 +157,19 @@ func (q *statsQueue) Insert(p *packageStats) {
|
|
|
|
|
|
|
|
fmt.Println(q.front, q.back, q.size)
|
|
fmt.Println(q.front, q.back, q.size)
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+func (q *statsQueue) Rate() (float64, float64) {
|
|
|
|
|
+ front, back := q.frontAndBack()
|
|
|
|
|
+
|
|
|
|
|
+ if front == nil || back == nil {
|
|
|
|
|
+ return 0, 0
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ sampleDuration := back.Time().Sub(front.Time())
|
|
|
|
|
+
|
|
|
|
|
+ pr := float64(q.Len()) / float64(sampleDuration) * float64(time.Second)
|
|
|
|
|
+
|
|
|
|
|
+ br := float64(q.Size()) / float64(sampleDuration) * float64(time.Second)
|
|
|
|
|
+
|
|
|
|
|
+ return pr, br
|
|
|
|
|
+}
|