diff --git a/server/jetstream_cluster.go b/server/jetstream_cluster.go index 5ec40ed9..7f026618 100644 --- a/server/jetstream_cluster.go +++ b/server/jetstream_cluster.go @@ -4665,9 +4665,9 @@ func (js *jetStream) clusterInfo(rg *raftGroup) *ClusterInfo { for _, rp := range peers { if rp.ID != id && rg.isMember(rp.ID) { - lastSeen := now.Sub(rp.Last) - if lastSeen < 0 { - lastSeen = 1 + var lastSeen time.Duration + if now.After(rp.Last) && rp.Last.Unix() != 0 { + lastSeen = now.Sub(rp.Last) } current := rp.Current if current && lastSeen > lostQuorumInterval { diff --git a/server/norace_test.go b/server/norace_test.go index 402e0f19..b763cfdb 100644 --- a/server/norace_test.go +++ b/server/norace_test.go @@ -1904,6 +1904,38 @@ func TestNoRaceJetStreamClusterMirrorExpirationAndMissingSequences(t *testing.T) checkMirror(20) } +func TestNoRaceLargeActiveOnReplica(t *testing.T) { + // Uncomment to run. + skip(t) + + c := createJetStreamClusterExplicit(t, "LAG", 3) + defer c.shutdown() + + // Client for API requests. + nc, js := jsClientConnect(t, c.randomServer()) + defer nc.Close() + + timeout := time.Now().Add(60 * time.Second) + for time.Now().Before(timeout) { + si, err := js.AddStream(&nats.StreamConfig{ + Name: "TEST", + Subjects: []string{"foo", "bar"}, + Replicas: 3, + }) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + for _, r := range si.Cluster.Replicas { + if r.Active > 5*time.Second { + t.Fatalf("Bad Active value: %+v", r) + } + } + if err := js.DeleteStream("TEST"); err != nil { + t.Fatalf("Unexpected delete error: %v", err) + } + } +} + func TestNoRaceJetStreamClusterSuperClusterRIPStress(t *testing.T) { // Uncomment to run. Needs to be on a big machine. skip(t) diff --git a/server/raft.go b/server/raft.go index c592db67..c6fd43e9 100644 --- a/server/raft.go +++ b/server/raft.go @@ -1245,11 +1245,15 @@ func (n *raft) Peers() []*Peer { var peers []*Peer for id, ps := range n.peers { + var lag uint64 + if n.commit > ps.li { + lag = n.commit - ps.li + } p := &Peer{ ID: id, Current: id == n.leader || ps.li >= n.applied, Last: time.Unix(0, ps.ts), - Lag: n.commit - ps.li, + Lag: lag, } peers = append(peers, p) }