chore: Handle conversation participation creation race condition error (#9449)

We observed some race condition errors in the conversation participation listener while trying to create a conversation participation assignment. This PR handles this error and also adds additional debug information for future.

fixes: https://linear.app/chatwoot/issue/CW-3296/activerecordrecordnotunique-pguniqueviolation-error-duplicate-key

## Changelog

- handles `ActiveRecord::RecordNotUnique, ActiveRecord::RecordInvald` errors so that they won't pollute sentry
- Adds a debug statement to log the cases
- Add previous_changes into the dispatcher so that we know the exact attribute changes which trigger `assignee_changed, team_changed` events ( would be handy in future )
This commit is contained in:
Sojan Jose
2024-05-10 12:21:23 -07:00
committed by GitHub
parent dd1f93d425
commit 9a8442fe0e
4 changed files with 24 additions and 5 deletions

View File

@@ -3,6 +3,13 @@ class ParticipationListener < BaseListener
def assignee_changed(event)
conversation, _account = extract_conversation_and_account(event)
conversation.conversation_participants.find_or_create_by!(user_id: conversation.assignee_id) if conversation.assignee_id.present?
return if conversation.assignee_id.blank?
conversation.conversation_participants.find_or_create_by!(user_id: conversation.assignee_id)
# We have observed race conditions triggering these errors
# example: Assignment happening via automation, while auto assignment is also configured.
rescue ActiveRecord::RecordNotUnique, ActiveRecord::RecordInvalid
Rails.logger.warn "Failed to create conversation participant for account #{conversation.account.id} " \
": user #{conversation.assignee_id} : conversation #{conversation.id}"
end
end

View File

@@ -32,7 +32,7 @@ module AssignmentHandler
ASSIGNEE_CHANGED => -> { saved_change_to_assignee_id? },
TEAM_CHANGED => -> { saved_change_to_team_id? }
}.each do |event, condition|
condition.call && dispatcher_dispatch(event)
condition.call && dispatcher_dispatch(event, previous_changes)
end
end