NOISSUE - Remove redundant retry logic (#293)

* remove redundant logic

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* fix test

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* remove line

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* fix internal tests

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* add test cases

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

* all pb files

Signed-off-by: Sammy Oina <sammyoina@gmail.com>

---------

Signed-off-by: Sammy Oina <sammyoina@gmail.com>
This commit is contained in:
Sammy Kerata Oina
2024-10-31 17:46:56 +03:00
committed by GitHub
parent 69b8dfa3ea
commit 534ad91623
9 changed files with 242 additions and 201 deletions
+10 -62
View File
@@ -5,42 +5,28 @@ package events
import (
"encoding/json"
"io"
"sync"
"time"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/types/known/timestamppb"
)
const retryInterval = 5 * time.Second
type service struct {
service string
computationID string
conn io.Writer
cachedMessages [][]byte
mutex sync.Mutex
stopRetry chan struct{}
service string
computationID string
conn io.Writer
}
//go:generate mockery --name Service --output=./mocks --filename events.go --quiet --note "Copyright (c) Ultraviolet \n // SPDX-License-Identifier: Apache-2.0"
type Service interface {
SendEvent(event, status string, details json.RawMessage) error
Close()
}
func New(svc, computationID string, conn io.Writer) (Service, error) {
s := &service{
service: svc,
computationID: computationID,
conn: conn,
cachedMessages: make([][]byte, 0),
stopRetry: make(chan struct{}),
}
go s.periodicRetry()
return s, nil
return &service{
service: svc,
computationID: computationID,
conn: conn,
}, nil
}
func (s *service) SendEvent(event, status string, details json.RawMessage) error {
@@ -56,44 +42,6 @@ func (s *service) SendEvent(event, status string, details json.RawMessage) error
if err != nil {
return err
}
s.mutex.Lock()
defer s.mutex.Unlock()
if _, err := s.conn.Write(protoBody); err != nil {
s.cachedMessages = append(s.cachedMessages, protoBody)
return err
}
return nil
}
func (s *service) periodicRetry() {
ticker := time.NewTicker(retryInterval)
defer ticker.Stop()
for {
select {
case <-ticker.C:
s.retrySendCachedMessages()
case <-s.stopRetry:
return
}
}
}
func (s *service) retrySendCachedMessages() {
s.mutex.Lock()
defer s.mutex.Unlock()
tmp := [][]byte{}
for _, msg := range s.cachedMessages {
if _, err := s.conn.Write(msg); err != nil {
tmp = append(tmp, msg)
}
}
s.cachedMessages = tmp
}
func (s *service) Close() {
close(s.stopRetry)
_, err = s.conn.Write(protoBody)
return err
}
-17
View File
@@ -61,21 +61,4 @@ func TestSendEventFailure(t *testing.T) {
err = svc.SendEvent("test_event", "failure", details)
assert.Error(t, err)
assert.Equal(t, "write error", err.Error())
assert.Len(t, svc.(*service).cachedMessages, 1)
}
func TestClose(t *testing.T) {
mockConnection := &mockConn{}
svc, err := New("test_service", "12345", mockConnection)
assert.NoError(t, err)
svc.Close()
time.Sleep(1 * time.Second)
details := json.RawMessage(`{"key": "value"}`)
err = svc.SendEvent("test_event", "success", details)
assert.NoError(t, err)
}