fix: better event loop error handling

This commit is contained in:
James Houlahan 2020-04-14 15:21:00 +02:00 committed by Jakub Cuth
parent aea816029f
commit 91ec7edc06
2 changed files with 18 additions and 18 deletions

View File

@ -394,7 +394,7 @@ func (loop *eventLoop) processLabels(eventLog *logrus.Entry, labels []*pmapi.Eve
return nil
}
func (loop *eventLoop) processMessages(eventLog *logrus.Entry, messages []*pmapi.EventMessage) (err error) {
func (loop *eventLoop) processMessages(eventLog *logrus.Entry, messages []*pmapi.EventMessage) (err error) { // nolint[funlen]
eventLog.Debug("Processing message change event")
for _, message := range messages {
@ -422,18 +422,23 @@ func (loop *eventLoop) processMessages(eventLog *logrus.Entry, messages []*pmapi
}
var msg *pmapi.Message
msg, err = loop.store.getMessageFromDB(message.ID)
if err == ErrNoSuchAPIID {
msgLog.WithError(err).Warning("Cannot get message from DB for updating. Trying fetch...")
msg, err = loop.store.fetchMessage(message.ID)
// If message does not exist anywhere, update event is probably old and off topic - skip it.
if err == ErrNoSuchAPIID {
msgLog.Warn("Skipping message update, because message does not exist nor in local DB or on API")
continue
if msg, err = loop.store.getMessageFromDB(message.ID); err != nil {
if err != ErrNoSuchAPIID {
return errors.Wrap(err, "failed to get message from DB for updating")
}
msgLog.WithError(err).Warning("Message was not present in DB. Trying fetch...")
if msg, err = loop.store.fetchMessage(message.ID); err != nil {
if err != pmapi.ErrAPINotReachable {
msgLog.WithError(err).Warn("Skipping message update because message exists neither in local DB nor on API")
err = nil
continue
}
return errors.Wrap(err, "failed to get message from API for updating")
}
}
if err != nil {
return errors.Wrap(err, "failed to get message from DB for updating")
}
updateMessage(msgLog, msg, message.Updated)

View File

@ -147,12 +147,7 @@ func (store *Store) getMessageFromDB(apiID string) (msg *pmapi.Message, err erro
// NOTE: Do not update the database here to prevent issues (extreme edge case).
// The database will be updated by the event loop anyway.
func (store *Store) fetchMessage(apiID string) (msg *pmapi.Message, err error) {
if msg, err = store.api.GetMessage(apiID); err != nil {
if err.Error() == "Message does not exist" {
return nil, ErrNoSuchAPIID
}
}
return
return store.api.GetMessage(apiID)
}
func (store *Store) txGetMessage(tx *bolt.Tx, apiID string) (*pmapi.Message, error) {