Skip to content

Commit

Permalink
PWN-999 - Retry on socket referral exception (#2207)
Browse files Browse the repository at this point in the history
  • Loading branch information
gslevinkov authored Feb 20, 2024
1 parent 21d4682 commit 472345b
Showing 1 changed file with 30 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ package org.p2p.wallet.referral.repository
import com.google.gson.Gson
import org.near.borshj.BorshBuffer
import timber.log.Timber
import java.net.SocketTimeoutException
import java.net.URI
import java.util.Optional
import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.Duration.Companion.seconds
import kotlinx.coroutines.withContext
import org.p2p.core.dispatchers.CoroutineDispatchers
import org.p2p.core.rpc.JsonRpc
Expand All @@ -17,6 +19,7 @@ import org.p2p.solanaj.utils.SolanaMessageSigner
import org.p2p.wallet.auth.gateway.repository.mapper.write
import org.p2p.wallet.common.feature_toggles.toggles.remote.ReferralProgramEnabledFeatureToggle
import org.p2p.wallet.infrastructure.network.provider.TokenKeyProvider
import org.p2p.wallet.utils.retryOnException

class ReferralRemoteRepository(
private val api: RpcApi,
Expand All @@ -29,9 +32,23 @@ class ReferralRemoteRepository(

private val url = URI("https://referral.key.app/")

/**
* Sometimes the service responds with the timeout error `operation timed out`
*
*/
private class ReferralServiceTimedOut : Exception()

override suspend fun registerReferent() {
if (referralEnabledFt.isFeatureEnabled) {
registerReferentInternal()
retryOnException(
exceptionTypes = setOf(
ReferralServiceTimedOut::class,
SocketTimeoutException::class
),
maxAttempts = 10,
delayMillis = 5.seconds.inWholeMilliseconds,
block = ::registerReferentInternal
)
}
}

Expand All @@ -57,11 +74,19 @@ class ReferralRemoteRepository(
request.parseResponse(response, gson)
} catch (rpcError: JsonRpc.ResponseError) {
val message = rpcError.message ?: return
if (message.contains("duplicate key value violates unique constraint")) {
Timber.i("User already registered")
} else {
Timber.e(rpcError, "Failed to register referent")
when {
message.contains("duplicate key value violates unique constraint") -> {
Timber.i("User already registered")
}
message.contains("timed out") -> {
throw ReferralServiceTimedOut()
}
else -> {
Timber.e(rpcError, "Failed to register referent")
}
}
} catch (error: SocketTimeoutException) {
throw error
} catch (error: Throwable) {
Timber.e(error, "Failed to register referent")
}
Expand Down

0 comments on commit 472345b

Please sign in to comment.