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