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