diff --git a/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt b/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt index 6fd687ed..54fdad75 100644 --- a/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt +++ b/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt @@ -1345,10 +1345,14 @@ class TssRepository @Inject constructor( _sessionStatus.value = SessionStatus.IN_PROGRESS // Mark ready - with retry on optimistic lock conflict + var markReadySuccess = false repeat(5) { attempt -> + if (markReadySuccess) return@repeat // Already succeeded, skip remaining attempts + val markReadyResult = grpcClient.markPartyReady(sessionId, partyId) if (markReadyResult.isSuccess) { android.util.Log.d("TssRepository", "markPartyReady successful on attempt ${attempt + 1}") + markReadySuccess = true return@repeat } val error = markReadyResult.exceptionOrNull() @@ -1359,6 +1363,14 @@ class TssRepository @Inject constructor( } } + // Check if any attempt succeeded + if (!markReadySuccess) { + android.util.Log.e("TssRepository", "All markPartyReady attempts failed") + stopProgressCollection() + _sessionStatus.value = SessionStatus.FAILED + return@coroutineScope Result.failure(Exception("Failed to mark party ready after 5 attempts")) + } + // Wait for keygen result val keygenResult = tssNativeBridge.waitForKeygenResult(password) if (keygenResult.isFailure) { @@ -2149,6 +2161,8 @@ class TssRepository @Inject constructor( // Mark ready - with retry on optimistic lock conflict var markReadySuccess = false repeat(5) { attempt -> + if (markReadySuccess) return@repeat // Already succeeded, skip remaining attempts + val markReadyResult = grpcClient.markPartyReady(sessionId, partyId) if (markReadyResult.isSuccess) { android.util.Log.d("TssRepository", "Successfully marked party ready on attempt ${attempt + 1}") @@ -2162,19 +2176,15 @@ class TssRepository @Inject constructor( if (error?.message?.contains("optimistic lock conflict") == true && attempt < 4) { android.util.Log.d("TssRepository", "Optimistic lock conflict detected, retrying after ${(attempt + 1) * 500}ms...") delay((attempt + 1) * 500L) // 500ms, 1s, 1.5s, 2s - } else if (attempt == 4) { - // Last attempt failed, return error - stopProgressCollection() - _sessionStatus.value = SessionStatus.FAILED - return@coroutineScope Result.failure(Exception("Failed to mark party ready after 5 attempts: ${error?.message}")) } } } if (!markReadySuccess) { + android.util.Log.e("TssRepository", "All markPartyReady attempts failed") stopProgressCollection() _sessionStatus.value = SessionStatus.FAILED - return@coroutineScope Result.failure(Exception("Failed to mark party ready")) + return@coroutineScope Result.failure(Exception("Failed to mark party ready after 5 attempts")) } // Wait for keygen result