Add retry logic when the database locked 52/255652/7
authorjiyong.min <jiyong.min@samsung.com>
Mon, 22 Mar 2021 06:35:08 +0000 (15:35 +0900)
committerjiyong.min <jiyong.min@samsung.com>
Tue, 23 Mar 2021 06:30:35 +0000 (15:30 +0900)
Change-Id: I3f8f6cb05f6f0b53758836aa6ed522b1fafa54bc

svc/media_controller_db_util.c

index 6c9ef70..ea9b956 100644 (file)
@@ -26,6 +26,8 @@
 #include "mc_util.h"
 
 #define REGULAR_USER   5000
+#define RETRY_CNT 9
+#define SLEEP_TIME 1000 * 1000
 
 typedef struct {
        const char *server_name;
@@ -503,16 +505,29 @@ int mc_db_util_update_db(sqlite3 *handle, const char *sql_str)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        char *err_msg = NULL;
+       int retry_count = 0;
 
        mc_retvm_if(!handle, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid handle");
        mc_retvm_if(!sql_str, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid sql_str");
 
        mc_secure_debug("Update query [%s]", sql_str);
 
-       ret = sqlite3_exec(handle, sql_str, NULL, NULL, &err_msg);
-       if (SQLITE_OK != ret) {
-               mc_error("failed to update db[%s]", sqlite3_errmsg(handle));
+       while (1) {
+               ret = sqlite3_exec(handle, sql_str, NULL, NULL, &err_msg);
+
+               if (ret == SQLITE_OK)
+                       break;
+
+               mc_error("failed to update db[%d, %s]", ret, err_msg);
                SQLITE3_SAFE_FREE(err_msg);
+
+               if (ret == SQLITE_LOCKED &&
+                       retry_count++ < RETRY_CNT) {
+                       mc_warning("Locked retry[%d]", retry_count);
+                       usleep(SLEEP_TIME);
+                       continue;
+               }
+
                return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
        }