소스 검색

rafthttp: fix race on peer status activeSince

Anthony Romano 9 년 전
부모
커밋
c5af1d7a88
2개의 변경된 파일13개의 추가작업 그리고 7개의 파일을 삭제
  1. 1 1
      rafthttp/peer.go
  2. 12 6
      rafthttp/peer_status.go

+ 1 - 1
rafthttp/peer.go

@@ -219,7 +219,7 @@ func (p *peer) attachOutgoingConn(conn *outgoingConn) {
 	}
 }
 
-func (p *peer) activeSince() time.Time { return p.status.activeSince }
+func (p *peer) activeSince() time.Time { return p.status.activeSince() }
 
 // Pause pauses the peer. The peer will simply drops all incoming
 // messages without returning an error.

+ 12 - 6
rafthttp/peer_status.go

@@ -28,10 +28,10 @@ type failureType struct {
 }
 
 type peerStatus struct {
-	id          types.ID
-	mu          sync.Mutex // protect variables below
-	active      bool
-	activeSince time.Time
+	id     types.ID
+	mu     sync.Mutex // protect variables below
+	active bool
+	since  time.Time
 }
 
 func newPeerStatus(id types.ID) *peerStatus {
@@ -46,7 +46,7 @@ func (s *peerStatus) activate() {
 	if !s.active {
 		plog.Infof("the connection with %s became active", s.id)
 		s.active = true
-		s.activeSince = time.Now()
+		s.since = time.Now()
 	}
 }
 
@@ -58,7 +58,7 @@ func (s *peerStatus) deactivate(failure failureType, reason string) {
 		plog.Errorf(msg)
 		plog.Infof("the connection with %s became inactive", s.id)
 		s.active = false
-		s.activeSince = time.Time{}
+		s.since = time.Time{}
 		return
 	}
 	plog.Debugf(msg)
@@ -69,3 +69,9 @@ func (s *peerStatus) isActive() bool {
 	defer s.mu.Unlock()
 	return s.active
 }
+
+func (s *peerStatus) activeSince() time.Time {
+	s.mu.Lock()
+	defer s.mu.Unlock()
+	return s.since
+}