From 4531218638be1f9d41d4d1bb82f3b802106501bb Mon Sep 17 00:00:00 2001
From: Fabian Seidl <fabian.seidl@h-da.de>
Date: Mon, 22 Aug 2022 16:43:21 +0200
Subject: [PATCH] moved logging inside go func, changed backoff duration
 function to use fibonacci instead of fixed time value for each attempt

---
 controller/eventService/Service.go            |  5 +-
 controller/nucleus/deviceService.go           | 40 +++++--------
 controller/nucleus/sbiService.go              | 20 +++----
 controller/rbac/rbacService.go                | 60 ++++++++-----------
 controller/topology/nodes/nodeService.go      | 30 ++++------
 controller/topology/ports/portService.go      | 30 ++++------
 .../routing-tables/routingTableService.go     | 30 ++++------
 controller/topology/topologyService.go        | 30 ++++------
 8 files changed, 99 insertions(+), 146 deletions(-)

diff --git a/controller/eventService/Service.go b/controller/eventService/Service.go
index 0ace2760f..b21df9c75 100644
--- a/controller/eventService/Service.go
+++ b/controller/eventService/Service.go
@@ -23,7 +23,8 @@ type EventService struct {
 }
 
 const (
-	rePublishAttempts = 5
+	// Max number of tries to republish a failed message
+	rePublishAttempts = 10
 )
 
 // NewEventService creates a new connection to the broker and opens a channel for later usage.
@@ -88,7 +89,7 @@ func (e *EventService) PublishEvent(topic string, event event.Event) error {
 // RetryPublish is used to retry publishing an event after a failed attempt.
 func (e *EventService) RetryPublish(topic string, event event.Event) error {
 	ctx := context.Background()
-	backOff := retry.NewConstant(2 * time.Second)
+	backOff := retry.NewFibonacci(time.Second)
 
 	if err := retry.Do(ctx, retry.WithMaxRetries(rePublishAttempts, backOff), func(ctx context.Context) error {
 		if pubErr := e.PublishEvent(topic, event); pubErr != nil {
diff --git a/controller/nucleus/deviceService.go b/controller/nucleus/deviceService.go
index e6aad402f..2dacf748e 100644
--- a/controller/nucleus/deviceService.go
+++ b/controller/nucleus/deviceService.go
@@ -82,14 +82,12 @@ func (s *DeviceService) Add(deviceToAdd device.Device) error {
 
 	pubEvent := event.NewAddEvent(deviceToAdd.ID())
 	if err := s.eventService.PublishEvent(DeviceEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = s.eventService.RetryPublish(DeviceEventTopic, pubEvent)
+			retryErr := s.eventService.RetryPublish(DeviceEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
@@ -121,14 +119,12 @@ func (s *DeviceService) UpdateModel(deviceToUpdate device.Device, modelAsString
 
 	pubEvent := event.NewUpdateEvent(deviceToUpdate.ID())
 	if err := s.eventService.PublishEvent(DeviceEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = s.eventService.RetryPublish(DeviceEventTopic, pubEvent)
+			retryErr := s.eventService.RetryPublish(DeviceEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
@@ -143,14 +139,12 @@ func (s *DeviceService) Update(deviceToUpdate device.Device) error {
 
 	pubEvent := event.NewUpdateEvent(deviceToUpdate.ID())
 	if err := s.eventService.PublishEvent(DeviceEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = s.eventService.RetryPublish(DeviceEventTopic, pubEvent)
+			retryErr := s.eventService.RetryPublish(DeviceEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
@@ -171,14 +165,12 @@ func (s *DeviceService) Delete(deviceToDelete device.Device) error {
 
 	pubEvent := event.NewDeleteEvent(deviceToDelete.ID())
 	if err := s.eventService.PublishEvent(DeviceEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = s.eventService.RetryPublish(DeviceEventTopic, pubEvent)
+			retryErr := s.eventService.RetryPublish(DeviceEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
diff --git a/controller/nucleus/sbiService.go b/controller/nucleus/sbiService.go
index 8a2442c0b..6d3f6259c 100644
--- a/controller/nucleus/sbiService.go
+++ b/controller/nucleus/sbiService.go
@@ -75,14 +75,12 @@ func (s *SbiService) Add(sbiToAdd southbound.SouthboundInterface) error {
 
 	pubEvent := event.NewAddEvent(sbiToAdd.ID())
 	if err := s.eventService.PublishEvent(SbiEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = s.eventService.RetryPublish(SbiEventTopic, pubEvent)
+			retryErr := s.eventService.RetryPublish(SbiEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
@@ -104,14 +102,12 @@ func (s *SbiService) Delete(sbiToDelete southbound.SouthboundInterface) error {
 
 	pubEvent := event.NewDeleteEvent(sbiToDelete.ID())
 	if err := s.eventService.PublishEvent(SbiEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = s.eventService.RetryPublish(SbiEventTopic, pubEvent)
+			retryErr := s.eventService.RetryPublish(SbiEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
diff --git a/controller/rbac/rbacService.go b/controller/rbac/rbacService.go
index 19c5d2557..f999674da 100644
--- a/controller/rbac/rbacService.go
+++ b/controller/rbac/rbacService.go
@@ -42,14 +42,12 @@ func (s *UserService) Add(userToAdd rbac.User) error {
 
 	pubEvent := event.NewAddEvent(userToAdd.ID())
 	if err := s.eventService.PublishEvent(UserEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = s.eventService.RetryPublish(UserEventTopic, pubEvent)
+			retryErr := s.eventService.RetryPublish(UserEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
@@ -64,14 +62,12 @@ func (s *UserService) Delete(userToDelete rbac.User) error {
 
 	pubEvent := event.NewDeleteEvent(userToDelete.ID())
 	if err := s.eventService.PublishEvent(UserEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = s.eventService.RetryPublish(UserEventTopic, pubEvent)
+			retryErr := s.eventService.RetryPublish(UserEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
@@ -86,14 +82,12 @@ func (s *UserService) Update(userToUpdate rbac.User) error {
 
 	pubEvent := event.NewUpdateEvent(userToUpdate.ID())
 	if err := s.eventService.PublishEvent(UserEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = s.eventService.RetryPublish(UserEventTopic, pubEvent)
+			retryErr := s.eventService.RetryPublish(UserEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
@@ -152,14 +146,12 @@ func (s *RoleService) Add(roleToAdd rbac.Role) error {
 
 	pubEvent := event.NewAddEvent(roleToAdd.ID())
 	if err := s.eventService.PublishEvent(RoleEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = s.eventService.RetryPublish(RoleEventTopic, pubEvent)
+			retryErr := s.eventService.RetryPublish(RoleEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
@@ -174,14 +166,12 @@ func (s *RoleService) Delete(roleToDelete rbac.Role) error {
 
 	pubEvent := event.NewDeleteEvent(roleToDelete.ID())
 	if err := s.eventService.PublishEvent(RoleEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = s.eventService.RetryPublish(RoleEventTopic, pubEvent)
+			retryErr := s.eventService.RetryPublish(RoleEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 	return nil
 }
@@ -195,14 +185,12 @@ func (s *RoleService) Update(roleToUpdate rbac.Role) error {
 
 	pubEvent := event.NewUpdateEvent(roleToUpdate.ID())
 	if err := s.eventService.PublishEvent(RoleEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = s.eventService.RetryPublish(RoleEventTopic, pubEvent)
+			retryErr := s.eventService.RetryPublish(RoleEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
diff --git a/controller/topology/nodes/nodeService.go b/controller/topology/nodes/nodeService.go
index c77e80421..b72dbbc5c 100644
--- a/controller/topology/nodes/nodeService.go
+++ b/controller/topology/nodes/nodeService.go
@@ -62,14 +62,12 @@ func (n *NodeService) createNode(node Node) (Node, error) {
 
 	pubEvent := event.NewAddEvent(node.ID)
 	if err := n.eventService.PublishEvent(NodeEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = n.eventService.RetryPublish(NodeEventTopic, pubEvent)
+			retryErr := n.eventService.RetryPublish(NodeEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return node, nil
@@ -84,14 +82,12 @@ func (n *NodeService) Update(node Node) error {
 
 	pubEvent := event.NewUpdateEvent(node.ID)
 	if err := n.eventService.PublishEvent(NodeEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = n.eventService.RetryPublish(NodeEventTopic, pubEvent)
+			retryErr := n.eventService.RetryPublish(NodeEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
@@ -106,14 +102,12 @@ func (n *NodeService) Delete(node Node) error {
 
 	pubEvent := event.NewDeleteEvent(node.ID)
 	if err := n.eventService.PublishEvent(NodeEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = n.eventService.RetryPublish(NodeEventTopic, pubEvent)
+			retryErr := n.eventService.RetryPublish(NodeEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
diff --git a/controller/topology/ports/portService.go b/controller/topology/ports/portService.go
index 971a98eb8..28ad38a80 100644
--- a/controller/topology/ports/portService.go
+++ b/controller/topology/ports/portService.go
@@ -60,14 +60,12 @@ func (p *PortService) createPort(port Port) (Port, error) {
 
 	pubEvent := event.NewAddEvent(port.ID)
 	if err := p.eventService.PublishEvent(PortEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = p.eventService.RetryPublish(PortEventTopic, pubEvent)
+			retryErr := p.eventService.RetryPublish(PortEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return port, nil
@@ -82,14 +80,12 @@ func (p *PortService) Update(port Port) error {
 
 	pubEvent := event.NewUpdateEvent(port.ID)
 	if err := p.eventService.PublishEvent(PortEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = p.eventService.RetryPublish(PortEventTopic, pubEvent)
+			retryErr := p.eventService.RetryPublish(PortEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
@@ -104,14 +100,12 @@ func (p *PortService) Delete(port Port) error {
 
 	pubEvent := event.NewDeleteEvent(port.ID)
 	if err := p.eventService.PublishEvent(PortEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = p.eventService.RetryPublish(PortEventTopic, pubEvent)
+			retryErr := p.eventService.RetryPublish(PortEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
diff --git a/controller/topology/routing-tables/routingTableService.go b/controller/topology/routing-tables/routingTableService.go
index eefebff39..0e2cba26d 100644
--- a/controller/topology/routing-tables/routingTableService.go
+++ b/controller/topology/routing-tables/routingTableService.go
@@ -70,14 +70,12 @@ func (r *RoutingTableService) createRoutingTable(routingTable RoutingTable) (Rou
 
 	pubEvent := event.NewAddEvent(routingTable.ID)
 	if err := r.eventService.PublishEvent(RoutingTableEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = r.eventService.RetryPublish(RoutingTableEventTopic, pubEvent)
+			retryErr := r.eventService.RetryPublish(RoutingTableEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return routingTable, nil
@@ -92,14 +90,12 @@ func (r *RoutingTableService) Update(routingTable RoutingTable) error {
 
 	pubEvent := event.NewUpdateEvent(routingTable.ID)
 	if err := r.eventService.PublishEvent(RoutingTableEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = r.eventService.RetryPublish(RoutingTableEventTopic, pubEvent)
+			retryErr := r.eventService.RetryPublish(RoutingTableEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
@@ -114,14 +110,12 @@ func (r *RoutingTableService) Delete(routingTable RoutingTable) error {
 
 	pubEvent := event.NewDeleteEvent(routingTable.ID)
 	if err := r.eventService.PublishEvent(RoutingTableEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = r.eventService.RetryPublish(RoutingTableEventTopic, pubEvent)
+			retryErr := r.eventService.RetryPublish(RoutingTableEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
diff --git a/controller/topology/topologyService.go b/controller/topology/topologyService.go
index 6bda2fd5c..f0743fbf8 100644
--- a/controller/topology/topologyService.go
+++ b/controller/topology/topologyService.go
@@ -76,14 +76,12 @@ func (t *service) AddLink(link links.Link) error {
 
 	pubEvent := event.NewAddEvent(link.ID)
 	if err := t.eventService.PublishEvent(LinkEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = t.eventService.RetryPublish(LinkEventTopic, pubEvent)
+			retryErr := t.eventService.RetryPublish(LinkEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
@@ -98,14 +96,12 @@ func (t *service) UpdateLink(link links.Link) error {
 
 	pubEvent := event.NewUpdateEvent(link.ID)
 	if err := t.eventService.PublishEvent(LinkEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = t.eventService.RetryPublish(LinkEventTopic, pubEvent)
+			retryErr := t.eventService.RetryPublish(LinkEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
@@ -122,14 +118,12 @@ func (t *service) DeleteLink(link links.Link) error {
 
 	pubEvent := event.NewDeleteEvent(link.ID)
 	if err := t.eventService.PublishEvent(LinkEventTopic, pubEvent); err != nil {
-		var retryErr error
 		go func() {
-			retryErr = t.eventService.RetryPublish(LinkEventTopic, pubEvent)
+			retryErr := t.eventService.RetryPublish(LinkEventTopic, pubEvent)
+			if retryErr != nil {
+				log.Error(retryErr)
+			}
 		}()
-
-		if retryErr != nil {
-			log.Error(retryErr)
-		}
 	}
 
 	return nil
-- 
GitLab