← Back to team overview

canonical-ubuntu-qa team mailing list archive

[Merge] ~andersson123/autopkgtest-cloud:d-r-d-a-r-handle-simultaneous-write into autopkgtest-cloud:master

 

Tim Andersson has proposed merging ~andersson123/autopkgtest-cloud:d-r-d-a-r-handle-simultaneous-write into autopkgtest-cloud:master.

Requested reviews:
  Canonical's Ubuntu QA (canonical-ubuntu-qa)

For more details, see:
https://code.launchpad.net/~andersson123/autopkgtest-cloud/+git/autopkgtest-cloud/+merge/460498
-- 
Your team Canonical's Ubuntu QA is requested to review the proposed merge of ~andersson123/autopkgtest-cloud:d-r-d-a-r-handle-simultaneous-write into autopkgtest-cloud:master.
diff --git a/charms/focal/autopkgtest-web/webcontrol/download-all-results b/charms/focal/autopkgtest-web/webcontrol/download-all-results
index 97f40a5..60161e9 100755
--- a/charms/focal/autopkgtest-web/webcontrol/download-all-results
+++ b/charms/focal/autopkgtest-web/webcontrol/download-all-results
@@ -21,6 +21,7 @@ import sys
 import tarfile
 import time
 import urllib.parse
+from random import randrange
 from urllib.request import urlopen
 
 from distro_info import UbuntuDistroInfo
@@ -181,25 +182,36 @@ def fetch_one_result(url):
         if env in testinfo.keys():
             env_vars.append(spec)
 
-    try:
-        c = db_con.cursor()
-        c.execute(
-            "INSERT INTO result VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
-            (
-                test_id,
-                run_id,
-                ver,
-                test_triggers,
-                duration,
-                exitcode,
-                requester,
-                ",".join(env_vars),
-                test_uuid,
-            ),
-        )
-        db_con.commit()
-    except sqlite3.IntegrityError:
-        LOGGER.info("%s was already recorded - skipping", run_id)
+    while True:
+        try:
+            c = db_con.cursor()
+            c.execute(
+                "INSERT INTO result VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
+                (
+                    test_id,
+                    run_id,
+                    ver,
+                    test_triggers,
+                    duration,
+                    exitcode,
+                    requester,
+                    ",".join(env_vars),
+                    test_uuid,
+                ),
+            )
+            db_con.commit()
+            break
+        except sqlite3.IntegrityError as e:
+            if "database is locked" in str(e):
+                sleep_time = randrange(1, 10)
+                logging.info(
+                    "database is currently locked, waiting %s seconds and trying again..."
+                    % sleep_time
+                )
+                time.sleep(sleep_time)
+            else:
+                LOGGER.info("%s was already recorded - skipping", run_id)
+                break
 
 
 def fetch_container(release, container_url):
diff --git a/charms/focal/autopkgtest-web/webcontrol/download-results b/charms/focal/autopkgtest-web/webcontrol/download-results
index 9942437..09316ae 100755
--- a/charms/focal/autopkgtest-web/webcontrol/download-results
+++ b/charms/focal/autopkgtest-web/webcontrol/download-results
@@ -6,7 +6,9 @@ import logging
 import os
 import socket
 import sqlite3
+import time
 import urllib.parse
+from random import randrange
 
 import amqplib.client_0_8 as amqp
 from helpers.utils import get_test_id, init_db
@@ -82,25 +84,36 @@ def process_message(msg, db_con):
 
     test_id = get_test_id(db_con, release, arch, package)
 
-    try:
-        c = db_con.cursor()
-        c.execute(
-            "INSERT INTO result VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
-            (
-                test_id,
-                run_id,
-                version,
-                triggers,
-                duration,
-                exitcode,
-                requester,
-                info.get("env", ""),
-                test_uuid,
-            ),
-        )
-        db_con.commit()
-    except sqlite3.IntegrityError:
-        logging.info("...which was already recorded - skipping")
+    while True:
+        try:
+            c = db_con.cursor()
+            c.execute(
+                "INSERT INTO result VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
+                (
+                    test_id,
+                    run_id,
+                    version,
+                    triggers,
+                    duration,
+                    exitcode,
+                    requester,
+                    info.get("env", ""),
+                    test_uuid,
+                ),
+            )
+            db_con.commit()
+            break
+        except sqlite3.IntegrityError as e:
+            if "database is locked" in str(e):
+                sleep_time = randrange(1, 10)
+                logging.info(
+                    "database is currently locked, waiting %s seconds and trying again..."
+                    % sleep_time
+                )
+                time.sleep(sleep_time)
+            else:
+                logging.info("...which was already recorded - skipping")
+                break
 
     msg.channel.basic_ack(msg.delivery_tag)
 

Follow ups