From 6276927294c6f2447db9c3af25eaa144ed2229bd Mon Sep 17 00:00:00 2001
From: Claudio Jeker <claudio@openbsd.org>
Date: Thu, 21 Dec 2023 11:08:32 +0100
Subject: [PATCH] Simplify the serial number handling before making it more
 complex again

Just because there are slices and maps you don't need to use them for
something as simple (myserial - theirserial) to know which delta to send.
---
 cmd/stayrtr/stayrtr.go |  1 -
 lib/server.go          | 79 +++++++++---------------------------------
 2 files changed, 16 insertions(+), 64 deletions(-)

diff --git a/cmd/stayrtr/stayrtr.go b/cmd/stayrtr/stayrtr.go
index cbcbc5a..dd5e01a 100644
--- a/cmd/stayrtr/stayrtr.go
+++ b/cmd/stayrtr/stayrtr.go
@@ -477,7 +477,6 @@ func (s *state) applyUpdateFromNewState(vrps []rtr.VRP, brks []rtr.BgpsecKey, va
 		BgpSecKeys: brksjson,
 		ASPA:       aspajson,
 	}
-
 	s.lockJson.Unlock()
 
 	if s.metricsEvent != nil {
diff --git a/lib/server.go b/lib/server.go
index 514a5b5..a397a64 100644
--- a/lib/server.go
+++ b/lib/server.go
@@ -137,8 +137,6 @@ type Server struct {
 
 	sdlock          *sync.RWMutex
 	sdListDiff      [][]SendableData
-	sdMapSerial     map[uint32]int
-	sdListSerial    []uint32
 	sdCurrent       []SendableData
 	sdCurrentSerial uint32
 	keepDiff        int
@@ -186,8 +184,6 @@ func NewServer(configuration ServerConfiguration, handler RTRServerEventHandler,
 	return &Server{
 		sdlock:       &sync.RWMutex{},
 		sdListDiff:   make([][]SendableData, 0),
-		sdMapSerial:  make(map[uint32]int),
-		sdListSerial: make([]uint32, 0),
 		sdCurrent:    make([]SendableData, 0),
 		keepDiff:     configuration.KeepDifference,
 
@@ -303,13 +299,16 @@ func (s *Server) getSDsSerialDiff(serial uint32) ([]SendableData, bool) {
 	if serial == s.sdCurrentSerial {
 		return []SendableData{}, true
 	}
-
-	sd := make([]SendableData, 0)
-	index, ok := s.sdMapSerial[serial]
-	if ok {
-		sd = s.sdListDiff[index]
+	if serial > s.sdCurrentSerial {
+		return nil, false
 	}
-	return sd, ok
+	diff := int(s.sdCurrentSerial - serial)
+	if diff > len(s.sdListDiff) {
+		return nil, false
+	}
+
+	sd := s.sdListDiff[len(s.sdListDiff) - diff]
+	return sd, true
 }
 
 func (s *Server) GetCurrentSerial(sessId uint16) (uint32, bool) {
@@ -320,37 +319,17 @@ func (s *Server) GetCurrentSerial(sessId uint16) (uint32, bool) {
 }
 
 func (s *Server) getCurrentSerial() (uint32, bool) {
-	return s.sdCurrentSerial, len(s.sdListSerial) > 0
-}
-
-func (s *Server) GenerateSerial() uint32 {
-	s.sdlock.RLock()
-	newserial := s.generateSerial()
-	s.sdlock.RUnlock()
-	return newserial
+	return s.sdCurrentSerial, len(s.sdCurrent) > 0
 }
 
 func (s *Server) generateSerial() uint32 {
 	newserial := s.sdCurrentSerial
-	if len(s.sdListSerial) > 0 {
-		newserial = s.sdListSerial[len(s.sdListSerial)-1] + 1
+	if len(s.sdCurrent) > 0 {
+		newserial++
 	}
 	return newserial
 }
 
-func (s *Server) setSerial(serial uint32) {
-	s.sdCurrentSerial = serial
-}
-
-// This function sets the serial. Function must
-// be called before the cache data is added.
-func (s *Server) SetSerial(serial uint32) {
-	s.sdlock.RLock()
-	defer s.sdlock.RUnlock()
-	//s.sdListSerial = make([]uint32, 0)
-	s.setSerial(serial)
-}
-
 func (s *Server) CountSDs() int {
 	s.sdlock.RLock()
 	defer s.sdlock.RUnlock()
@@ -378,53 +357,27 @@ func (s *Server) AddData(new []SendableData) bool {
 	}
 }
 
-func (s *Server) addSerial(serial uint32) []uint32 {
-	removed := make([]uint32, 0)
-	if len(s.sdListSerial) >= s.keepDiff && s.keepDiff > 0 {
-		removeDiff := len(s.sdListSerial) - s.keepDiff
-		removed = s.sdListSerial[0:removeDiff]
-		s.sdListSerial = s.sdListSerial[removeDiff:]
-	}
-	s.sdListSerial = append(s.sdListSerial, serial)
-	return removed
-}
-
 func (s *Server) AddSDsDiff(diff []SendableData) {
 	s.sdlock.RLock()
-	nextDiff := make([][]SendableData, len(s.sdListDiff))
+	nextDiff := make([][]SendableData, len(s.sdListDiff) + 1)
 	for i, prevSDs := range s.sdListDiff {
 		nextDiff[i] = ApplyDiff(diff, prevSDs)
 	}
 	newSDCurrent := ApplyDiff(diff, s.sdCurrent)
-	curserial, _ := s.getCurrentSerial()
 	s.sdlock.RUnlock()
 
 	s.sdlock.Lock()
 	defer s.sdlock.Unlock()
 	newserial := s.generateSerial()
-	removed := s.addSerial(newserial)
 
 	nextDiff = append(nextDiff, diff)
-	if len(nextDiff) >= s.keepDiff && s.keepDiff > 0 {
-		nextDiff = nextDiff[len(removed):]
+	if s.keepDiff > 0 && len(nextDiff) > s.keepDiff {
+		nextDiff = nextDiff[len(nextDiff) - s.keepDiff:]
 	}
 
-	s.sdMapSerial[curserial] = len(nextDiff) - 1
-
-	if len(removed) > 0 {
-		for k, v := range s.sdMapSerial {
-			if k != curserial {
-				s.sdMapSerial[k] = v - len(removed)
-			}
-		}
-	}
-
-	for _, removeSerial := range removed {
-		delete(s.sdMapSerial, removeSerial)
-	}
 	s.sdListDiff = nextDiff
 	s.sdCurrent = newSDCurrent
-	s.setSerial(newserial)
+	s.sdCurrentSerial = newserial
 }
 
 func (s *Server) SetBaseVersion(version uint8) {