|
|
@@ -15,6 +15,9 @@
|
|
|
package raft
|
|
|
|
|
|
import (
|
|
|
+ "fmt"
|
|
|
+ "log"
|
|
|
+
|
|
|
pb "github.com/coreos/etcd/raft/raftpb"
|
|
|
)
|
|
|
|
|
|
@@ -45,3 +48,29 @@ func getStatus(r *raft) Status {
|
|
|
|
|
|
return s
|
|
|
}
|
|
|
+
|
|
|
+// TODO: try to simplify this by introducing ID type into raft
|
|
|
+func (s Status) MarshalJSON() ([]byte, error) {
|
|
|
+ j := fmt.Sprintf(`{"id":"%x","term":%d,"vote":"%x","commit":%d,"lead":"%x","raftState":"%s","progress":{`,
|
|
|
+ s.ID, s.Term, s.Vote, s.Commit, s.Lead, s.RaftState)
|
|
|
+
|
|
|
+ if len(s.Progress) == 0 {
|
|
|
+ j += "}}"
|
|
|
+ } else {
|
|
|
+ for k, v := range s.Progress {
|
|
|
+ subj := fmt.Sprintf(`"%x":{"match":%d,"next":%d},`, k, v.Match, v.Next)
|
|
|
+ j += subj
|
|
|
+ }
|
|
|
+ // remove the trailing ","
|
|
|
+ j = j[:len(j)-1] + "}}"
|
|
|
+ }
|
|
|
+ return []byte(j), nil
|
|
|
+}
|
|
|
+
|
|
|
+func (s Status) String() string {
|
|
|
+ b, err := s.MarshalJSON()
|
|
|
+ if err != nil {
|
|
|
+ log.Panicf("unexpected error: %v", err)
|
|
|
+ }
|
|
|
+ return string(b)
|
|
|
+}
|