From cb696853c46a06c2bd62c25b28095fb5b34b989a Mon Sep 17 00:00:00 2001 From: feiniks <36756310+feiniks@users.noreply.github.com> Date: Wed, 6 May 2020 11:44:35 +0800 Subject: [PATCH 01/14] Fix errors that can't list shared repos (#345) --- lib/repo.vala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/repo.vala b/lib/repo.vala index 00c6c24..1b329c0 100644 --- a/lib/repo.vala +++ b/lib/repo.vala @@ -34,7 +34,7 @@ public class Repo : Object { // data format version public int version { get; set; } - public int last_modify { get; set; } + public int64 last_modify { get; set; } public int64 size { get; set; } public int64 file_count { get; set; } public string last_modifier { get; set; } @@ -46,7 +46,7 @@ public class Repo : Object { public string repo_id { get; set; } public string repo_name { get; set; } public string repo_desc { get; set; } - public int last_modified { get; set; } + public int64 last_modified { get; set; } // Section 2: Encryption related // Members in this section should be set for every Repo object From 50882b41f4c38ef5e579237406737ff3308fdfd1 Mon Sep 17 00:00:00 2001 From: feiniks <36756310+feiniks@users.noreply.github.com> Date: Wed, 20 May 2020 18:36:38 +0800 Subject: [PATCH 02/14] Regularly cleanup files in the httptemp directory (#343) * Regularly cleanup files in the httptemp directory * Add scan http temp dir default configuration * Fix mem leak for scan httptemp dir * Modify int to gint64 --- server/fileserver-config.c | 7 +++ server/fileserver-config.h | 3 ++ server/http-server.c | 101 +++++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+) diff --git a/server/fileserver-config.c b/server/fileserver-config.c index 984e77c..e9d685b 100644 --- a/server/fileserver-config.c +++ b/server/fileserver-config.c @@ -20,6 +20,13 @@ fileserver_config_get_integer(GKeyFile *config, char *key, GError **error) return g_key_file_get_integer (config, group, key, error); } +int +fileserver_config_get_int64(GKeyFile *config, char *key, GError **error) +{ + const char *group = get_group_name(config); + return g_key_file_get_int64 (config, group, key, error); +} + char * fileserver_config_get_string(GKeyFile *config, char *key, GError **error) { diff --git a/server/fileserver-config.h b/server/fileserver-config.h index 9bc4407..db6c15f 100644 --- a/server/fileserver-config.h +++ b/server/fileserver-config.h @@ -9,6 +9,9 @@ fileserver_config_get_integer(GKeyFile *config, char *key, GError **error); char * fileserver_config_get_string(GKeyFile *config, char *key, GError **error); +int +fileserver_config_get_int64(GKeyFile *config, char *key, GError **error); + gboolean fileserver_config_get_boolean(GKeyFile *config, char *key, GError **error); diff --git a/server/http-server.c b/server/http-server.c index 46f7052..9e118ad 100644 --- a/server/http-server.c +++ b/server/http-server.c @@ -41,6 +41,11 @@ #define HOST "host" #define PORT "port" +#define HTTP_TEMP_FILE_SCAN_INTERVAL 3600 /*1h*/ +#define HTTP_TEMP_FILE_DEFAULT_TTL 3600 * 24 * 3 /*3days*/ +#define HTTP_TEMP_FILE_TTL "http_temp_file_ttl" +#define HTTP_SCAN_INTERVAL "http_temp_scan_interval" + #define INIT_INFO "If you see this page, Seafile HTTP syncing component works." #define PROTO_VERSION "{\"version\": 2}" @@ -2508,6 +2513,95 @@ seaf_http_server_new (struct _SeafileSession *session) return server; } +gint64 +get_last_modify_time (const char *path) +{ + struct stat st; + if (stat (path, &st) < 0) { + return -1; + } + + return st.st_mtime; +} + +static gint64 +check_httptemp_dir_recursive (const char *parent_dir, gint64 expired_time) +{ + char *full_path; + const char *dname; + gint64 cur_time; + gint64 last_modify = -1; + GDir *dir = NULL; + gint64 file_num = 0; + + dir = g_dir_open (parent_dir, 0, NULL); + + while ((dname = g_dir_read_name(dir)) != NULL) { + full_path = g_build_path ("/", parent_dir, dname, NULL); + + if (g_file_test (full_path, G_FILE_TEST_IS_DIR)) { + file_num += check_httptemp_dir_recursive (full_path, expired_time); + } else { + cur_time = time (NULL); + last_modify = get_last_modify_time (full_path); + if (last_modify == -1) { + g_free (full_path); + continue; + } + /*remove blokc cache from local*/ + if (last_modify + expired_time <= cur_time) { + g_unlink (full_path); + file_num ++; + } + } + g_free (full_path); + } + + g_dir_close (dir); + + return file_num; +} + +static int +scan_httptemp_dir (const char *httptemp_dir, gint64 expired_time) +{ + return check_httptemp_dir_recursive (httptemp_dir, expired_time); +} + +static void * +cleanup_expired_httptemp_file (void *arg) +{ + GError *error = NULL; + HttpServerStruct *server = arg; + SeafileSession *session = server->seaf_session; + gint64 ttl = 0; + gint64 scan_interval = 0; + gint64 file_num = 0; + + ttl = fileserver_config_get_int64 (session->config, HTTP_TEMP_FILE_TTL, &error); + if (error) { + ttl = HTTP_TEMP_FILE_DEFAULT_TTL; + g_clear_error (&error); + } + + scan_interval = fileserver_config_get_int64 (session->config, HTTP_SCAN_INTERVAL, &error); + if (error) { + scan_interval = HTTP_TEMP_FILE_SCAN_INTERVAL; + g_clear_error (&error); + } + + while (TRUE) { + sleep (scan_interval); + file_num = scan_httptemp_dir (server->http_temp_dir, ttl); + if (file_num) { + seaf_message ("Clean up %ld http temp files\n", file_num); + file_num = 0; + } + } + + return NULL; +} + int seaf_http_server_start (HttpServerStruct *server) { @@ -2516,6 +2610,13 @@ seaf_http_server_start (HttpServerStruct *server) return -1; pthread_detach (server->priv->thread_id); + + pthread_t tid; + ret = pthread_create (&tid, NULL, cleanup_expired_httptemp_file, server); + if (ret != 0) + return -1; + + pthread_detach (tid); return 0; } From 95bef2616411c422a2d985ea7e7da8e2c385cf5f Mon Sep 17 00:00:00 2001 From: feiniks <36756310+feiniks@users.noreply.github.com> Date: Wed, 24 Jun 2020 16:32:46 +0800 Subject: [PATCH 03/14] mysql add connection pool and keepalive thread (#365) --- common/seaf-db.c | 123 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 120 insertions(+), 3 deletions(-) diff --git a/common/seaf-db.c b/common/seaf-db.c index 2faed8d..42723f3 100644 --- a/common/seaf-db.c +++ b/common/seaf-db.c @@ -12,12 +12,21 @@ #include #include +struct DBConnPool { + GPtrArray *connections; + pthread_mutex_t lock; + int max_connections; +}; +typedef struct DBConnPool DBConnPool; + struct SeafDB { int type; + DBConnPool *pool; }; typedef struct DBConnection { - /* Empty */ + gboolean is_available; + DBConnPool *pool; } DBConnection; struct SeafDBRow { @@ -77,6 +86,96 @@ static int mysql_db_row_get_column_int (SeafDBRow *row, int idx); static gint64 mysql_db_row_get_column_int64 (SeafDBRow *row, int idx); +static gboolean +mysql_db_connection_ping (DBConnection *vconn); + +static DBConnPool * +init_conn_pool_common (int max_connections) +{ + DBConnPool *pool = g_new0(DBConnPool, 1); + pool->connections = g_ptr_array_sized_new (max_connections); + pthread_mutex_init (&pool->lock, NULL); + pool->max_connections = max_connections; + + return pool; +} + +static DBConnection * +mysql_conn_pool_get_connection (SeafDB *db) +{ + DBConnPool *pool = db->pool; + DBConnection *conn = NULL; + + if (pool->max_connections == 0) { + conn = mysql_db_get_connection (db); + return conn; + } + + pthread_mutex_lock (&pool->lock); + + guint i, size = pool->connections->len; + for (i = 0; i < size; ++i) { + conn = g_ptr_array_index (pool->connections, i); + if (conn->is_available && mysql_db_connection_ping (conn)) { + conn->is_available = FALSE; + goto out; + } + } + conn = NULL; + if (size < pool->max_connections) { + conn = mysql_db_get_connection (db); + if (conn) { + conn->pool = pool; + conn->is_available = FALSE; + g_ptr_array_add (pool->connections, conn); + } + } + +out: + pthread_mutex_unlock (&pool->lock); + return conn; +} + +static void +mysql_conn_pool_release_connection (DBConnection *conn) +{ + if (!conn) + return; + + if (conn->pool->max_connections == 0) { + mysql_db_release_connection (conn); + return; + } + + pthread_mutex_lock (&conn->pool->lock); + conn->is_available = TRUE; + pthread_mutex_unlock (&conn->pool->lock); +} + +#define KEEPALIVE_INTERVAL 30 +static void * +mysql_conn_keepalive (void *arg) +{ + DBConnPool *pool = arg; + DBConnection *conn = NULL; + + while (1) { + pthread_mutex_lock (&pool->lock); + + guint i, size = pool->connections->len; + for (i = 0; i < size; ++i) { + conn = g_ptr_array_index (pool->connections, i); + if (conn->is_available) { + mysql_db_connection_ping (conn); + } + } + pthread_mutex_unlock (&pool->lock); + + sleep (KEEPALIVE_INTERVAL); + } + + return NULL; +} SeafDB * seaf_db_new_mysql (const char *host, @@ -96,8 +195,8 @@ seaf_db_new_mysql (const char *host, return NULL; db->type = SEAF_DB_TYPE_MYSQL; - db_ops.get_connection = mysql_db_get_connection; - db_ops.release_connection = mysql_db_release_connection; + db_ops.get_connection = mysql_conn_pool_get_connection; + db_ops.release_connection = mysql_conn_pool_release_connection; db_ops.execute_sql_no_stmt = mysql_db_execute_sql_no_stmt; db_ops.execute_sql = mysql_db_execute_sql; db_ops.query_foreach_row = mysql_db_query_foreach_row; @@ -106,6 +205,16 @@ seaf_db_new_mysql (const char *host, db_ops.row_get_column_int = mysql_db_row_get_column_int; db_ops.row_get_column_int64 = mysql_db_row_get_column_int64; + db->pool = init_conn_pool_common (max_connections); + + pthread_t tid; + int ret = pthread_create (&tid, NULL, mysql_conn_keepalive, db->pool); + if (ret != 0) { + seaf_warning ("Failed to create mysql connection keepalive thread.\n"); + return NULL; + } + pthread_detach (tid); + return db; } @@ -533,6 +642,14 @@ typedef struct MySQLDBConnection { MYSQL *db_conn; } MySQLDBConnection; +static gboolean +mysql_db_connection_ping (DBConnection *vconn) +{ + MySQLDBConnection *conn = (MySQLDBConnection *)vconn; + + return (mysql_ping (conn->db_conn) == 0); +} + static SeafDB * mysql_db_new (const char *host, int port, From cf7e938a332e706413c1a866808ca452ed8b1a1f Mon Sep 17 00:00:00 2001 From: feiniks <36756310+feiniks@users.noreply.github.com> Date: Sun, 28 Jun 2020 12:02:46 +0800 Subject: [PATCH 04/14] Fix error when set max_connections to 0 (#366) --- common/seaf-db.c | 1 + common/seaf-utils.c | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/common/seaf-db.c b/common/seaf-db.c index 42723f3..18191d4 100644 --- a/common/seaf-db.c +++ b/common/seaf-db.c @@ -108,6 +108,7 @@ mysql_conn_pool_get_connection (SeafDB *db) if (pool->max_connections == 0) { conn = mysql_db_get_connection (db); + conn->pool = pool; return conn; } diff --git a/common/seaf-utils.c b/common/seaf-utils.c index 2fa1d42..92f8c90 100644 --- a/common/seaf-utils.c +++ b/common/seaf-utils.c @@ -105,11 +105,15 @@ mysql_db_start (SeafileSession *session) charset = seaf_key_file_get_string (session->config, "database", "connection_charset", NULL); + if (error) + g_clear_error (&error); max_connections = g_key_file_get_integer (session->config, "database", "max_connections", - NULL); - if (max_connections <= 0) + &error); + if (error || max_connections < 0) { + g_clear_error (&error); max_connections = DEFAULT_MAX_CONNECTIONS; + } session->db = seaf_db_new_mysql (host, port, user, passwd, db, unix_socket, use_ssl, charset, max_connections); if (!session->db) { @@ -123,8 +127,6 @@ mysql_db_start (SeafileSession *session) g_free (db); g_free (unix_socket); g_free (charset); - if (error) - g_clear_error (&error); return 0; } From ab167da33665605a094ff314ed1fd6dc96765f8e Mon Sep 17 00:00:00 2001 From: feiniks <36756310+feiniks@users.noreply.github.com> Date: Wed, 8 Jul 2020 21:57:04 +0800 Subject: [PATCH 05/14] Add storage_id for create enc repo api (#373) --- python/seaserv/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/seaserv/api.py b/python/seaserv/api.py index ac05e37..6c267d4 100644 --- a/python/seaserv/api.py +++ b/python/seaserv/api.py @@ -89,7 +89,7 @@ class SeafileAPI(object): def create_repo(self, name, desc, username, passwd=None, enc_version=2, storage_id=None): return seafserv_threaded_rpc.create_repo(name, desc, username, passwd, enc_version) - def create_enc_repo(self, repo_id, name, desc, username, magic, random_key, salt, enc_version): + def create_enc_repo(self, repo_id, name, desc, username, magic, random_key, salt, enc_version, storage_id=None): return seafserv_threaded_rpc.create_enc_repo(repo_id, name, desc, username, magic, random_key, salt, enc_version) def get_repo(self, repo_id): From 1bb04296cfc6fecf02b8c77d5dbaa15e48b1f965 Mon Sep 17 00:00:00 2001 From: Jiaqiang Xu Date: Wed, 8 Jul 2020 22:03:51 +0800 Subject: [PATCH 06/14] Revert "Add storage_id for create enc repo api (#373)" (#376) This reverts commit ab167da33665605a094ff314ed1fd6dc96765f8e. --- python/seaserv/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/seaserv/api.py b/python/seaserv/api.py index 6c267d4..ac05e37 100644 --- a/python/seaserv/api.py +++ b/python/seaserv/api.py @@ -89,7 +89,7 @@ class SeafileAPI(object): def create_repo(self, name, desc, username, passwd=None, enc_version=2, storage_id=None): return seafserv_threaded_rpc.create_repo(name, desc, username, passwd, enc_version) - def create_enc_repo(self, repo_id, name, desc, username, magic, random_key, salt, enc_version, storage_id=None): + def create_enc_repo(self, repo_id, name, desc, username, magic, random_key, salt, enc_version): return seafserv_threaded_rpc.create_enc_repo(repo_id, name, desc, username, magic, random_key, salt, enc_version) def get_repo(self, repo_id): From debc83cda57ee77edd1619d16162ecd96cd09fe5 Mon Sep 17 00:00:00 2001 From: feiniks <36756310+feiniks@users.noreply.github.com> Date: Wed, 22 Jul 2020 16:13:21 +0800 Subject: [PATCH 07/14] Add check if dir downloadable rpc (#381) * Add check if dir downloadable rpc * modify format error --- python/seaserv/api.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/python/seaserv/api.py b/python/seaserv/api.py index ac05e37..db2fc6d 100644 --- a/python/seaserv/api.py +++ b/python/seaserv/api.py @@ -675,6 +675,15 @@ class SeafileAPI(object): """ return '{"is_syncable":true}' + def is_dir_downloadable(self, repo_id, dir_path, user, repo_perm): + """ + Check if the permission of the dir is downloadable. + {"is_downloadable": false, "undownloadable_path":"path"} + - is_downloadable: true if the dir is downloadable, false if not. + - undownloadable_path: the undownloadable path of the repo if the path is not downloadable. + """ + return '{"is_downloadable":true}' + # token def generate_repo_token(self, repo_id, username): """Generate a token for sync a repo From 49332dfdb885341ab9e0d58964cd1db98b56ad93 Mon Sep 17 00:00:00 2001 From: Xiangyue Cai Date: Thu, 6 Aug 2020 18:13:12 +0800 Subject: [PATCH 08/14] redirect seafdav python stderr to controller.log (#387) --- controller/seafile-controller.c | 38 ++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/controller/seafile-controller.c b/controller/seafile-controller.c index 3dde027..f0d1e81 100644 --- a/controller/seafile-controller.c +++ b/controller/seafile-controller.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -69,7 +70,7 @@ controller_exit (int code) /* returns the pid of the newly created process */ static int -spawn_process (char *argv[]) +spawn_process (char *argv[], bool is_python_process) { char **ptr = argv; GString *buf = g_string_new(argv[0]); @@ -79,12 +80,30 @@ spawn_process (char *argv[]) seaf_message ("spawn_process: %s\n", buf->str); g_string_free (buf, TRUE); + int pipefd[2] = {0, 0}; + if (is_python_process) { + if (pipe(pipefd) < 0) { + seaf_warning("Failed to create pipe.\n"); + } + } + pid_t pid = fork(); if (pid == 0) { + if (is_python_process) { + if (pipefd[0] > 0 && pipefd[1] > 0) { + close(pipefd[0]); + dup2(pipefd[1], 2); + } + } /* child process */ execvp (argv[0], argv); seaf_warning ("failed to execvp %s\n", argv[0]); + + if (pipefd[1] > 0) { + close(pipefd[1]); + } + exit(-1); } else { /* controller */ @@ -93,6 +112,15 @@ spawn_process (char *argv[]) else seaf_message ("spawned %s, pid %d\n", argv[0], pid); + if (is_python_process) { + char child_stderr[1024] = {0}; + if (pipefd[0] > 0 && pipefd[1] > 0){ + close(pipefd[1]); + while (read(pipefd[0], child_stderr, sizeof(child_stderr)) > 0) + seaf_warning("%s", child_stderr); + close(pipefd[0]); + } + } return (int)pid; } } @@ -173,7 +201,7 @@ start_ccnet_server () "-P", ctl->pidfile[PID_CCNET], NULL}; - int pid = spawn_process (argv); + int pid = spawn_process (argv, false); if (pid <= 0) { seaf_warning ("Failed to spawn ccnet-server\n"); return -1; @@ -204,7 +232,7 @@ start_seaf_server () "-p", ctl->rpc_pipe_path, NULL}; - int pid = spawn_process (argv); + int pid = spawn_process (argv, false); if (pid <= 0) { seaf_warning ("Failed to spawn seaf-server\n"); return -1; @@ -351,7 +379,7 @@ start_seafevents() { NULL }; - int pid = spawn_process (argv); + int pid = spawn_process (argv, true); if (pid <= 0) { seaf_warning ("Failed to spawn seafevents.\n"); @@ -385,7 +413,7 @@ start_seafdav() { NULL }; - int pid = spawn_process (argv); + int pid = spawn_process (argv, true); if (pid <= 0) { seaf_warning ("Failed to spawn seafdav\n"); From 3520282c221defe3725deba4cc9d1ca12aa8b0ea Mon Sep 17 00:00:00 2001 From: feiniks <36756310+feiniks@users.noreply.github.com> Date: Mon, 24 Aug 2020 18:21:42 +0800 Subject: [PATCH 09/14] Fix set group repo perm error (#394) --- server/http-server.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/http-server.c b/server/http-server.c index 9e118ad..6c266bc 100644 --- a/server/http-server.c +++ b/server/http-server.c @@ -2134,7 +2134,7 @@ filter_group_repos (GList *repos) NULL); srepo_tmp = g_hash_table_lookup (table, repo_id); if (srepo_tmp) { - g_object_get (srepo, "permission", &permission_prev, + g_object_get (srepo_tmp, "permission", &permission_prev, NULL); if (g_strcmp0 (permission, "rw") == 0 && g_strcmp0 (permission_prev, "r") == 0) { g_object_unref (srepo_tmp); From 17198b7527c7a5d9570d79d2f6f6853e9bbaaf30 Mon Sep 17 00:00:00 2001 From: Xiangyue Cai Date: Mon, 24 Aug 2020 18:23:05 +0800 Subject: [PATCH 10/14] use nonblock pipe (#392) --- controller/seafile-controller.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/controller/seafile-controller.c b/controller/seafile-controller.c index f0d1e81..9cd9cca 100644 --- a/controller/seafile-controller.c +++ b/controller/seafile-controller.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -85,6 +86,7 @@ spawn_process (char *argv[], bool is_python_process) if (pipe(pipefd) < 0) { seaf_warning("Failed to create pipe.\n"); } + fcntl(pipefd[0], F_SETFL, O_NONBLOCK); } pid_t pid = fork(); @@ -116,6 +118,7 @@ spawn_process (char *argv[], bool is_python_process) char child_stderr[1024] = {0}; if (pipefd[0] > 0 && pipefd[1] > 0){ close(pipefd[1]); + sleep(1); while (read(pipefd[0], child_stderr, sizeof(child_stderr)) > 0) seaf_warning("%s", child_stderr); close(pipefd[0]); From cd9bb75e638721d217f83b3a9da3edec49914691 Mon Sep 17 00:00:00 2001 From: feiniks <36756310+feiniks@users.noreply.github.com> Date: Sat, 29 Aug 2020 19:51:18 +0800 Subject: [PATCH 11/14] Add content security policy when access file (#395) --- server/access-file.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/server/access-file.c b/server/access-file.c index 23b99e2..3b620be 100644 --- a/server/access-file.c +++ b/server/access-file.c @@ -552,6 +552,7 @@ do_file(evhtp_request_t *req, SeafRepo *repo, const char *file_id, unsigned char enc_key[32], enc_iv[16]; SeafileCrypt *crypt = NULL; SendfileData *data; + char *policy = "sandbox"; file = seaf_fs_manager_get_seafile(seaf->fs_mgr, repo->store_id, repo->version, file_id); @@ -577,6 +578,9 @@ do_file(evhtp_request_t *req, SeafRepo *repo, const char *file_id, evhtp_header_new("Access-Control-Allow-Origin", "*", 1, 1)); + evhtp_headers_add_header(req->headers_out, + evhtp_header_new("Content-Security-Policy", + policy, 1, 1)); type = parse_content_type(filename); if (type != NULL) { @@ -924,6 +928,7 @@ do_file_range (evhtp_request_t *req, SeafRepo *repo, const char *file_id, SendFileRangeData *data = NULL; guint64 start; guint64 end; + char *policy = "sandbox"; file = seaf_fs_manager_get_seafile(seaf->fs_mgr, repo->store_id, repo->version, file_id); @@ -951,6 +956,10 @@ do_file_range (evhtp_request_t *req, SeafRepo *repo, const char *file_id, evhtp_headers_add_header (req->headers_out, evhtp_header_new ("Accept-Ranges", "bytes", 0, 0)); + evhtp_headers_add_header(req->headers_out, + evhtp_header_new("Content-Security-Policy", + policy, 1, 1)); + char *content_type = NULL; char *type = parse_content_type (filename); if (type != NULL) { From 11b3fc45e3da9e074d3c5407f3b531356b01c8fa Mon Sep 17 00:00:00 2001 From: feiniks <36756310+feiniks@users.noreply.github.com> Date: Tue, 15 Sep 2020 18:33:45 +0800 Subject: [PATCH 12/14] Fsck add log when block is missing (#407) --- server/gc/fsck.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/gc/fsck.c b/server/gc/fsck.c index c528be6..9a1d68e 100644 --- a/server/gc/fsck.c +++ b/server/gc/fsck.c @@ -176,6 +176,8 @@ fsck_check_dir_recursive (const char *id, const char *parent_dir, FsckData *fsck } else { if (check_blocks (seaf_dent->id, fsck_data, &io_error) < 0) { if (io_error) { + seaf_message ("Failed to check blocks for repo[%.8s] file %s(%.8s).\n", + fsck_data->repo->id, path, seaf_dent->id); g_free (path); goto out; } From 4d65689c7973a500d097ac00248433017b53b354 Mon Sep 17 00:00:00 2001 From: feiniks <36756310+feiniks@users.noreply.github.com> Date: Fri, 25 Sep 2020 10:56:59 +0800 Subject: [PATCH 13/14] Return db error when failed to connect mysql (#413) --- common/seaf-db.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/seaf-db.c b/common/seaf-db.c index 18191d4..59bba91 100644 --- a/common/seaf-db.c +++ b/common/seaf-db.c @@ -370,8 +370,10 @@ seaf_db_statement_exists (SeafDB *db, const char *sql, gboolean *db_err, int n, DBConnection *conn = NULL; conn = db_ops.get_connection(db); - if (!conn) + if (!conn) { + *db_err = TRUE; return FALSE; + } va_list args; va_start (args, n); From 063bf731c70ca71441f4cfb28f6de5c05bd4cbc0 Mon Sep 17 00:00:00 2001 From: feiniks <36756310+feiniks@users.noreply.github.com> Date: Thu, 15 Oct 2020 15:24:04 +0800 Subject: [PATCH 14/14] Get group members add LIMIT (#415) --- python/seaserv/api.py | 4 ++-- python/seaserv/service.py | 2 +- server/quota-mgr.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/python/seaserv/api.py b/python/seaserv/api.py index db2fc6d..a84096b 100644 --- a/python/seaserv/api.py +++ b/python/seaserv/api.py @@ -1054,11 +1054,11 @@ class CcnetAPI(object): def get_group(self, group_id): return ccnet_threaded_rpc.get_group(group_id) - def get_group_members(self, group_id): + def get_group_members(self, group_id, start=-1, limit=-1): """ Return a list of GroupUser objects (ccnet/lib/ccnetobj.vala) """ - return ccnet_threaded_rpc.get_group_members(group_id) + return ccnet_threaded_rpc.get_group_members(group_id, start, limit) def get_members_with_prefix (self, group_id, prefix=None): """ diff --git a/python/seaserv/service.py b/python/seaserv/service.py index 9235a2a..9970c46 100644 --- a/python/seaserv/service.py +++ b/python/seaserv/service.py @@ -179,7 +179,7 @@ def remove_group_user(user): def get_group_members(group_id, start=-1, limit=-1): group_id_int = int(group_id) try: - members = ccnet_threaded_rpc.get_group_members(group_id_int) + members = ccnet_threaded_rpc.get_group_members(group_id_int, start, limit) except SearpcError: members = [] return members diff --git a/server/quota-mgr.c b/server/quota-mgr.c index 5ec4555..5972a88 100644 --- a/server/quota-mgr.c +++ b/server/quota-mgr.c @@ -385,7 +385,7 @@ get_num_shared_to (const char *user, const char *repo_id) groups = seaf_repo_manager_get_groups_by_repo (seaf->repo_mgr, repo_id, NULL); for (p = groups; p; p = p->next) { - members = ccnet_get_group_members (client, (int)(long)p->data); + members = ccnet_get_group_members (client, (int)(long)p->data, -1, -1); if (!members) { seaf_warning ("Cannot get member list for groupd %d.\n", (int)(long)p->data); goto out;