|
@@ -16,6 +16,7 @@ package raft
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
"bytes"
|
|
"bytes"
|
|
|
|
|
+ "fmt"
|
|
|
"reflect"
|
|
"reflect"
|
|
|
"testing"
|
|
"testing"
|
|
|
|
|
|
|
@@ -545,3 +546,73 @@ func TestRawNodeBoundedLogGrowthWithPartition(t *testing.T) {
|
|
|
rawNode.Advance(rd)
|
|
rawNode.Advance(rd)
|
|
|
checkUncommitted(0)
|
|
checkUncommitted(0)
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+func BenchmarkStatusProgress(b *testing.B) {
|
|
|
|
|
+ setup := func(members int) *RawNode {
|
|
|
|
|
+ peers := make([]uint64, members)
|
|
|
|
|
+ for i := range peers {
|
|
|
|
|
+ peers[i] = uint64(i + 1)
|
|
|
|
|
+ }
|
|
|
|
|
+ cfg := newTestConfig(1, peers, 3, 1, NewMemoryStorage())
|
|
|
|
|
+ cfg.Logger = discardLogger
|
|
|
|
|
+ r := newRaft(cfg)
|
|
|
|
|
+ r.becomeFollower(1, 1)
|
|
|
|
|
+ r.becomeCandidate()
|
|
|
|
|
+ r.becomeLeader()
|
|
|
|
|
+ return &RawNode{raft: r}
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ for _, members := range []int{1, 3, 5, 100} {
|
|
|
|
|
+ b.Run(fmt.Sprintf("members=%d", members), func(b *testing.B) {
|
|
|
|
|
+ // NB: call getStatus through rn.Status because that incurs an additional
|
|
|
|
|
+ // allocation.
|
|
|
|
|
+ rn := setup(members)
|
|
|
|
|
+
|
|
|
|
|
+ b.Run("Status", func(b *testing.B) {
|
|
|
|
|
+ b.ReportAllocs()
|
|
|
|
|
+ for i := 0; i < b.N; i++ {
|
|
|
|
|
+ _ = rn.Status()
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ b.Run("Status-example", func(b *testing.B) {
|
|
|
|
|
+ b.ReportAllocs()
|
|
|
|
|
+ for i := 0; i < b.N; i++ {
|
|
|
|
|
+ s := rn.Status()
|
|
|
|
|
+ var n uint64
|
|
|
|
|
+ for _, pr := range s.Progress {
|
|
|
|
|
+ n += pr.Match
|
|
|
|
|
+ }
|
|
|
|
|
+ _ = n
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ b.Run("StatusWithoutProgress", func(b *testing.B) {
|
|
|
|
|
+ b.ReportAllocs()
|
|
|
|
|
+ for i := 0; i < b.N; i++ {
|
|
|
|
|
+ _ = rn.StatusWithoutProgress()
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ b.Run("WithProgress", func(b *testing.B) {
|
|
|
|
|
+ b.ReportAllocs()
|
|
|
|
|
+ visit := func(uint64, ProgressType, Progress) {}
|
|
|
|
|
+
|
|
|
|
|
+ for i := 0; i < b.N; i++ {
|
|
|
|
|
+ rn.WithProgress(visit)
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ b.Run("WithProgress-example", func(b *testing.B) {
|
|
|
|
|
+ b.ReportAllocs()
|
|
|
|
|
+ for i := 0; i < b.N; i++ {
|
|
|
|
|
+ var n uint64
|
|
|
|
|
+ visit := func(_ uint64, _ ProgressType, pr Progress) {
|
|
|
|
|
+ n += pr.Match
|
|
|
|
|
+ }
|
|
|
|
|
+ rn.WithProgress(visit)
|
|
|
|
|
+ _ = n
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+}
|