From 598d356f39a7557b77d626c53d832233e1e4f98c Mon Sep 17 00:00:00 2001 From: "jiyong.min" Date: Mon, 22 Mar 2021 15:35:08 +0900 Subject: [PATCH] Add retry logic when the database locked Change-Id: I3f8f6cb05f6f0b53758836aa6ed522b1fafa54bc --- svc/media_controller_db_util.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/svc/media_controller_db_util.c b/svc/media_controller_db_util.c index 6c9ef70..ea9b956 100644 --- a/svc/media_controller_db_util.c +++ b/svc/media_controller_db_util.c @@ -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; } -- 2.34.1