func (s *state) logRaftReady(readyGroups map[uint64]raft.Ready) { for groupID, ready := range readyGroups { if log.V(5) { log.Infof("node %v: group %v raft ready", s.nodeID, groupID) if ready.SoftState != nil { log.Infof("SoftState updated: %+v", *ready.SoftState) } if !raft.IsEmptyHardState(ready.HardState) { log.Infof("HardState updated: %+v", ready.HardState) } for i, e := range ready.Entries { log.Infof("New Entry[%d]: %.200s", i, raft.DescribeEntry(e, s.EntryFormatter)) } for i, e := range ready.CommittedEntries { log.Infof("Committed Entry[%d]: %.200s", i, raft.DescribeEntry(e, s.EntryFormatter)) } if !raft.IsEmptySnap(ready.Snapshot) { log.Infof("Snapshot updated: %.200s", ready.Snapshot.String()) } for i, m := range ready.Messages { log.Infof("Outgoing Message[%d]: %.200s", i, raft.DescribeMessage(m, s.EntryFormatter)) } } } }
func logRaftReady(storeID roachpb.StoreID, groupID roachpb.RangeID, ready raft.Ready) { if log.V(5) { // Globally synchronize to avoid interleaving different sets of logs in tests. logRaftReadyMu.Lock() defer logRaftReadyMu.Unlock() log.Infof("store %s: group %s raft ready", storeID, groupID) if ready.SoftState != nil { log.Infof("SoftState updated: %+v", *ready.SoftState) } if !raft.IsEmptyHardState(ready.HardState) { log.Infof("HardState updated: %+v", ready.HardState) } for i, e := range ready.Entries { log.Infof("New Entry[%d]: %.200s", i, raft.DescribeEntry(e, raftEntryFormatter)) } for i, e := range ready.CommittedEntries { log.Infof("Committed Entry[%d]: %.200s", i, raft.DescribeEntry(e, raftEntryFormatter)) } if !raft.IsEmptySnap(ready.Snapshot) { log.Infof("Snapshot updated: %.200s", ready.Snapshot.String()) } for i, m := range ready.Messages { log.Infof("Outgoing Message[%d]: %.200s", i, raft.DescribeMessage(m, raftEntryFormatter)) } } }
func logRaftReady(ctx context.Context, prefix fmt.Stringer, ready raft.Ready) { if log.V(5) { var buf bytes.Buffer if ready.SoftState != nil { fmt.Fprintf(&buf, " SoftState updated: %+v\n", *ready.SoftState) } if !raft.IsEmptyHardState(ready.HardState) { fmt.Fprintf(&buf, " HardState updated: %+v\n", ready.HardState) } for i, e := range ready.Entries { fmt.Fprintf(&buf, " New Entry[%d]: %.200s\n", i, raft.DescribeEntry(e, raftEntryFormatter)) } for i, e := range ready.CommittedEntries { fmt.Fprintf(&buf, " Committed Entry[%d]: %.200s\n", i, raft.DescribeEntry(e, raftEntryFormatter)) } if !raft.IsEmptySnap(ready.Snapshot) { fmt.Fprintf(&buf, " Snapshot updated: %.200s\n", ready.Snapshot.String()) } for i, m := range ready.Messages { fmt.Fprintf(&buf, " Outgoing Message[%d]: %.200s\n", i, raft.DescribeMessage(m, raftEntryFormatter)) } log.Infof(ctx, "%s raft ready\n%s", prefix, buf.String()) } }
func (s *state) handleRaftReady(readyGroups map[uint64]raft.Ready) { // Soft state is updated immediately; everything else waits for handleWriteReady. for groupID, ready := range readyGroups { if log.V(5) { log.Infof("node %v: group %v raft ready", s.nodeID, groupID) if ready.SoftState != nil { log.Infof("SoftState updated: %+v", *ready.SoftState) } if !raft.IsEmptyHardState(ready.HardState) { log.Infof("HardState updated: %+v", ready.HardState) } for i, e := range ready.Entries { log.Infof("New Entry[%d]: %.200s", i, raft.DescribeEntry(e, s.EntryFormatter)) } for i, e := range ready.CommittedEntries { log.Infof("Committed Entry[%d]: %.200s", i, raft.DescribeEntry(e, s.EntryFormatter)) } if !raft.IsEmptySnap(ready.Snapshot) { log.Infof("Snapshot updated: %.200s", ready.Snapshot.String()) } for i, m := range ready.Messages { log.Infof("Outgoing Message[%d]: %.200s", i, raft.DescribeMessage(m, s.EntryFormatter)) } } g, ok := s.groups[groupID] if !ok { // This is a stale message for a removed group log.V(4).Infof("node %v: dropping stale ready message for group %v", s.nodeID, groupID) continue } term := g.committedTerm if ready.SoftState != nil { // Always save the leader whenever we get a SoftState. g.leader = NodeID(ready.SoftState.Lead) } if len(ready.CommittedEntries) > 0 { term = ready.CommittedEntries[len(ready.CommittedEntries)-1].Term } if term != g.committedTerm && g.leader != 0 { // Whenever the committed term has advanced and we know our leader, // emit an event. g.committedTerm = term s.sendEvent(&EventLeaderElection{ GroupID: groupID, NodeID: NodeID(g.leader), Term: g.committedTerm, }) // Re-submit all pending proposals for _, prop := range g.pending { s.proposalChan <- prop } } } }
// This is a fork of raft.DescribeMessage with a tweak to avoid logging // snapshot data. func raftDescribeMessage(m raftpb.Message, f raft.EntryFormatter) string { var buf bytes.Buffer fmt.Fprintf(&buf, "%x->%x %v Term:%d Log:%d/%d", m.From, m.To, m.Type, m.Term, m.LogTerm, m.Index) if m.Reject { fmt.Fprintf(&buf, " Rejected") if m.RejectHint != 0 { fmt.Fprintf(&buf, "(Hint:%d)", m.RejectHint) } } if m.Commit != 0 { fmt.Fprintf(&buf, " Commit:%d", m.Commit) } if len(m.Entries) > 0 { fmt.Fprintf(&buf, " Entries:[") for i, e := range m.Entries { if i != 0 { buf.WriteString(", ") } buf.WriteString(raft.DescribeEntry(e, f)) } fmt.Fprintf(&buf, "]") } if !raft.IsEmptySnap(m.Snapshot) { snap := m.Snapshot snap.Data = nil fmt.Fprintf(&buf, " Snapshot:%v", snap) } return buf.String() }