From a87db5b58e4cafac926b6d3b657b33211a6c03cb Mon Sep 17 00:00:00 2001 From: Jonathan Xu Date: Wed, 16 Aug 2017 17:44:32 +0800 Subject: [PATCH] Improved concurrent update handling. --- server/http-server.c | 17 +++++++++-------- server/repo-op.c | 22 +++++++++++++--------- server/size-sched.c | 5 +++-- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/server/http-server.c b/server/http-server.c index 7298c8a..2469cb0 100644 --- a/server/http-server.c +++ b/server/http-server.c @@ -831,7 +831,7 @@ fast_forward_or_merge (const char *repo_id, SeafCommit *base, SeafCommit *new_commit) { -#define MAX_RETRY_COUNT 3 +#define MAX_RETRY_COUNT 10 SeafRepo *repo = NULL; SeafCommit *current_head = NULL, *merged_commit = NULL; @@ -924,16 +924,17 @@ retry: seaf_commit_unref (merged_commit); merged_commit = NULL; - repo = seaf_repo_manager_get_repo (seaf->repo_mgr, repo_id); - if (!repo) { - seaf_warning ("Repo %s doesn't exist.\n", repo_id); - ret = -1; - goto out; - } - if (++retry_cnt <= MAX_RETRY_COUNT) { /* Sleep random time between 100 and 1000 millisecs. */ usleep (g_random_int_range(1, 11) * 100 * 1000); + + repo = seaf_repo_manager_get_repo (seaf->repo_mgr, repo_id); + if (!repo) { + seaf_warning ("Repo %s doesn't exist.\n", repo_id); + ret = -1; + goto out; + } + goto retry; } else { ret = -1; diff --git a/server/repo-op.c b/server/repo-op.c index 1f8918d..fbd5e65 100644 --- a/server/repo-op.c +++ b/server/repo-op.c @@ -442,7 +442,7 @@ gen_new_commit (const char *repo_id, char *new_commit_id, GError **error) { -#define MAX_RETRY_COUNT 3 +#define MAX_RETRY_COUNT 10 SeafRepo *repo = NULL; SeafCommit *new_commit = NULL, *current_head = NULL, *merged_commit = NULL; @@ -560,19 +560,23 @@ retry: seaf_commit_unref (merged_commit); merged_commit = NULL; - repo = seaf_repo_manager_get_repo (seaf->repo_mgr, repo_id); - if (!repo) { - seaf_warning ("Repo %s doesn't exist.\n", repo_id); - g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Invalid repo"); - ret = -1; - goto out; - } - if (++retry_cnt <= MAX_RETRY_COUNT) { /* Sleep random time between 100 and 1000 millisecs. */ usleep (g_random_int_range(1, 11) * 100 * 1000); + + repo = seaf_repo_manager_get_repo (seaf->repo_mgr, repo_id); + if (!repo) { + seaf_warning ("Repo %s doesn't exist.\n", repo_id); + g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Invalid repo"); + ret = -1; + goto out; + } + goto retry; } else { + seaf_warning ("Too many retries for concurrent update on repo %s. Stop retrying.\n", + repo_id); + g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Concurrent update"); ret = -1; goto out; } diff --git a/server/size-sched.c b/server/size-sched.c index f6f21e4..69d547a 100644 --- a/server/size-sched.c +++ b/server/size-sched.c @@ -6,6 +6,7 @@ #include "seafile-session.h" #include "size-sched.h" +#define DEBUG_FLAG SEAFILE_DEBUG_OTHER #include "log.h" typedef struct SizeSchedulerPriv { @@ -169,8 +170,8 @@ set_repo_size (SeafDB *db, } } else { if (strcmp (old_head_id, cached_head_id) != 0) { - g_message ("[size sched] Size update conflict for repo %s, rollback.\n", - repo_id); + seaf_debug ("[size sched] Size update conflict for repo %s, rollback.\n", + repo_id); ret = SET_SIZE_CONFLICT; goto rollback; }