From 203aec456f94756d94877ab3bcd920b19272f9a6 Mon Sep 17 00:00:00 2001
From: jkrvivian <jkrvivian@gmail.com>
Date: Mon, 17 Feb 2020 22:08:13 +0800
Subject: [PATCH] Fix: Log dropping packets every 1000 drops (#255)

* Fix: Log dropping packets every 1000 drops

* use an atomic counter for dropped message because Write() could be called concurrently

* removes redundant zero

* Add external check in test

Co-authored-by: Luca Moser <moser.luca@gmail.com>
---
 packages/gossip/neighbor.go      | 17 ++++++++++++-----
 packages/gossip/neighbor_test.go |  8 ++++----
 2 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/packages/gossip/neighbor.go b/packages/gossip/neighbor.go
index cbf39e91..a529aab2 100644
--- a/packages/gossip/neighbor.go
+++ b/packages/gossip/neighbor.go
@@ -11,6 +11,7 @@ import (
 	"github.com/iotaledger/goshimmer/packages/netutil/buffconn"
 	"github.com/iotaledger/hive.go/autopeering/peer"
 	"github.com/iotaledger/hive.go/logger"
+	"go.uber.org/atomic"
 )
 
 var (
@@ -19,16 +20,18 @@ var (
 )
 
 const (
-	neighborQueueSize = 5000
-	maxNumReadErrors  = 10
+	neighborQueueSize        = 5000
+	maxNumReadErrors         = 10
+	droppedMessagesThreshold = 1000
 )
 
 type Neighbor struct {
 	*peer.Peer
 	*buffconn.BufferedConnection
 
-	log   *logger.Logger
-	queue chan []byte
+	log             *logger.Logger
+	queue           chan []byte
+	messagesDropped atomic.Int32
 
 	wg             sync.WaitGroup
 	closing        chan struct{}
@@ -150,6 +153,10 @@ func (n *Neighbor) Write(b []byte) (int, error) {
 	case <-n.closing:
 		return 0, nil
 	default:
-		return 0, ErrNeighborQueueFull
+		if n.messagesDropped.Inc() >= droppedMessagesThreshold {
+			n.messagesDropped.Store(0)
+			return 0, ErrNeighborQueueFull
+		}
+		return 0, nil
 	}
 }
diff --git a/packages/gossip/neighbor_test.go b/packages/gossip/neighbor_test.go
index 21d02cf9..36c61534 100644
--- a/packages/gossip/neighbor_test.go
+++ b/packages/gossip/neighbor_test.go
@@ -87,8 +87,8 @@ func TestNeighborParallelWrite(t *testing.T) {
 	go func() {
 		defer wg.Done()
 		for i := 0; i < neighborQueueSize; i++ {
-			_, err := neighborA.Write(testData)
-			if err == ErrNeighborQueueFull {
+			l, err := neighborA.Write(testData)
+			if err == ErrNeighborQueueFull || l == 0 {
 				continue
 			}
 			assert.NoError(t, err)
@@ -99,8 +99,8 @@ func TestNeighborParallelWrite(t *testing.T) {
 	go func() {
 		defer wg.Done()
 		for i := 0; i < neighborQueueSize; i++ {
-			_, err := neighborA.Write(testData)
-			if err == ErrNeighborQueueFull {
+			l, err := neighborA.Write(testData)
+			if err == ErrNeighborQueueFull || l == 0 {
 				continue
 			}
 			assert.NoError(t, err)
-- 
GitLab