Skip to content

Commit 1ff68a8

Browse files
committed
eventstream: clean up mutex locks
First, the last event's timestamp will now be fetched before entering the checkMissedStateChanges resp. checkMissedAcknowledgements method four times, which shouldn't be a problem.. unless it becomes one. Also to clearly signal what should be locked, the initial declarations in the Process method were protected, even when not necessary.
1 parent d68373d commit 1ff68a8

File tree

2 files changed

+15
-13
lines changed

2 files changed

+15
-13
lines changed

internal/eventstream/client.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,11 @@ func (client *Client) handleEvent(ev *event.Event, source string) {
193193
// loop takes care of reconnections, all those events will be logged while generated Events will be dispatched to the
194194
// callback function.
195195
func (client *Client) Process() {
196+
client.eventsHandlerMutex.Lock()
196197
client.eventsRingBuffer = make([]uint64, 1024)
197198
client.eventsRingBufferPos = 0
199+
client.eventsLastTs = time.Time{}
200+
client.eventsHandlerMutex.Unlock()
198201

199202
defer client.Logger.Info("Event Stream Client has stopped")
200203

@@ -220,9 +223,13 @@ func (client *Client) Process() {
220223
client.Logger.Errorf("Cannot reestablish an API connection: %v", err)
221224
}
222225

223-
go client.checkMissedStateChanges("host")
224-
go client.checkMissedStateChanges("service")
225-
go client.checkMissedAcknowledgements("host")
226-
go client.checkMissedAcknowledgements("service")
226+
client.eventsHandlerMutex.RLock()
227+
lastEventTime := client.eventsLastTs
228+
client.eventsHandlerMutex.RUnlock()
229+
230+
go client.checkMissedStateChanges("host", lastEventTime)
231+
go client.checkMissedStateChanges("service", lastEventTime)
232+
go client.checkMissedAcknowledgements("host", lastEventTime)
233+
go client.checkMissedAcknowledgements("service", lastEventTime)
227234
}
228235
}

internal/eventstream/client_api.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -193,11 +193,8 @@ func (client *Client) checkMissedChanges(objType, filterExpr string, attrsCallba
193193
}
194194

195195
// checkMissedStateChanges fetches missed Host or Service state changes and feeds them into the handler.
196-
func (client *Client) checkMissedStateChanges(objType string) {
197-
client.eventsHandlerMutex.RLock()
198-
filterExpr := fmt.Sprintf("%s.last_state_change>%f",
199-
objType, float64(client.eventsLastTs.UnixMicro())/1_000_000.0)
200-
client.eventsHandlerMutex.RUnlock()
196+
func (client *Client) checkMissedStateChanges(objType string, since time.Time) {
197+
filterExpr := fmt.Sprintf("%s.last_state_change>%f", objType, float64(since.UnixMicro())/1_000_000.0)
201198

202199
client.checkMissedChanges(objType, filterExpr, func(attrs *HostServiceRuntimeAttributes, host, service string) {
203200
ev, err := client.buildHostServiceEvent(attrs.LastCheckResult, attrs.State, host, service)
@@ -211,11 +208,9 @@ func (client *Client) checkMissedStateChanges(objType string) {
211208
}
212209

213210
// checkMissedAcknowledgements fetches missed set Host or Service Acknowledgements and feeds them into the handler.
214-
func (client *Client) checkMissedAcknowledgements(objType string) {
215-
client.eventsHandlerMutex.RLock()
211+
func (client *Client) checkMissedAcknowledgements(objType string, since time.Time) {
216212
filterExpr := fmt.Sprintf("%s.acknowledgement && %s.acknowledgement_last_change>%f",
217-
objType, objType, float64(client.eventsLastTs.UnixMicro())/1_000_000.0)
218-
client.eventsHandlerMutex.RUnlock()
213+
objType, objType, float64(since.UnixMicro())/1_000_000.0)
219214

220215
client.checkMissedChanges(objType, filterExpr, func(attrs *HostServiceRuntimeAttributes, host, service string) {
221216
ackComment, err := client.fetchAcknowledgementComment(host, service, attrs.AcknowledgementLastChange.Time)

0 commit comments

Comments
 (0)