Skip to content

Commit

Permalink
fix: infinite loop on message send failure
Browse files Browse the repository at this point in the history
  • Loading branch information
Garzas committed Dec 22, 2023
1 parent d911835 commit cd2c7b6
Showing 1 changed file with 23 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,8 @@ internal class MessageSenderImpl internal constructor(

private suspend fun attemptToSendWithProteus(
message: Message.Sendable,
messageTarget: MessageTarget
messageTarget: MessageTarget,
retryCount: Int = 0
): Either<CoreFailure, String> {
val conversationId = message.conversationId
val target = when (messageTarget) {
Expand All @@ -272,7 +273,7 @@ internal class MessageSenderImpl internal constructor(
is MessageTarget.Conversation ->
MessageTarget.Conversation((messageTarget.usersToIgnore + usersWithoutSessions.users).toSet())
}
trySendingProteusEnvelope(envelope, message, updatedMessageTarget)
trySendingProteusEnvelope(envelope, message, updatedMessageTarget, retryCount = retryCount + 1)
}
}
}
Expand Down Expand Up @@ -347,13 +348,20 @@ internal class MessageSenderImpl internal constructor(
private suspend fun trySendingProteusEnvelope(
envelope: MessageEnvelope,
message: Message.Sendable,
messageTarget: MessageTarget
messageTarget: MessageTarget,
retryCount: Int = 0
): Either<CoreFailure, String> =
messageRepository
.sendEnvelope(message.conversationId, envelope, messageTarget)
.fold({
handleProteusError(it, "Send", message.toLogString(), message.conversationId) {
attemptToSendWithProteus(message, messageTarget)
handleProteusError(
failure = it,
action = "Send",
messageLogString = message.toLogString(),
conversationId = message.conversationId,
retryCount = retryCount + 1
) {
attemptToSendWithProteus(message, messageTarget, retryCount + 1)
}
}, { messageSent ->
logger.i("Message Send Success: { \"message\" : \"${message.toLogString()}\" }")
Expand Down Expand Up @@ -391,6 +399,7 @@ internal class MessageSenderImpl internal constructor(
action: String, // Send or Broadcast
messageLogString: String,
conversationId: ConversationId?,
retryCount: Int = 0,
retry: suspend () -> Either<CoreFailure, String>
) =
when (failure) {
Expand All @@ -402,7 +411,11 @@ internal class MessageSenderImpl internal constructor(
.handleClientsHaveChangedFailure(failure, conversationId)
.flatMap {
logger.w("Retrying After Proteus $action Failure: { \"message\" : \"${messageLogString}\"}")
retry()
if (retryCount <= MAX_RETRY_COUNT) {
retry()
} else {
Either.Left(failure)
}
}
.onFailure {
val logLine = "Fatal Proteus $action Failure: { \"message\" : \"${messageLogString}\"" +
Expand Down Expand Up @@ -479,4 +492,8 @@ internal class MessageSenderImpl internal constructor(
messageRepository.persistRecipientsDeliveryFailure(message.conversationId, message.id, messageSent.failedToConfirmClients)
}

companion object {
const val MAX_RETRY_COUNT: Int = 1
}

}

0 comments on commit cd2c7b6

Please sign in to comment.