From 4a0eb5431cb98cb247518fe009f87b3543ff6190 Mon Sep 17 00:00:00 2001 From: feiniks <36756310+feiniks@users.noreply.github.com> Date: Sat, 28 Nov 2020 14:40:27 +0800 Subject: [PATCH] Get accessible repo list return 500 when db error exists (#423) * Get accessible repo list return 500 when db error exists * CI should use 7.1 branch --- ci/run.py | 2 +- common/rpc-service.c | 7 ++++--- server/http-server.c | 29 ++++++++++++++++++++++++++--- server/repo-mgr.c | 14 +++++++++++--- server/repo-mgr.h | 5 +++-- server/share-mgr.c | 7 ++++++- server/share-mgr.h | 3 ++- 7 files changed, 53 insertions(+), 14 deletions(-) diff --git a/ci/run.py b/ci/run.py index ab412f8..5ebd3a7 100755 --- a/ci/run.py +++ b/ci/run.py @@ -152,7 +152,7 @@ class CcnetServer(Project): super(CcnetServer, self).__init__('ccnet-server') def branch(self): - return 'master' + return '7.1' class SeafileServer(Project): diff --git a/common/rpc-service.c b/common/rpc-service.c index 3dbd741..ea8665e 100644 --- a/common/rpc-service.c +++ b/common/rpc-service.c @@ -1190,7 +1190,7 @@ seafile_list_owned_repos (const char *email, int ret_corrupted, GList *repos, *ptr; repos = seaf_repo_manager_get_repos_by_owner (seaf->repo_mgr, email, ret_corrupted, - start, limit); + start, limit, NULL); ret = convert_repo_list (repos); /* for (ptr = ret; ptr; ptr = ptr->next) { */ @@ -1490,7 +1490,8 @@ seafile_list_share_repos (const char *email, const char *type, return seaf_share_manager_list_share_repos (seaf->share_mgr, email, type, - start, limit); + start, limit, + NULL); } GList * @@ -2139,7 +2140,7 @@ seafile_unset_inner_pub_repo (const char *repo_id, GError **error) GList * seafile_list_inner_pub_repos (GError **error) { - return seaf_repo_manager_list_inner_pub_repos (seaf->repo_mgr); + return seaf_repo_manager_list_inner_pub_repos (seaf->repo_mgr, NULL); } gint64 diff --git a/server/http-server.c b/server/http-server.c index 6c266bc..88ab9c9 100644 --- a/server/http-server.c +++ b/server/http-server.c @@ -2204,13 +2204,17 @@ get_accessible_repo_list_cb (evhtp_request_t *req, void *arg) json_t *obj; json_t *repo_array = json_array (); + gboolean db_err = FALSE; GHashTable *obtained_repos = NULL; char *repo_id_tmp = NULL; obtained_repos = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); //get personal repo list - repos = seaf_repo_manager_get_repos_by_owner (seaf->repo_mgr, user, 0, -1, -1); + repos = seaf_repo_manager_get_repos_by_owner (seaf->repo_mgr, user, 0, -1, -1, &db_err); + if (db_err) + goto out; + for (iter = repos; iter; iter = iter->next) { repo = iter->data; @@ -2238,7 +2242,10 @@ get_accessible_repo_list_cb (evhtp_request_t *req, void *arg) GError *error = NULL; SeafileRepo *srepo = NULL; //get shared repo list - repos = seaf_share_manager_list_share_repos (seaf->share_mgr, user, "to_email", -1, -1); + repos = seaf_share_manager_list_share_repos (seaf->share_mgr, user, "to_email", -1, -1, &db_err); + if (db_err) + goto out; + for (iter = repos; iter; iter = iter->next) { srepo = iter->data; obj = fill_obj_from_seafilerepo (srepo, obtained_repos); @@ -2256,6 +2263,11 @@ get_accessible_repo_list_cb (evhtp_request_t *req, void *arg) //get group repo list GHashTable *group_repos = NULL; repos = seaf_get_group_repos_by_user (seaf->repo_mgr, user, org_id, &error); + if (error) { + g_clear_error (&error); + goto out; + } + if (repos) { group_repos = filter_group_repos (repos); group_repos_to_json (repo_array, group_repos, obtained_repos); @@ -2264,7 +2276,10 @@ get_accessible_repo_list_cb (evhtp_request_t *req, void *arg) } //get inner public repo list - repos = seaf_repo_manager_list_inner_pub_repos (seaf->repo_mgr); + repos = seaf_repo_manager_list_inner_pub_repos (seaf->repo_mgr, &db_err); + if (db_err) + goto out; + for (iter = repos; iter; iter = iter->next) { srepo = iter->data; obj = fill_obj_from_seafilerepo (srepo, obtained_repos); @@ -2280,8 +2295,16 @@ get_accessible_repo_list_cb (evhtp_request_t *req, void *arg) } g_list_free (repos); +out: g_hash_table_destroy (obtained_repos); + if (db_err) { + json_decref (repo_array); + seaf_warning ("DB error when get accessible repo list.\n"); + evhtp_send_reply (req, EVHTP_RES_SERVERR); + return; + } + char *json_str = json_dumps (repo_array, JSON_COMPACT); evbuffer_add (req->buffer_out, json_str, strlen(json_str)); evhtp_send_reply (req, EVHTP_RES_OK); diff --git a/server/repo-mgr.c b/server/repo-mgr.c index ca4a833..9fe6cea 100644 --- a/server/repo-mgr.c +++ b/server/repo-mgr.c @@ -2255,7 +2255,8 @@ seaf_repo_manager_get_repos_by_owner (SeafRepoManager *mgr, const char *email, int ret_corrupted, int start, - int limit) + int limit, + gboolean *db_err) { GList *repo_list = NULL, *ptr; GList *ret = NULL; @@ -2285,8 +2286,11 @@ seaf_repo_manager_get_repos_by_owner (SeafRepoManager *mgr, if (seaf_db_statement_foreach_row (mgr->seaf->db, sql, collect_repos_fill_size_commit, &repo_list, - 1, "string", email) < 0) + 1, "string", email) < 0) { + if (db_err) + *db_err = TRUE; return NULL; + } } else { if (db_type != SEAF_DB_TYPE_PGSQL) sql = "SELECT o.repo_id, s.size, b.commit_id, i.name, i.update_time, " @@ -2315,6 +2319,8 @@ seaf_repo_manager_get_repos_by_owner (SeafRepoManager *mgr, 3, "string", email, "int", limit, "int", start) < 0) { + if (db_err) + *db_err = TRUE; return NULL; } } @@ -3469,7 +3475,7 @@ collect_public_repos (SeafDBRow *row, void *data) } GList * -seaf_repo_manager_list_inner_pub_repos (SeafRepoManager *mgr) +seaf_repo_manager_list_inner_pub_repos (SeafRepoManager *mgr, gboolean *db_err) { GList *ret = NULL, *p; char *sql; @@ -3491,6 +3497,8 @@ seaf_repo_manager_list_inner_pub_repos (SeafRepoManager *mgr) for (p = ret; p != NULL; p = p->next) g_object_unref (p->data); g_list_free (ret); + if (db_err) + *db_err = TRUE; return NULL; } diff --git a/server/repo-mgr.h b/server/repo-mgr.h index 7273226..c4ead89 100644 --- a/server/repo-mgr.h +++ b/server/repo-mgr.h @@ -603,7 +603,8 @@ seaf_repo_manager_get_repos_by_owner (SeafRepoManager *mgr, const char *email, int ret_corrupted, int start, - int limit); + int limit, + gboolean *db_err); GList * seaf_repo_manager_search_repos_by_name (SeafRepoManager *mgr, const char *name); @@ -690,7 +691,7 @@ seaf_repo_manager_is_inner_pub_repo (SeafRepoManager *mgr, const char *repo_id); GList * -seaf_repo_manager_list_inner_pub_repos (SeafRepoManager *mgr); +seaf_repo_manager_list_inner_pub_repos (SeafRepoManager *mgr, gboolean *db_err); gint64 seaf_repo_manager_count_inner_pub_repos (SeafRepoManager *mgr); diff --git a/server/share-mgr.c b/server/share-mgr.c index 8f72b41..c90b90c 100644 --- a/server/share-mgr.c +++ b/server/share-mgr.c @@ -293,7 +293,8 @@ seaf_fill_repo_commit_if_not_in_db (GList **repos) GList* seaf_share_manager_list_share_repos (SeafShareManager *mgr, const char *email, - const char *type, int start, int limit) + const char *type, int start, int limit, + gboolean *db_err) { GList *ret = NULL, *p; char *sql; @@ -341,6 +342,8 @@ seaf_share_manager_list_share_repos (SeafShareManager *mgr, const char *email, for (p = ret; p; p = p->next) g_object_unref (p->data); g_list_free (ret); + if (db_err) + *db_err = TRUE; return NULL; } } @@ -390,6 +393,8 @@ seaf_share_manager_list_share_repos (SeafShareManager *mgr, const char *email, for (p = ret; p; p = p->next) g_object_unref (p->data); g_list_free (ret); + if (db_err) + *db_err = TRUE; return NULL; } } diff --git a/server/share-mgr.h b/server/share-mgr.h index 6dcbbe3..201431c 100644 --- a/server/share-mgr.h +++ b/server/share-mgr.h @@ -39,7 +39,8 @@ seaf_share_manager_set_permission (SeafShareManager *mgr, const char *repo_id, GList* seaf_share_manager_list_share_repos (SeafShareManager *mgr, const char *email, - const char *type, int start, int limit); + const char *type, int start, int limit, + gboolean *db_err); GList * seaf_share_manager_list_shared_to (SeafShareManager *mgr,