From 4b0b5910defb75b9fc861c64f1516bf1bb97c5bb Mon Sep 17 00:00:00 2001 From: Mert Safter <69803294+MertSafter@users.noreply.github.com> Date: Fri, 25 Sep 2020 08:32:46 +0200 Subject: [PATCH] =?UTF-8?q?Make=20transaction=20timeout=20settable=20per?= =?UTF-8?q?=20transaction.=20Increase=20Risk=20Leve=E2=80=A6=20(#1227)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Make transaction timeout settable per transaction. Increase Risk Level Calc transaction * Make timeout more readable --- .../transaction/RiskLevelTransaction.kt | 11 ++++++++++- .../de/rki/coronawarnapp/transaction/Transaction.kt | 13 +++---------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RiskLevelTransaction.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RiskLevelTransaction.kt index 4629e0eb7..e11e39327 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RiskLevelTransaction.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RiskLevelTransaction.kt @@ -135,6 +135,12 @@ object RiskLevelTransaction : Transaction() { // Injecting here will break Test private val riskLevelCalculation: RiskLevelCalculation = DefaultRiskLevelCalculation() + /** + * The maximal runtime of the Risk Level transaction + * In milliseconds + */ + private const val RISK_LEVEL_TRANSACTION_TIMEOUT = 480 * 1000L + // @Inject lateinit var riskScoreAnalysis: RiskScoreAnalysis // TODO pass instance of this to constructor as soon as RiskLevelTransaction is converted to a class // Injecting here will break Test @@ -190,7 +196,10 @@ object RiskLevelTransaction : Transaction() { } /** initiates the transaction. This suspend function guarantees a successful transaction once completed. */ - suspend fun start() = lockAndExecute(scope = transactionScope) { + suspend fun start() = lockAndExecute( + scope = transactionScope, + timeout = RISK_LEVEL_TRANSACTION_TIMEOUT + ) { /**************************************************** * CHECK [NO_CALCULATION_POSSIBLE_TRACING_OFF] CONDITIONS ****************************************************/ diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/Transaction.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/Transaction.kt index a732d93fb..e206e1a2a 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/Transaction.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/Transaction.kt @@ -49,15 +49,6 @@ import kotlin.system.measureTimeMillis */ abstract class Transaction { - companion object { - /** - * Transaction Timeout in Milliseconds, used to cancel any Transactions that run into never ending execution - * (e.g. due to a coroutine not being cancelled properly or an exception leading to unchecked behavior) - */ - private val TRANSACTION_TIMEOUT_MS: Long - get() = TimeVariables.getTransactionTimeout() - } - @Suppress("VariableNaming", "PropertyName") // Done as the Convention is TAG for every class abstract val TAG: String? @@ -189,6 +180,7 @@ abstract class Transaction { * * @param unique Executes the transaction as Unique. This results in the next execution being omitted in case of a race towards the lock. * @param block the suspending function that should be used to execute the transaction. + * @param timeout the timeout for the transcation (in milliseconds) * @throws TransactionException the exception that wraps around any error that occurs inside the lock. * * @see executeState @@ -197,6 +189,7 @@ abstract class Transaction { suspend fun lockAndExecute( unique: Boolean = false, scope: CoroutineScope, + timeout: Long = TimeVariables.getTransactionTimeout(), block: suspend CoroutineScope.() -> Unit ) { @@ -213,7 +206,7 @@ abstract class Transaction { executeState(INIT) { transactionId.set(UUID.randomUUID()) } val duration = measureTimeMillis { - withTimeout(TRANSACTION_TIMEOUT_MS) { + withTimeout(timeout) { block.invoke(this) } } -- GitLab