[VOL-5486] Upgrade library versions

Change-Id: I8b4e88699e03f44ee13e467867f45ae3f0a63c4b
Signed-off-by: Abhay Kumar <abhay.kumar@radisys.com>
diff --git a/vendor/go.etcd.io/raft/v3/state_trace.go b/vendor/go.etcd.io/raft/v3/state_trace.go
new file mode 100644
index 0000000..8712dc6
--- /dev/null
+++ b/vendor/go.etcd.io/raft/v3/state_trace.go
@@ -0,0 +1,339 @@
+// Copyright 2024 The etcd Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//go:build with_tla
+
+package raft
+
+import (
+	"strconv"
+	"time"
+
+	"go.etcd.io/raft/v3/raftpb"
+	"go.etcd.io/raft/v3/tracker"
+)
+
+const StateTraceDeployed = true
+
+type stateMachineEventType int
+
+const (
+	rsmInitState stateMachineEventType = iota
+	rsmBecomeCandidate
+	rsmBecomeFollower
+	rsmBecomeLeader
+	rsmCommit
+	rsmReplicate
+	rsmChangeConf
+	rsmApplyConfChange
+	rsmReady
+	rsmSendAppendEntriesRequest
+	rsmReceiveAppendEntriesRequest
+	rsmSendAppendEntriesResponse
+	rsmReceiveAppendEntriesResponse
+	rsmSendRequestVoteRequest
+	rsmReceiveRequestVoteRequest
+	rsmSendRequestVoteResponse
+	rsmReceiveRequestVoteResponse
+	rsmSendSnapshot
+	rsmReceiveSnapshot
+)
+
+func (e stateMachineEventType) String() string {
+	return []string{
+		"InitState",
+		"BecomeCandidate",
+		"BecomeFollower",
+		"BecomeLeader",
+		"Commit",
+		"Replicate",
+		"ChangeConf",
+		"ApplyConfChange",
+		"Ready",
+		"SendAppendEntriesRequest",
+		"ReceiveAppendEntriesRequest",
+		"SendAppendEntriesResponse",
+		"ReceiveAppendEntriesResponse",
+		"SendRequestVoteRequest",
+		"ReceiveRequestVoteRequest",
+		"SendRequestVoteResponse",
+		"ReceiveRequestVoteResponse",
+		"SendSnapshot",
+		"ReceiveSnapshot",
+	}[e]
+}
+
+const (
+	ConfChangeAddNewServer string = "AddNewServer"
+	ConfChangeRemoveServer string = "RemoveServer"
+	ConfChangeAddLearner   string = "AddLearner"
+)
+
+type TracingEvent struct {
+	Name       string             `json:"name"`
+	NodeID     string             `json:"nid"`
+	State      TracingState       `json:"state"`
+	Role       string             `json:"role"`
+	LogSize    uint64             `json:"log"`
+	Conf       [2][]string        `json:"conf"`
+	Message    *TracingMessage    `json:"msg,omitempty"`
+	ConfChange *TracingConfChange `json:"cc,omitempty"`
+	Properties map[string]any     `json:"prop,omitempty"`
+}
+
+type TracingState struct {
+	Term   uint64 `json:"term"`
+	Vote   string `json:"vote"`
+	Commit uint64 `json:"commit"`
+}
+
+type TracingMessage struct {
+	Type        string `json:"type"`
+	Term        uint64 `json:"term"`
+	From        string `json:"from"`
+	To          string `json:"to"`
+	EntryLength int    `json:"entries"`
+	LogTerm     uint64 `json:"logTerm"`
+	Index       uint64 `json:"index"`
+	Commit      uint64 `json:"commit"`
+	Vote        string `json:"vote"`
+	Reject      bool   `json:"reject"`
+	RejectHint  uint64 `json:"rejectHint"`
+}
+
+type SingleConfChange struct {
+	NodeID string `json:"nid"`
+	Action string `json:"action"`
+}
+
+type TracingConfChange struct {
+	Changes []SingleConfChange `json:"changes,omitempty"`
+	NewConf []string           `json:"newconf,omitempty"`
+}
+
+func makeTracingState(r *raft) TracingState {
+	hs := r.hardState()
+	return TracingState{
+		Term:   hs.Term,
+		Vote:   strconv.FormatUint(hs.Vote, 10),
+		Commit: hs.Commit,
+	}
+}
+
+func makeTracingMessage(m *raftpb.Message) *TracingMessage {
+	if m == nil {
+		return nil
+	}
+
+	logTerm := m.LogTerm
+	entries := len(m.Entries)
+	index := m.Index
+	if m.Type == raftpb.MsgSnap {
+		index = 0
+		logTerm = 0
+		entries = int(m.Snapshot.Metadata.Index)
+	}
+	return &TracingMessage{
+		Type:        m.Type.String(),
+		Term:        m.Term,
+		From:        strconv.FormatUint(m.From, 10),
+		To:          strconv.FormatUint(m.To, 10),
+		EntryLength: entries,
+		LogTerm:     logTerm,
+		Index:       index,
+		Commit:      m.Commit,
+		Vote:        strconv.FormatUint(m.Vote, 10),
+		Reject:      m.Reject,
+		RejectHint:  m.RejectHint,
+	}
+}
+
+type TraceLogger interface {
+	TraceEvent(*TracingEvent)
+}
+
+func traceEvent(evt stateMachineEventType, r *raft, m *raftpb.Message, prop map[string]any) {
+	if r.traceLogger == nil {
+		return
+	}
+
+	r.traceLogger.TraceEvent(&TracingEvent{
+		Name:       evt.String(),
+		NodeID:     strconv.FormatUint(r.id, 10),
+		State:      makeTracingState(r),
+		LogSize:    r.raftLog.lastIndex(),
+		Conf:       [2][]string{formatConf(r.trk.Voters[0].Slice()), formatConf(r.trk.Voters[1].Slice())},
+		Role:       r.state.String(),
+		Message:    makeTracingMessage(m),
+		Properties: prop,
+	})
+}
+
+func traceNodeEvent(evt stateMachineEventType, r *raft) {
+	traceEvent(evt, r, nil, nil)
+}
+
+func formatConf(s []uint64) []string {
+	if s == nil {
+		return []string{}
+	}
+
+	r := make([]string, len(s))
+	for i, v := range s {
+		r[i] = strconv.FormatUint(v, 10)
+	}
+	return r
+}
+
+// Use following helper functions to trace specific state and/or
+// transition at corresponding code lines
+func traceInitState(r *raft) {
+	if r.traceLogger == nil {
+		return
+	}
+
+	traceNodeEvent(rsmInitState, r)
+}
+
+func traceReady(r *raft) {
+	traceNodeEvent(rsmReady, r)
+}
+
+func traceCommit(r *raft) {
+	traceNodeEvent(rsmCommit, r)
+}
+
+func traceReplicate(r *raft, es ...raftpb.Entry) {
+	for i := range es {
+		if es[i].Type == raftpb.EntryNormal {
+			traceNodeEvent(rsmReplicate, r)
+		}
+	}
+}
+
+func traceBecomeFollower(r *raft) {
+	traceNodeEvent(rsmBecomeFollower, r)
+}
+
+func traceBecomeCandidate(r *raft) {
+	traceNodeEvent(rsmBecomeCandidate, r)
+}
+
+func traceBecomeLeader(r *raft) {
+	traceNodeEvent(rsmBecomeLeader, r)
+}
+
+func traceChangeConfEvent(cci raftpb.ConfChangeI, r *raft) {
+	cc2 := cci.AsV2()
+	cc := &TracingConfChange{
+		Changes: []SingleConfChange{},
+		NewConf: []string{},
+	}
+	for _, c := range cc2.Changes {
+		switch c.Type {
+		case raftpb.ConfChangeAddNode:
+			cc.Changes = append(cc.Changes, SingleConfChange{
+				NodeID: strconv.FormatUint(c.NodeID, 10),
+				Action: ConfChangeAddNewServer,
+			})
+		case raftpb.ConfChangeRemoveNode:
+			cc.Changes = append(cc.Changes, SingleConfChange{
+				NodeID: strconv.FormatUint(c.NodeID, 10),
+				Action: ConfChangeRemoveServer,
+			})
+		case raftpb.ConfChangeAddLearnerNode:
+			cc.Changes = append(cc.Changes, SingleConfChange{
+				NodeID: strconv.FormatUint(c.NodeID, 10),
+				Action: ConfChangeAddLearner,
+			})
+		}
+	}
+
+	if len(cc.Changes) == 0 {
+		return
+	}
+
+	p := map[string]any{}
+	p["cc"] = cc
+	traceEvent(rsmChangeConf, r, nil, p)
+}
+
+func traceConfChangeEvent(cfg tracker.Config, r *raft) {
+	if r.traceLogger == nil {
+		return
+	}
+
+	cc := &TracingConfChange{
+		Changes: []SingleConfChange{},
+		NewConf: formatConf(cfg.Voters[0].Slice()),
+	}
+
+	p := map[string]any{}
+	p["cc"] = cc
+	traceEvent(rsmApplyConfChange, r, nil, p)
+}
+
+func traceSendMessage(r *raft, m *raftpb.Message) {
+	if r.traceLogger == nil {
+		return
+	}
+
+	prop := map[string]any{}
+
+	var evt stateMachineEventType
+	switch m.Type {
+	case raftpb.MsgApp:
+		evt = rsmSendAppendEntriesRequest
+		if p, exist := r.trk.Progress[m.From]; exist {
+			prop["match"] = p.Match
+			prop["next"] = p.Next
+		}
+
+	case raftpb.MsgHeartbeat, raftpb.MsgSnap:
+		evt = rsmSendAppendEntriesRequest
+	case raftpb.MsgAppResp, raftpb.MsgHeartbeatResp:
+		evt = rsmSendAppendEntriesResponse
+	case raftpb.MsgVote:
+		evt = rsmSendRequestVoteRequest
+	case raftpb.MsgVoteResp:
+		evt = rsmSendRequestVoteResponse
+	default:
+		return
+	}
+
+	traceEvent(evt, r, m, prop)
+}
+
+func traceReceiveMessage(r *raft, m *raftpb.Message) {
+	if r.traceLogger == nil {
+		return
+	}
+
+	var evt stateMachineEventType
+	switch m.Type {
+	case raftpb.MsgApp, raftpb.MsgHeartbeat, raftpb.MsgSnap:
+		evt = rsmReceiveAppendEntriesRequest
+	case raftpb.MsgAppResp, raftpb.MsgHeartbeatResp:
+		evt = rsmReceiveAppendEntriesResponse
+	case raftpb.MsgVote:
+		evt = rsmReceiveRequestVoteRequest
+	case raftpb.MsgVoteResp:
+		evt = rsmReceiveRequestVoteResponse
+	default:
+		return
+	}
+
+	time.Sleep(time.Millisecond) // sleep 1ms to reduce time shift impact accross node
+	traceEvent(evt, r, m, nil)
+}