From: jiyong.min Date: Mon, 22 Mar 2021 06:35:08 +0000 (+0900) Subject: Add retry logic when the database locked X-Git-Tag: accepted/tizen/unified/20210324.124253~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=598d356f39a7557b77d626c53d832233e1e4f98c;p=platform%2Fcore%2Fapi%2Fmedia-controller.git Add retry logic when the database locked Change-Id: I3f8f6cb05f6f0b53758836aa6ed522b1fafa54bc --- 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; }