From 2d17e125b400b46353b4260cd2766fa2e6cc63dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E8=B5=AB=E7=84=B6?= Date: Wed, 24 Nov 2021 11:41:47 +0800 Subject: [PATCH] Add timeout for merge trees --- common/merge-new.c | 9 +++++++++ common/merge-new.h | 3 +++ server/http-server.c | 18 ++++++++++++++++++ server/http-server.h | 1 + 4 files changed, 31 insertions(+) diff --git a/common/merge-new.c b/common/merge-new.c index a9edd58..3f56243 100644 --- a/common/merge-new.c +++ b/common/merge-new.c @@ -88,6 +88,15 @@ merge_entries (const char *store_id, int version, { SeafDirent *files[3]; int i; + gint64 curr_time; + + if (opt->start_time > 0 && opt->timeout > 0) { + curr_time = time(NULL); + if (curr_time - opt->start_time > opt->timeout) { + seaf_warning("Merge trees timeout for repo %s/%s.\n", store_id, basedir); + return -1; + } + } memset (files, 0, sizeof(files[0])*n); for (i = 0; i < n; ++i) { diff --git a/common/merge-new.h b/common/merge-new.h index 0c8d1d4..555fcee 100644 --- a/common/merge-new.h +++ b/common/merge-new.h @@ -25,6 +25,9 @@ typedef struct MergeOptions { char merged_tree_root[41]; /* merge result */ int visit_dirs; gboolean conflict; + gint64 start_time; + gint64 timeout; + } MergeOptions; int diff --git a/server/http-server.c b/server/http-server.c index 8f6b1fb..9d0fba3 100644 --- a/server/http-server.c +++ b/server/http-server.c @@ -148,6 +148,7 @@ load_http_config (HttpServerStruct *htp_server, SeafileSession *session) char *encoding; int max_indexing_threads; int max_index_processing_threads; + int put_head_commit_request_timeout; char *cluster_shared_temp_file_mode = NULL; host = fileserver_config_get_string (session->config, HOST, &error); @@ -283,6 +284,21 @@ load_http_config (HttpServerStruct *htp_server, SeafileSession *session) /* No windows specific encoding is specified. Set the ZIP_UTF8 flag. */ setlocale (LC_ALL, "en_US.UTF-8"); } + + put_head_commit_request_timeout = fileserver_config_get_integer (session->config, + "put_head_commit_request_timeout", + &error); + if (error){ + htp_server->put_head_commit_request_timeout = 10; /* default 3600s */ + g_clear_error(&error); + } else { + if (put_head_commit_request_timeout<= 0) + htp_server->put_head_commit_request_timeout= 10; /* default 3600s */ + else + htp_server->put_head_commit_request_timeout= put_head_commit_request_timeout; + } + seaf_message ("fileserver: put_head_commit_request_timeout = %d\n", + htp_server->put_head_commit_request_timeout); } static int @@ -973,6 +989,8 @@ retry: memcpy (opt.remote_repo_id, repo_id, 36); memcpy (opt.remote_head, new_commit->commit_id, 40); opt.do_merge = TRUE; + opt.start_time = time(NULL); + opt.timeout = seaf->http_server->put_head_commit_request_timeout; roots[0] = base->root_id; /* base */ roots[1] = current_head->root_id; /* head */ diff --git a/server/http-server.h b/server/http-server.h index 3d725e4..5b33a62 100644 --- a/server/http-server.h +++ b/server/http-server.h @@ -22,6 +22,7 @@ struct _HttpServerStruct { int worker_threads; int max_index_processing_threads; int cluster_shared_temp_file_mode; + int put_head_commit_request_timeout; }; typedef struct _HttpServerStruct HttpServerStruct;