1 module hunt.raft.Status; 2 3 import hunt.raft.Msg; 4 import hunt.raft.Node; 5 import hunt.raft.Progress; 6 import hunt.raft.Raft; 7 import hunt.raft.Storage; 8 9 import hunt.logging; 10 11 import std.format; 12 13 struct Status 14 { 15 ulong ID; 16 HardState hs; 17 SoftState ss; 18 ulong Applied; 19 Progress[ulong] progress; 20 ulong LeadTransferee; 21 22 string toString() 23 { 24 string sformat = `{"id":"%x","term":%d,"vote":"%x","commit":%d,"lead":"%x","raftState":%s,"applied":%d,"progress":{`; 25 string data = format(sformat , ID, hs.Term, hs.Vote, hs.Commit, ss.Lead, ss.RaftState, Applied); 26 if(progress.length == 0) 27 data ~= "} , "; 28 else 29 { 30 foreach( k , v ; progress) 31 { 32 sformat = `"%x":{"match":%d,"next":%d,"state":%q},`; 33 data ~= format(sformat , k , v._Match , v._Next , v._State); 34 } 35 36 data.length = data.length - 1; 37 data ~= "},"; 38 } 39 40 sformat = `"leadtransferee":"%x"}`; 41 data ~= format(sformat , LeadTransferee); 42 return data; 43 } 44 } 45 46 47 Status getStatus(Raft r) 48 { 49 Status s; 50 s.ID = r._id; 51 s.LeadTransferee = r._leadTransferee; 52 s.hs = r.hardState(); 53 s.ss = *r.softState(); 54 55 s.Applied = r._raftLog._applied; 56 57 if( s.ss.RaftState == StateType.StateLeader) 58 { 59 foreach(id , p ; r._prs) 60 s.progress[id] = p; 61 } 62 return s; 63 } 64 65 66 67 68 69