From a2ddf9ceb030d0b59aa74022bf1f7a446a57c850 Mon Sep 17 00:00:00 2001 From: ly1217 Date: Sat, 12 Oct 2019 04:50:40 -0700 Subject: [PATCH] Optimize configure options. --- common/config-mgr.c | 316 ++++++++++++++---- common/config-mgr.h | 4 +- common/fs-mgr.c | 30 +- common/rpc-service.c | 6 + fuse/Makefile.am | 3 +- fuse/seafile-session.c | 6 +- fuse/seafile-session.h | 2 + include/seafile-rpc.h | 3 + python/seafile/rpcclient.py | 4 + python/seaserv/api.py | 3 + server/Makefile.am | 1 - server/copy-mgr.c | 7 - server/copy-mgr.h | 3 - server/fileserver-config.c | 14 +- server/fileserver-config.h | 15 - server/gc/repo-mgr.c | 4 - server/http-server.c | 191 ++--------- server/http-server.h | 12 +- server/index-blocks-mgr.c | 46 ++- server/index-blocks-mgr.h | 3 + server/pack-dir.c | 16 +- server/quota-mgr.c | 4 - server/quota-mgr.h | 2 - server/repo-mgr.c | 47 ++- server/repo-op.c | 12 +- server/repo-perm.c | 5 +- server/seaf-server.c | 5 + server/seafile-session.c | 25 +- server/seafile-session.h | 2 - server/size-sched.c | 28 +- server/size-sched.h | 3 + server/upload-file.c | 16 +- server/web-accesstoken-mgr.c | 8 +- server/zip-download-mgr.c | 6 +- .../test_server_config/test_server_config.py | 3 +- 35 files changed, 476 insertions(+), 379 deletions(-) delete mode 100644 server/fileserver-config.h diff --git a/common/config-mgr.c b/common/config-mgr.c index 9bf7951e..ed32ea9e 100644 --- a/common/config-mgr.c +++ b/common/config-mgr.c @@ -2,27 +2,212 @@ #include "config-mgr.h" #include "seaf-db.h" #include "log.h" +#include "utils.h" + +enum { + QUOTA_DEFALUT, + HISTORY_KEEPDAYS, + FILESERVER_MAX_UPLOAD_SIZE, + FILESERVER_MAX_DOWNLOAD_DIR_SIZE, + FILESERVER_HOST, + FILESERVER_PORT, + FILESERVER_WORKER_THREADS, + FILESERVER_FIXED_BLOCK_SIZE, + FILESERVER_WEB_TOKEN_EXPIRE_TIME, + FILESERVER_MAX_INDEXING_THREADS, + FILESERVER_MAX_INDEX_PROCESSING_THREADS, + FILESERVER_CLUSTER_SHARED_TEMP_FILE_MODE, + HTTPSERVER_MAX_UPLOAD_SIZE, + HTTPSERVER_MAX_DOWNLOAD_DIR_SIZE, + HTTPSERVER_HOST, + HTTPSERVER_PORT, + HTTPSERVER_WORKER_THREADS, + HTTPSERVER_FIXED_BLOCK_SIZE, + HTTPSERVER_WEB_TOKEN_EXPIRE_TIME, + HTTPSERVER_MAX_INDEXING_THREADS, + HTTPSERVER_MAX_INDEX_PROCESSING_THREADS, + HTTPSERVER_CLUSTER_SHARED_TEMP_FILE_MODE, + LIBRARY_TRASH_EXPIRE_DAYS, + LIBRARY_TRASH_SCAN_DAYS, + WEB_COPY_MAX_FILES, + WEB_COPY_MAX_SIZE, + SHCEDULER_SIZE_SCHED_THREAD_NUM, + ZIP_WINDOWS_ENCODING, + GENERAL_CLOUD_MODE, + GENERAL_ENABLE_SYSLOG, + FUSE_EXCLUEDE_USERS, +}; + +/* These configurations in this table are displayed as */ +/* "group:option:default_value:property" format . */ +const static char *config_table [] = { + "quota:default:none:0", + "history:keep_days:-1:0", + "fileserver:max_upload_size:-1:0", + "fileserver:max_download_dir_size:100:0", + "fileserver:host:0.0.0.0:1", + "fileserver:port:8082:1", + "fileserver:worker_threads:10:1", + "fileserver:fixed_block_size:8:1", + "fileserver:web_token_expire_time:8:1", + "fileserver:max_indexing_threads:1:1", + "fileserver:max_index_processing_threads:3:1", + "fileserver:cluster_shared_temp_file_mode:0600:1", + "httpserver:max_upload_size:-1:0", + "httpserver:max_download_dir_size:100:0", + "httpserver:host:0.0.0.0:1", + "httpserver:port:8082:1", + "httpserver:worker_threads:10:1", + "httpserver:fixed_block_size:8:1", + "httpserver:web_token_expire_time:8:1", + "httpserver:max_indexing_threads:1:1", + "httpserver:max_index_processing_threads:3:1", + "httpserver:cluster_shared_temp_file_mode:0600:1", + "library_trash:expire_days:30:0", + "library_trash:scan_days:1:1", + "web_copy:max_files:0:1", + "web_copy:max_size:0:1", + "scheduler:size_sched_thread_num:1:1", + "zip:windows_encoding:none:1", + "general:cloud_mode:false:1", + "general:enable_syslog:false:1", + "fuse:excluded_users:none:1", + "t_group:t_key:0:0", + NULL +}; + +struct _SeafCfgManagerPriv { + GKeyFile *config; + SeafDB *db; + GHashTable *config_cache; +}; + +typedef struct { + char *value; + char *property; +} OptionCacheValue; + +gboolean is_option_valid (int option_index, char *value) +{ + char *invalid = NULL; + int value_int; + gint64 value_int64; + gboolean ret = TRUE; + + switch (option_index) { + case HISTORY_KEEPDAYS: + value_int = strtol (value, &invalid, 10); + if (value_int < 0 || *invalid != '\0') + ret = FALSE; + break; + case FILESERVER_MAX_UPLOAD_SIZE: + case FILESERVER_MAX_DOWNLOAD_DIR_SIZE: + value_int64 = strtoll (value, &invalid, 10); + if (value_int64 <= 0 || *invalid != '\0') + ret = FALSE; + break; + case FILESERVER_WORKER_THREADS: + case FILESERVER_FIXED_BLOCK_SIZE: + case FILESERVER_WEB_TOKEN_EXPIRE_TIME: + case FILESERVER_MAX_INDEXING_THREADS: + case FILESERVER_MAX_INDEX_PROCESSING_THREADS: + case LIBRARY_TRASH_EXPIRE_DAYS: + case LIBRARY_TRASH_SCAN_DAYS: + case SHCEDULER_SIZE_SCHED_THREAD_NUM: + value_int = strtol (value, &invalid, 10); + if (value_int <= 0 || *invalid != '\0') + ret = FALSE; + break; + case FILESERVER_CLUSTER_SHARED_TEMP_FILE_MODE: + value_int = strtol(value, NULL, 8); + if (value_int < 0001 || + value_int > 0777) + ret = FALSE; + break; + default: + break; + } + + if (!ret) + g_free (value); + + return ret; +} + +static void load_config_option (SeafCfgManager *mgr, char **option_item, int index) +{ + char *group = NULL, *key = NULL, + *property = NULL, *default_value = NULL, + *cache_key = NULL, *value = NULL; + OptionCacheValue *cache_value = NULL; + + group = option_item[0]; + key = option_item[1]; + default_value = option_item[2]; + property = option_item[3]; + + cache_key = g_strdup_printf ("%s/%s", group, key); + + value = seaf_key_file_get_string (mgr->priv->config, group, key, NULL); + if (!value || !is_option_valid (index, value)) + value = g_strdup (default_value); + + cache_value = g_new0 (OptionCacheValue, 1); + cache_value->value = value; + cache_value->property = g_strdup (property); + + g_hash_table_insert (mgr->priv->config_cache, cache_key, cache_value); +} + +static void load_config_cache (SeafCfgManager *mgr) +{ + int index = 0; + char **option_item = NULL; + + while (config_table[index]) { + option_item = g_strsplit (config_table[index], ":", -1); + load_config_option (mgr, option_item, index); + g_strfreev (option_item); + index++; + } +} int seaf_cfg_manager_init (SeafCfgManager *mgr) { char *sql; - int db_type = seaf_db_type(mgr->db); + int db_type; + + if (seaf->create_tables || seaf_db_type(seaf->db) == SEAF_DB_TYPE_PGSQL) { + db_type = seaf_db_type(mgr->priv->db); + if (db_type == SEAF_DB_TYPE_MYSQL) + sql = "CREATE TABLE IF NOT EXISTS SeafileConf (" + "id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, cfg_group VARCHAR(255) NOT NULL," + "cfg_key VARCHAR(255) NOT NULL, value VARCHAR(255), property INTEGER) ENGINE=INNODB"; + else + sql = "CREATE TABLE IF NOT EXISTS SeafileConf (cfg_group VARCHAR(255) NOT NULL," + "cfg_key VARCHAR(255) NOT NULL, value VARCHAR(255), property INTEGER)"; - if (db_type == SEAF_DB_TYPE_MYSQL) - sql = "CREATE TABLE IF NOT EXISTS SeafileConf (" - "id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, cfg_group VARCHAR(255) NOT NULL," - "cfg_key VARCHAR(255) NOT NULL, value VARCHAR(255), property INTEGER) ENGINE=INNODB"; - else - sql = "CREATE TABLE IF NOT EXISTS SeafileConf (cfg_group VARCHAR(255) NOT NULL," - "cfg_key VARCHAR(255) NOT NULL, value VARCHAR(255), property INTEGER)"; + if (seaf_db_query (mgr->priv->db, sql) < 0) { + seaf_warning ("[cfg mgr] Failed to create table.\n"); + return -1; + } + } - if (seaf_db_query (mgr->db, sql) < 0) - return -1; + load_config_cache (mgr); return 0; } +static void +cache_value_free (gpointer data) +{ + OptionCacheValue *cache_value = (OptionCacheValue *)data; + + g_free (cache_value->value); + g_free (cache_value); +} + SeafCfgManager * seaf_cfg_manager_new (SeafileSession *session) { @@ -30,8 +215,15 @@ seaf_cfg_manager_new (SeafileSession *session) if (!mgr) return NULL; - mgr->config = session->config; - mgr->db = session->db; + mgr->priv = g_new0 (SeafCfgManagerPriv, 1); + if (!mgr->priv) { + g_free (mgr); + return NULL; + } + + mgr->priv->config = session->config; + mgr->priv->db = session->db; + mgr->priv->config_cache = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, cache_value_free); return mgr; } @@ -94,28 +286,46 @@ seaf_cfg_manager_set_config_boolean (SeafCfgManager *mgr, int seaf_cfg_manager_set_config (SeafCfgManager *mgr, const char *group, const char *key, const char *value) { +#if 0 gboolean exists, err = FALSE; + char *cache_key = NULL, *property = NULL; + OptionCacheValue *prev_cache_value = NULL, *new_cache_value = NULL; + int ret = 0; + + cache_key = g_strdup_printf ("%s/%s" ,group, key); + prev_cache_value = g_hash_table_lookup (mgr->priv->config_cache, cache_key); + property = prev_cache_value->property; + + if (strcmp (property, "0") == 0) { + new_cache_value = g_new0 (OptionCacheValue, 1); + new_cache_value->value = g_strdup (value); + new_cache_value->property = property; + g_hash_table_insert (mgr->priv->config_cache, cache_key, new_cache_value); + } char *sql = "SELECT 1 FROM SeafileConf WHERE cfg_group=? AND cfg_key=?"; - exists = seaf_db_statement_exists(mgr->db, sql, &err, + exists = seaf_db_statement_exists(mgr->priv->db, sql, &err, 2, "string", group, "string", key); if (err) { seaf_warning ("[db error]Failed to set config [%s:%s] to db.\n", group, key); - return -1; + ret = -1; } if (exists) sql = "UPDATE SeafileConf SET value=? WHERE cfg_group=? AND cfg_key=?"; else sql = "INSERT INTO SeafileConf (value, cfg_group, cfg_key, property) VALUES " "(?,?,?,0)"; - if (seaf_db_statement_query (mgr->db, sql, 3, + if (seaf_db_statement_query (mgr->priv->db, sql, 3, "string", value, "string", group, "string", key) < 0) { seaf_warning ("Failed to set config [%s:%s] to db.\n", group, key); - return -1; + ret = -1; } + return ret; +#endif + return 0; } @@ -123,22 +333,13 @@ int seaf_cfg_manager_get_config_int (SeafCfgManager *mgr, const char *group, const char *key) { int ret; - char *invalid = NULL; char *value = seaf_cfg_manager_get_config (mgr, group, key); if (!value) { - GError *err = NULL; - ret = g_key_file_get_integer (mgr->config, group, key, &err); - if (err) { - ret = -1; - g_clear_error(&err); - } + seaf_warning ("Config [%s:%s] not set, default is -1.\n", group, key); + ret = -1; } else { - ret = strtol (value, &invalid, 10); - if (*invalid != '\0') { - ret = -1; - seaf_warning ("Value of config [%s:%s] is invalid: [%s]\n", group, key, value); - } + ret = strtol (value, NULL, 10); g_free (value); } @@ -149,22 +350,13 @@ gint64 seaf_cfg_manager_get_config_int64 (SeafCfgManager *mgr, const char *group, const char *key) { gint64 ret; - char *invalid = NULL; char *value = seaf_cfg_manager_get_config (mgr, group, key); if (!value) { - GError *err = NULL; - ret = g_key_file_get_int64(mgr->config, group, key, &err); - if (err) { - ret = -1; - g_clear_error(&err); - } + seaf_warning ("Config [%s:%s] not set, default is -1.\n", group, key); + ret = -1; } else { - ret = strtoll (value, &invalid, 10); - if (*invalid != '\0') { - seaf_warning ("Value of config [%s:%s] is invalid: [%s]\n", group, key, value); - ret = -1; - } + ret = strtoll (value, NULL, 10); g_free (value); } @@ -178,13 +370,8 @@ seaf_cfg_manager_get_config_boolean (SeafCfgManager *mgr, const char *group, con char *value = seaf_cfg_manager_get_config (mgr, group, key); if (!value) { - GError *err = NULL; - ret = g_key_file_get_boolean(mgr->config, group, key, &err); - if (err) { - seaf_warning ("Config [%s:%s] not set, default is false.\n", group, key); - ret = FALSE; - g_clear_error(&err); - } + seaf_warning ("Config [%s:%s] not set, default is false.\n", group, key); + ret = FALSE; } else { if (strcmp ("true", value) == 0) ret = TRUE; @@ -199,28 +386,31 @@ seaf_cfg_manager_get_config_boolean (SeafCfgManager *mgr, const char *group, con char * seaf_cfg_manager_get_config_string (SeafCfgManager *mgr, const char *group, const char *key) { - char *ret = NULL; - char *value = seaf_cfg_manager_get_config (mgr, group, key); - if (!value) { - ret = g_key_file_get_string (mgr->config, group, key, NULL); - if (ret != NULL) - ret = g_strstrip(ret); - } else { - ret = value; - } - return ret; + if (!value) + seaf_warning ("Config [%s:%s] not set, default is NULL.\n", group, key); + + return value; } char * seaf_cfg_manager_get_config (SeafCfgManager *mgr, const char *group, const char *key) { - char *sql = "SELECT value FROM SeafileConf WHERE cfg_group=? AND cfg_key=?"; - char *value = seaf_db_statement_get_string(mgr->db, sql, - 2, "string", group, "string", key); - if (value != NULL) - value = g_strstrip(value); + char *ret = NULL, *cache_key = NULL, + *value = NULL; + OptionCacheValue *cache_value = NULL; - return value; + cache_key = g_strdup_printf ("%s/%s", group, key); + cache_value = g_hash_table_lookup (mgr->priv->config_cache, cache_key); + value = cache_value->value; + + if (strcmp (value, "none") == 0) + ret = NULL; + else + ret = g_strdup (value); + + g_free (cache_key); + + return ret; } diff --git a/common/config-mgr.h b/common/config-mgr.h index 483555e0..bc9c0c6d 100644 --- a/common/config-mgr.h +++ b/common/config-mgr.h @@ -2,11 +2,11 @@ #define SEAF_CONFIG_MGR_H typedef struct _SeafCfgManager SeafCfgManager; +typedef struct _SeafCfgManagerPriv SeafCfgManagerPriv; #include "seafile-session.h" struct _SeafCfgManager { - GKeyFile *config; - SeafDB *db; + struct _SeafCfgManagerPriv *priv; }; typedef struct _SeafileSession SeafileSession; diff --git a/common/fs-mgr.c b/common/fs-mgr.c index 943a02d5..ad92a970 100644 --- a/common/fs-mgr.c +++ b/common/fs-mgr.c @@ -612,6 +612,12 @@ chunking_worker (gpointer vdata, gpointer user_data) int fd = -1; ssize_t n; int idx; + gint64 fixed_block_size; + int fixed_block_size_mb; + char *group = g_key_file_has_group (seaf->config, "fileserver") ? "fileserver" : "httpserver"; + + fixed_block_size_mb = seaf_cfg_manager_get_config_int (seaf->cfg_mgr, group, "fixed_block_size"); + fixed_block_size = fixed_block_size_mb * ((gint64)1 << 20); chunk->block_buf = g_new0 (char, chunk->len); if (!chunk->block_buf) { @@ -646,7 +652,7 @@ chunking_worker (gpointer vdata, gpointer user_data) if (chunk->result < 0) goto out; - idx = chunk->offset / seaf->http_server->fixed_block_size; + idx = chunk->offset / fixed_block_size; memcpy (data->blk_sha1s + idx * CHECKSUM_LENGTH, chunk->checksum, CHECKSUM_LENGTH); out: @@ -673,8 +679,22 @@ split_file_to_block (const char *repo_id, int n_pending = 0; CDCDescriptor *chunk; int ret = 0; + int fixed_block_size_mb; + int max_indexing_threads; + gint64 fixed_block_size; + char *group = g_key_file_has_group (seaf->config, "fileserver") ? "fileserver" : "httpserver"; + + fixed_block_size_mb = seaf_cfg_manager_get_config_int (seaf->cfg_mgr, + group, + "fixed_block_size"); + fixed_block_size = fixed_block_size_mb * ((gint64)1 << 20); + + max_indexing_threads = seaf_cfg_manager_get_config_int (seaf->cfg_mgr, + group, + "max_indexing_threads"); + + n_blocks = (file_size + fixed_block_size - 1) / fixed_block_size; - n_blocks = (file_size + seaf->http_server->fixed_block_size - 1) / seaf->http_server->fixed_block_size; block_sha1s = g_new0 (uint8_t, n_blocks * CHECKSUM_LENGTH); if (!block_sha1s) { seaf_warning ("Failed to allocate block_sha1s.\n"); @@ -694,7 +714,7 @@ split_file_to_block (const char *repo_id, data.finished_tasks = finished_tasks; tpool = g_thread_pool_new (chunking_worker, &data, - seaf->http_server->max_indexing_threads, FALSE, NULL); + max_indexing_threads, FALSE, NULL); if (!tpool) { seaf_warning ("Failed to allocate thread pool\n"); ret = -1; @@ -705,7 +725,7 @@ split_file_to_block (const char *repo_id, guint64 len; guint64 left = (guint64)file_size; while (left > 0) { - len = ((left >= seaf->http_server->fixed_block_size) ? seaf->http_server->fixed_block_size : left); + len = ((left >= fixed_block_size) ? fixed_block_size : left); chunk = g_new0 (CDCDescriptor, 1); chunk->offset = offset; @@ -725,7 +745,7 @@ split_file_to_block (const char *repo_id, goto out; } if (indexed) - *indexed += seaf->http_server->fixed_block_size; + *indexed += fixed_block_size; if ((--n_pending) <= 0) { if (indexed) diff --git a/common/rpc-service.c b/common/rpc-service.c index 74e8e2a8..c4ccb2e0 100644 --- a/common/rpc-service.c +++ b/common/rpc-service.c @@ -4336,6 +4336,12 @@ seafile_get_server_config_boolean (const char *group, const char *key, GError ** return seaf_cfg_manager_get_config_boolean (seaf->cfg_mgr, group, key); } +GList * +seafile_list_config_options (GError **error) +{ + return NULL; +} + GObject * seafile_get_group_shared_repo_by_path (const char *repo_id, const char *path, diff --git a/fuse/Makefile.am b/fuse/Makefile.am index 62fb4559..725b4a34 100644 --- a/fuse/Makefile.am +++ b/fuse/Makefile.am @@ -34,7 +34,8 @@ seaf_fuse_SOURCES = seaf-fuse.c \ ../common/obj-store.c \ ../common/obj-backend-fs.c \ ../common/obj-backend-riak.c \ - ../common/seafile-crypt.c + ../common/seafile-crypt.c \ + ../common/config-mgr.c seaf_fuse_LDADD = @CCNET_LIBS@ \ @GLIB2_LIBS@ @GOBJECT_LIBS@ @SSL_LIBS@ @LIB_RT@ @LIB_UUID@ \ diff --git a/fuse/seafile-session.c b/fuse/seafile-session.c index 65fb5336..0acf15bd 100644 --- a/fuse/seafile-session.c +++ b/fuse/seafile-session.c @@ -74,6 +74,10 @@ seafile_session_new(const char *central_config_dir, goto onerror; } + session->cfg_mgr = seaf_cfg_manager_new (session); + if (!session->cfg_mgr) + goto onerror; + if (read_excluded_users (session) < 0) { seaf_warning ("Failed to load excluded users.\n"); goto onerror; @@ -111,7 +115,7 @@ read_excluded_users (SeafileSession *session) int l, i; char *hash_value; - users = seaf_key_file_get_string (session->config, "fuse", "excluded_users", NULL); + users = seaf_cfg_manager_get_config_string (session->cfg_mgr, "fuse", "excluded_users"); if (!users) return 0; diff --git a/fuse/seafile-session.h b/fuse/seafile-session.h index a5d677be..5b10d779 100644 --- a/fuse/seafile-session.h +++ b/fuse/seafile-session.h @@ -11,6 +11,7 @@ #include "branch-mgr.h" #include "commit-mgr.h" #include "repo-mgr.h" +#include "config-mgr.h" typedef struct _SeafileSession SeafileSession; @@ -27,6 +28,7 @@ struct _SeafileSession { SeafBranchManager *branch_mgr; SeafCommitManager *commit_mgr; SeafRepoManager *repo_mgr; + SeafCfgManager *cfg_mgr; GHashTable *excluded_users; diff --git a/include/seafile-rpc.h b/include/seafile-rpc.h index 0d98d1f7..607e48fc 100644 --- a/include/seafile-rpc.h +++ b/include/seafile-rpc.h @@ -104,6 +104,9 @@ seafile_set_config_int (const char *key, int value, GError **error); int seafile_get_config_int (const char *key, GError **error); +GList* +seafile_list_config_options (GError **error); + int seafile_set_upload_rate_limit (int limit, GError **error); diff --git a/python/seafile/rpcclient.py b/python/seafile/rpcclient.py index 3ed71596..11ccfbfc 100644 --- a/python/seafile/rpcclient.py +++ b/python/seafile/rpcclient.py @@ -713,6 +713,10 @@ def get_server_config_boolean (group, key): def set_server_config_boolean (group, key, value): pass + @searpc_func("objlist", []) + def list_config_options (): + pass + @searpc_func("int", ["string", "int"]) def repo_has_been_shared (repo_id, including_groups): pass diff --git a/python/seaserv/api.py b/python/seaserv/api.py index 20ee546e..bb90d284 100644 --- a/python/seaserv/api.py +++ b/python/seaserv/api.py @@ -791,6 +791,9 @@ def set_server_config_boolean (self, group, key, value): i_value = 1 if bool(value) else 0 return seafserv_threaded_rpc.set_server_config_boolean (group, key, i_value) + def list_config_options (self): + return seafserv_threaded_rpc.list_config_options() + def del_org_group_repo(self, repo_id, org_id, group_id): seafserv_threaded_rpc.del_org_group_repo(repo_id, org_id, group_id) diff --git a/server/Makefile.am b/server/Makefile.am index 40312201..719cfac6 100644 --- a/server/Makefile.am +++ b/server/Makefile.am @@ -29,7 +29,6 @@ noinst_HEADERS = web-accesstoken-mgr.h seafile-session.h \ upload-file.h \ access-file.h \ pack-dir.h \ - fileserver-config.h \ http-status-codes.h \ zip-download-mgr.h \ index-blocks-mgr.h diff --git a/server/copy-mgr.c b/server/copy-mgr.c index 55051046..e748146f 100644 --- a/server/copy-mgr.c +++ b/server/copy-mgr.c @@ -44,13 +44,6 @@ seaf_copy_manager_new (struct _SeafileSession *session) (GDestroyNotify)copy_task_free); pthread_mutex_init (&mgr->priv->lock, NULL); - mgr->max_files = g_key_file_get_int64 (session->config, - "web_copy", "max_files", NULL); - mgr->max_size = g_key_file_get_int64 (session->config, - "web_copy", "max_size", NULL); - /* size is given in MB */ - mgr->max_size <<= 20; - return mgr; } diff --git a/server/copy-mgr.h b/server/copy-mgr.h index ec16ba30..8bcb7063 100644 --- a/server/copy-mgr.h +++ b/server/copy-mgr.h @@ -16,9 +16,6 @@ struct _SeafileCopyTask; struct _SeafCopyManager { struct _SeafileSession *session; struct _SeafCopyManagerPriv *priv; - - gint64 max_files; - gint64 max_size; }; typedef struct _SeafCopyManager SeafCopyManager; typedef struct _SeafCopyManagerPriv SeafCopyManagerPriv; diff --git a/server/fileserver-config.c b/server/fileserver-config.c index 984e77ce..2a024248 100644 --- a/server/fileserver-config.c +++ b/server/fileserver-config.c @@ -2,7 +2,7 @@ #include -#include "fileserver-config.h" +#include "seafile-session.h" const char *OLD_GROUP_NAME = "httpserver"; const char *GROUP_NAME = "fileserver"; @@ -14,22 +14,22 @@ get_group_name(GKeyFile *config) } int -fileserver_config_get_integer(GKeyFile *config, char *key, GError **error) +fileserver_config_get_integer(SeafCfgManager *mgr, GKeyFile *config, char *key) { const char *group = get_group_name(config); - return g_key_file_get_integer (config, group, key, error); + return seaf_cfg_manager_get_config_int (mgr, group, key); } char * -fileserver_config_get_string(GKeyFile *config, char *key, GError **error) +fileserver_config_get_string(SeafCfgManager *mgr, GKeyFile *config, char *key) { const char *group = get_group_name(config); - return g_key_file_get_string (config, group, key, error); + return seaf_cfg_manager_get_config_string (mgr, group, key); } gboolean -fileserver_config_get_boolean(GKeyFile *config, char *key, GError **error) +fileserver_config_get_boolean(SeafCfgManager *mgr, GKeyFile *config, char *key) { const char *group = get_group_name(config); - return g_key_file_get_boolean (config, group, key, error); + return seaf_cfg_manager_get_config_boolean (mgr, group, key); } diff --git a/server/fileserver-config.h b/server/fileserver-config.h deleted file mode 100644 index 9bc44073..00000000 --- a/server/fileserver-config.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef SEAFILE_FILESERVER_CONFIG_H -#define SEAFILE_FILESERVER_CONFIG_H - -struct GKeyFile; - -int -fileserver_config_get_integer(GKeyFile *config, char *key, GError **error); - -char * -fileserver_config_get_string(GKeyFile *config, char *key, GError **error); - -gboolean -fileserver_config_get_boolean(GKeyFile *config, char *key, GError **error); - -#endif // SEAFILE_FILESERVER_CONFIG_H diff --git a/server/gc/repo-mgr.c b/server/gc/repo-mgr.c index 45ebca3f..a830a3db 100644 --- a/server/gc/repo-mgr.c +++ b/server/gc/repo-mgr.c @@ -498,10 +498,6 @@ seaf_repo_manager_get_repo_history_limit (SeafRepoManager *mgr, "history", "keep_days"); } - if (per_repo_days < 0) { - per_repo_days = -1; - } - return per_repo_days; } diff --git a/server/http-server.c b/server/http-server.c index a1410f87..6f343cdc 100644 --- a/server/http-server.c +++ b/server/http-server.c @@ -3,7 +3,6 @@ #include #include #include -#include #include #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) @@ -25,18 +24,10 @@ #include "access-file.h" #include "upload-file.h" -#include "fileserver-config.h" #include "http-status-codes.h" - -#define DEFAULT_BIND_HOST "0.0.0.0" -#define DEFAULT_BIND_PORT 8082 -#define DEFAULT_WORKER_THREADS 10 -#define DEFAULT_MAX_DOWNLOAD_DIR_SIZE 100 * ((gint64)1 << 20) /* 100MB */ -#define DEFAULT_MAX_INDEXING_THREADS 1 -#define DEFAULT_MAX_INDEX_PROCESSING_THREADS 3 -#define DEFAULT_FIXED_BLOCK_SIZE ((gint64)1 << 23) /* 8MB */ -#define DEFAULT_CLUSTER_SHARED_TEMP_FILE_MODE 0600 +#include "config-mgr.h" +#include #define HOST "host" #define PORT "port" @@ -117,155 +108,6 @@ const char *POST_RECV_FS_REGEX = "^/repo/[\\da-z]{8}-[\\da-z]{4}-[\\da-z]{4}-[\\ const char *POST_PACK_FS_REGEX = "^/repo/[\\da-z]{8}-[\\da-z]{4}-[\\da-z]{4}-[\\da-z]{4}-[\\da-z]{12}/pack-fs"; const char *GET_BLOCK_MAP_REGEX = "^/repo/[\\da-z]{8}-[\\da-z]{4}-[\\da-z]{4}-[\\da-z]{4}-[\\da-z]{12}/block-map/[\\da-z]{40}"; -static void -load_http_config (HttpServerStruct *htp_server, SeafileSession *session) -{ - GError *error = NULL; - char *host = NULL; - int port = 0; - int worker_threads; - int web_token_expire_time; - int fixed_block_size_mb; - char *encoding; - int max_indexing_threads; - int max_index_processing_threads; - char *cluster_shared_temp_file_mode = NULL; - - host = fileserver_config_get_string (session->config, HOST, &error); - if (!error) { - htp_server->bind_addr = host; - } else { - if (error->code != G_KEY_FILE_ERROR_KEY_NOT_FOUND && - error->code != G_KEY_FILE_ERROR_GROUP_NOT_FOUND) { - seaf_warning ("[conf] Error: failed to read the value of 'host'\n"); - exit (1); - } - - htp_server->bind_addr = g_strdup (DEFAULT_BIND_HOST); - g_clear_error (&error); - } - - port = fileserver_config_get_integer (session->config, PORT, &error); - if (!error) { - htp_server->bind_port = port; - } else { - if (error->code != G_KEY_FILE_ERROR_KEY_NOT_FOUND && - error->code != G_KEY_FILE_ERROR_GROUP_NOT_FOUND) { - seaf_warning ("[conf] Error: failed to read the value of 'port'\n"); - exit (1); - } - - htp_server->bind_port = DEFAULT_BIND_PORT; - g_clear_error (&error); - } - - worker_threads = fileserver_config_get_integer (session->config, "worker_threads", - &error); - if (error) { - htp_server->worker_threads = DEFAULT_WORKER_THREADS; - g_clear_error (&error); - } else { - if (worker_threads <= 0) - htp_server->worker_threads = DEFAULT_WORKER_THREADS; - else - htp_server->worker_threads = worker_threads; - } - seaf_message ("fileserver: worker_threads = %d\n", htp_server->worker_threads); - - fixed_block_size_mb = fileserver_config_get_integer (session->config, - "fixed_block_size", - &error); - if (error){ - htp_server->fixed_block_size = DEFAULT_FIXED_BLOCK_SIZE; - g_clear_error(&error); - } else { - if (fixed_block_size_mb <= 0) - htp_server->fixed_block_size = DEFAULT_FIXED_BLOCK_SIZE; - else - htp_server->fixed_block_size = fixed_block_size_mb * ((gint64)1 << 20); - } - seaf_message ("fileserver: fixed_block_size = %"G_GINT64_FORMAT"\n", - htp_server->fixed_block_size); - - web_token_expire_time = fileserver_config_get_integer (session->config, - "web_token_expire_time", - &error); - if (error){ - htp_server->web_token_expire_time = 3600; /* default 3600s */ - g_clear_error(&error); - } else { - if (web_token_expire_time <= 0) - htp_server->web_token_expire_time = 3600; /* default 3600s */ - else - htp_server->web_token_expire_time = web_token_expire_time; - } - seaf_message ("fileserver: web_token_expire_time = %d\n", - htp_server->web_token_expire_time); - - max_indexing_threads = fileserver_config_get_integer (session->config, - "max_indexing_threads", - &error); - if (error) { - htp_server->max_indexing_threads = DEFAULT_MAX_INDEXING_THREADS; - g_clear_error (&error); - } else { - if (max_indexing_threads <= 0) - htp_server->max_indexing_threads = DEFAULT_MAX_INDEXING_THREADS; - else - htp_server->max_indexing_threads = max_indexing_threads; - } - seaf_message ("fileserver: max_indexing_threads = %d\n", - htp_server->max_indexing_threads); - - max_index_processing_threads = fileserver_config_get_integer (session->config, - "max_index_processing_threads", - &error); - if (error) { - htp_server->max_index_processing_threads = DEFAULT_MAX_INDEX_PROCESSING_THREADS; - g_clear_error (&error); - } else { - if (max_index_processing_threads <= 0) - htp_server->max_index_processing_threads = DEFAULT_MAX_INDEX_PROCESSING_THREADS; - else - htp_server->max_index_processing_threads = max_index_processing_threads; - } - seaf_message ("fileserver: max_index_processing_threads= %d\n", - htp_server->max_index_processing_threads); - - cluster_shared_temp_file_mode = fileserver_config_get_string (session->config, - "cluster_shared_temp_file_mode", - &error); - if (error) { - htp_server->cluster_shared_temp_file_mode = DEFAULT_CLUSTER_SHARED_TEMP_FILE_MODE; - g_clear_error (&error); - } else { - if (!cluster_shared_temp_file_mode) { - htp_server->cluster_shared_temp_file_mode = DEFAULT_CLUSTER_SHARED_TEMP_FILE_MODE; - } else { - htp_server->cluster_shared_temp_file_mode = strtol(cluster_shared_temp_file_mode, NULL, 8); - - if (htp_server->cluster_shared_temp_file_mode < 0001 || - htp_server->cluster_shared_temp_file_mode > 0777) - htp_server->cluster_shared_temp_file_mode = DEFAULT_CLUSTER_SHARED_TEMP_FILE_MODE; - - g_free (cluster_shared_temp_file_mode); - } - } - seaf_message ("fileserver: cluster_shared_temp_file_mode = %o\n", - htp_server->cluster_shared_temp_file_mode); - - encoding = g_key_file_get_string (session->config, - "zip", "windows_encoding", - &error); - if (encoding) { - htp_server->windows_encoding = encoding; - } else { - g_clear_error (&error); - /* No windows specific encoding is specified. Set the ZIP_UTF8 flag. */ - setlocale (LC_ALL, "en_US.UTF-8"); - } -} - static int validate_token (HttpServer *htp_server, evhtp_request_t *req, const char *repo_id, char **username, @@ -2213,20 +2055,27 @@ http_server_run (void *arg) { HttpServerStruct *server = arg; HttpServer *priv = server->priv; + char *group = g_key_file_has_group (seaf->config, "fileserver") ? "fileserver" : "httpserver"; + char *bind_addr = seaf_cfg_manager_get_config_string (seaf->cfg_mgr, group, HOST); + int bind_port = seaf_cfg_manager_get_config_int (seaf->cfg_mgr, group, PORT); + int worker_threads = seaf_cfg_manager_get_config_int (seaf->cfg_mgr, + group, + "worker_threads"); priv->evbase = event_base_new(); priv->evhtp = evhtp_new(priv->evbase, NULL); if (evhtp_bind_socket(priv->evhtp, - server->bind_addr, - server->bind_port, 128) < 0) { + bind_addr, + bind_port, 128) < 0) { seaf_warning ("Could not bind socket: %s\n", strerror (errno)); exit(-1); } + g_free (bind_addr); http_request_init (server); - evhtp_use_threads (priv->evhtp, NULL, server->worker_threads, NULL); + evhtp_use_threads (priv->evhtp, NULL, worker_threads, NULL); struct timeval tv; tv.tv_sec = CLEANING_INTERVAL_SEC; @@ -2252,8 +2101,6 @@ seaf_http_server_new (struct _SeafileSession *session) priv->evbase = NULL; priv->evhtp = NULL; - load_http_config (server, session); - priv->token_cache = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, token_cache_value_free); pthread_mutex_init (&priv->token_cache_lock, NULL); @@ -2274,6 +2121,20 @@ seaf_http_server_new (struct _SeafileSession *session) return server; } +int +seaf_http_server_init () +{ + char *windows_encoding = NULL; + + windows_encoding = seaf_cfg_manager_get_config_string (seaf->cfg_mgr, "zip", "windows_encoding"); + if (!windows_encoding) { + /* No windows specific encoding is specified. Set the ZIP_UTF8 flag. */ + setlocale (LC_ALL, "en_US.UTF-8"); + } + + return 0; +} + int seaf_http_server_start (HttpServerStruct *server) { diff --git a/server/http-server.h b/server/http-server.h index 3d725e4d..27da7422 100644 --- a/server/http-server.h +++ b/server/http-server.h @@ -12,16 +12,7 @@ struct _HttpServerStruct { struct _HttpServer *priv; - char *bind_addr; - int bind_port; char *http_temp_dir; /* temp dir for file upload */ - char *windows_encoding; - gint64 fixed_block_size; - int web_token_expire_time; - int max_indexing_threads; - int worker_threads; - int max_index_processing_threads; - int cluster_shared_temp_file_mode; }; typedef struct _HttpServerStruct HttpServerStruct; @@ -29,6 +20,9 @@ typedef struct _HttpServerStruct HttpServerStruct; HttpServerStruct * seaf_http_server_new (struct _SeafileSession *session); +int +seaf_http_server_init (); + int seaf_http_server_start (HttpServerStruct *htp_server); diff --git a/server/index-blocks-mgr.c b/server/index-blocks-mgr.c index 6fa48474..c29edc15 100644 --- a/server/index-blocks-mgr.c +++ b/server/index-blocks-mgr.c @@ -18,6 +18,7 @@ #include "seafile-error.h" #include "seafile-crypt.h" #include "index-blocks-mgr.h" +#include "config-mgr.h" #define TOKEN_LEN 36 #define PROGRESS_TTL 5 * 3600 // 5 hours @@ -68,26 +69,9 @@ free_progress (IdxProgress *progress) IndexBlksMgr * index_blocks_mgr_new (SeafileSession *session) { - GError *error = NULL; IndexBlksMgr *mgr = g_new0 (IndexBlksMgr, 1); IndexBlksMgrPriv *priv = g_new0 (IndexBlksMgrPriv, 1); - priv->idx_tpool = g_thread_pool_new (start_index_task, - priv, - session->http_server->max_index_processing_threads, - FALSE, &error); - if (!priv->idx_tpool) { - if (error) { - seaf_warning ("Failed to create index task thread pool: %s.\n", error->message); - g_clear_error (&error); - } else { - seaf_warning ("Failed to create index task thread pool.\n"); - } - g_free (priv); - g_free (mgr); - return NULL; - } - pthread_mutex_init (&priv->progress_lock, NULL); priv->progress_store = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)free_progress); @@ -98,6 +82,34 @@ index_blocks_mgr_new (SeafileSession *session) return mgr; } +int +index_blocks_mgr_init (IndexBlksMgr *mgr) +{ + GError *error = NULL; + int max_index_processing_threads; + char *group = g_key_file_has_group (seaf->config, "fileserver") ? "fileserver" : "httpserver"; + + max_index_processing_threads = seaf_cfg_manager_get_config_int (seaf->cfg_mgr, + group, + "max_index_processing_threads"); + + mgr->priv->idx_tpool = g_thread_pool_new (start_index_task, + mgr->priv, + max_index_processing_threads, + FALSE, &error); + if (!mgr->priv->idx_tpool) { + if (error) { + seaf_warning ("Failed to create index task thread pool: %s.\n", error->message); + g_clear_error (&error); + } else { + seaf_warning ("Failed to create index task thread pool.\n"); + } + return -1; + } + + return 0; +} + static int scan_progress (void *data) { diff --git a/server/index-blocks-mgr.h b/server/index-blocks-mgr.h index 830e0524..9da390df 100644 --- a/server/index-blocks-mgr.h +++ b/server/index-blocks-mgr.h @@ -21,6 +21,9 @@ typedef struct IdxProgress { IndexBlksMgr * index_blocks_mgr_new (struct _SeafileSession *session); +int +index_blocks_mgr_init (IndexBlksMgr *mgr); + char * index_blocks_mgr_query_progress (IndexBlksMgr *mgr, const char *token, diff --git a/server/pack-dir.c b/server/pack-dir.c index 7763d187..3daf811f 100644 --- a/server/pack-dir.c +++ b/server/pack-dir.c @@ -91,6 +91,7 @@ add_file_to_archive (PackDirData *data, char *dec_out = NULL; int dec_out_len = -1; int ret = 0; + char *windows_encoding = NULL; pathname = g_build_filename (top_dir_name, parent_dir, dent->name, NULL); @@ -105,13 +106,14 @@ add_file_to_archive (PackDirData *data, entry = archive_entry_new (); /* File name fixup for WinRAR */ - if (is_windows && seaf->http_server->windows_encoding) { + windows_encoding = seaf_cfg_manager_get_config_string (seaf->cfg_mgr, "zip", "windows_encoding"); + if (is_windows && windows_encoding) { char *win_file_name = do_iconv ("UTF-8", - seaf->http_server->windows_encoding, + windows_encoding, pathname); if (!win_file_name) { seaf_warning ("Failed to convert file name to %s\n", - seaf->http_server->windows_encoding); + windows_encoding); ret = -1; goto out; } @@ -281,6 +283,7 @@ archive_dir (PackDirData *data, GList *ptr; char *subpath = NULL; int ret = 0; + char *windows_encoding = NULL; dir = seaf_fs_manager_get_seafdir (seaf->fs_mgr, data->store_id, data->repo_version, @@ -294,13 +297,14 @@ archive_dir (PackDirData *data, struct archive_entry *entry = archive_entry_new (); gboolean is_windows = data->is_windows; - if (is_windows && seaf->http_server->windows_encoding) { + windows_encoding = seaf_cfg_manager_get_config_string (seaf->cfg_mgr, "zip", "windows_encoding"); + if (is_windows && windows_encoding) { char *win_file_name = do_iconv ("UTF-8", - seaf->http_server->windows_encoding, + windows_encoding, pathname); if (!win_file_name) { seaf_warning ("Failed to convert file name to %s\n", - seaf->http_server->windows_encoding); + windows_encoding); ret = -1; goto out; } diff --git a/server/quota-mgr.c b/server/quota-mgr.c index 373de296..65f0bb18 100644 --- a/server/quota-mgr.c +++ b/server/quota-mgr.c @@ -69,10 +69,6 @@ seaf_quota_manager_new (struct _SeafileSession *session) return NULL; mgr->session = session; - mgr->calc_share_usage = g_key_file_get_boolean (session->config, - "quota", "calc_share_usage", - NULL); - return mgr; } diff --git a/server/quota-mgr.h b/server/quota-mgr.h index a46e2de0..31c235b3 100644 --- a/server/quota-mgr.h +++ b/server/quota-mgr.h @@ -7,8 +7,6 @@ struct _SeafQuotaManager { struct _SeafileSession *session; - - gboolean calc_share_usage; }; typedef struct _SeafQuotaManager SeafQuotaManager; diff --git a/server/repo-mgr.c b/server/repo-mgr.c index a6a5c204..7735677c 100644 --- a/server/repo-mgr.c +++ b/server/repo-mgr.c @@ -25,8 +25,6 @@ #define REAP_TOKEN_INTERVAL 300 /* 5 mins */ #define DECRYPTED_TOKEN_TTL 3600 /* 1 hour */ -#define SCAN_TRASH_DAYS 1 /* one day */ -#define TRASH_EXPIRE_DAYS 30 /* one month */ typedef struct DecryptedToken { char *token; @@ -258,13 +256,10 @@ scan_trash (void *data) { GList *repo_ids = NULL; SeafRepoManager *mgr = seaf->repo_mgr; - gint64 trash_expire_interval = TRASH_EXPIRE_DAYS * 24 * 3600; int expire_days = seaf_cfg_manager_get_config_int (seaf->cfg_mgr, "library_trash", "expire_days"); - if (expire_days > 0) { - trash_expire_interval = expire_days * 24 * 3600; - } + gint64 trash_expire_interval = expire_days * 24 * 3600; gint64 expire_time = time(NULL) - trash_expire_interval; char *sql = "SELECT repo_id FROM RepoTrash WHERE del_time <= ?"; @@ -293,18 +288,11 @@ scan_trash (void *data) } static void -init_scan_trash_timer (SeafRepoManagerPriv *priv, GKeyFile *config) +init_scan_trash_timer (SeafRepoManagerPriv *priv) { - int scan_days; - GError *error = NULL; - - scan_days = g_key_file_get_integer (config, - "library_trash", "scan_days", - &error); - if (error) { - scan_days = SCAN_TRASH_DAYS; - g_clear_error (&error); - } + int scan_days = seaf_cfg_manager_get_config_int (seaf->cfg_mgr, + "library_trash", + "scan_days"); priv->scan_trash_timer = ccnet_timer_new (scan_trash, NULL, scan_days * 24 * 3600 * 1000); @@ -325,14 +313,14 @@ seaf_repo_manager_new (SeafileSession *seaf) mgr->priv->reap_token_timer = ccnet_timer_new (reap_token, mgr, REAP_TOKEN_INTERVAL * 1000); - init_scan_trash_timer (mgr->priv, seaf->config); - return mgr; } int seaf_repo_manager_init (SeafRepoManager *mgr) { + init_scan_trash_timer (mgr->priv); + /* On the server, we load repos into memory on-demand, because * there are too many repos. */ @@ -437,6 +425,9 @@ remove_virtual_repo_ondisk (SeafRepoManager *mgr, const char *repo_id) { SeafDB *db = mgr->seaf->db; + gboolean cloud_mode = seaf_cfg_manager_get_config_boolean (seaf->cfg_mgr, + "general", + "cloud_mode"); /* Remove record in repo table first. * Once this is commited, we can gc the other tables later even if @@ -466,7 +457,7 @@ remove_virtual_repo_ondisk (SeafRepoManager *mgr, seaf_db_statement_query (db, "DELETE FROM RepoGroup WHERE repo_id = ?", 1, "string", repo_id); - if (!seaf->cloud_mode) { + if (!cloud_mode) { seaf_db_statement_query (db, "DELETE FROM InnerPubRepo WHERE repo_id = ?", 1, "string", repo_id); } @@ -533,6 +524,9 @@ seaf_repo_manager_del_repo (SeafRepoManager *mgr, GError **error) { gboolean has_err = FALSE; + gboolean cloud_mode = seaf_cfg_manager_get_config_boolean (seaf->cfg_mgr, + "general", + "cloud_mode"); SeafCommit *head_commit = get_head_commit (mgr, repo_id, &has_err); if (has_err) { @@ -580,7 +574,7 @@ seaf_repo_manager_del_repo (SeafRepoManager *mgr, seaf_db_statement_query (mgr->seaf->db, "DELETE FROM RepoGroup WHERE repo_id = ?", 1, "string", repo_id); - if (!seaf->cloud_mode) { + if (!cloud_mode) { seaf_db_statement_query (mgr->seaf->db, "DELETE FROM InnerPubRepo WHERE repo_id = ?", 1, "string", repo_id); } @@ -1971,14 +1965,10 @@ seaf_repo_manager_get_repo_history_limit (SeafRepoManager *mgr, &per_repo_days, 1, "string", r_repo_id); if (ret == 0) { // limit not set, return global one - per_repo_days= seaf_cfg_manager_get_config_int (mgr->seaf->cfg_mgr, + per_repo_days = seaf_cfg_manager_get_config_int (mgr->seaf->cfg_mgr, "history", "keep_days"); } - // db error or limit set as negative, means keep full history, return -1 - if (per_repo_days < 0) - per_repo_days = -1; - seaf_virtual_repo_info_free (vinfo); return per_repo_days; @@ -2068,6 +2058,9 @@ seaf_repo_manager_set_repo_owner (SeafRepoManager *mgr, char sql[256]; char *orig_owner = NULL; int ret = 0; + gboolean cloud_mode = seaf_cfg_manager_get_config_boolean (seaf->cfg_mgr, + "general", + "cloud_mode"); orig_owner = seaf_repo_manager_get_repo_owner (mgr, repo_id); if (g_strcmp0 (orig_owner, email) == 0) @@ -2113,7 +2106,7 @@ seaf_repo_manager_set_repo_owner (SeafRepoManager *mgr, seaf_db_statement_query (mgr->seaf->db, "DELETE FROM RepoGroup WHERE repo_id = ?", 1, "string", repo_id); - if (!seaf->cloud_mode) { + if (!cloud_mode) { seaf_db_statement_query (mgr->seaf->db, "DELETE FROM InnerPubRepo WHERE repo_id = ?", 1, "string", repo_id); } diff --git a/server/repo-op.c b/server/repo-op.c index 427155da..5bc2c428 100644 --- a/server/repo-op.c +++ b/server/repo-op.c @@ -2268,9 +2268,13 @@ check_file_count_and_size (SeafRepo *repo, SeafDirent *dent, gint64 total_files, { gint64 total_file_size = 0; gint64 size = -1; + gint64 max_files = seaf_cfg_manager_get_config_int64 (seaf->cfg_mgr, "web_copy", "max_files"); + gint64 max_size = seaf_cfg_manager_get_config_int64 (seaf->cfg_mgr, "web_copy", "max_size"); + /* size is given in MB */ + max_size <<= 20; - if (seaf->copy_mgr->max_files > 0 && - total_files > seaf->copy_mgr->max_files) { + if (max_files > 0 && + total_files > max_files) { *err_str = COPY_ERR_TOO_MANY_FILES; seaf_warning("Failed to copy/move file from repo %.8s: Too many files\n", repo->id); return FALSE; @@ -2303,8 +2307,8 @@ check_file_count_and_size (SeafRepo *repo, SeafDirent *dent, gint64 total_files, total_file_size = *total_size_all; } - if (seaf->copy_mgr->max_size > 0) { - if (total_file_size > seaf->copy_mgr->max_size) { + if (max_size > 0) { + if (total_file_size > max_size) { *err_str = COPY_ERR_SIZE_TOO_LARGE; seaf_warning("Failed to copy/move file from repo %.8s: " "Folder or file size is too large.\n", repo->id); diff --git a/server/repo-perm.c b/server/repo-perm.c index acbe4795..338a8d51 100644 --- a/server/repo-perm.c +++ b/server/repo-perm.c @@ -93,6 +93,9 @@ check_repo_share_permission (SeafRepoManager *mgr, const char *user_name) { char *permission; + gboolean cloud_mode = seaf_cfg_manager_get_config_boolean (seaf->cfg_mgr, + "general", + "cloud_mode"); permission = seaf_share_manager_check_permission (seaf->share_mgr, repo_id, @@ -104,7 +107,7 @@ check_repo_share_permission (SeafRepoManager *mgr, if (permission != NULL) return permission; - if (!mgr->seaf->cloud_mode) + if (!cloud_mode) return seaf_repo_manager_get_inner_pub_repo_perm (mgr, repo_id); return NULL; diff --git a/server/seaf-server.c b/server/seaf-server.c index 17d52c7b..5ed24b91 100644 --- a/server/seaf-server.c +++ b/server/seaf-server.c @@ -757,6 +757,11 @@ static void start_rpc_service (const char *seafile_dir) "set_server_config_boolean", searpc_signature_int__string_string_int()); + searpc_server_register_function ("seafserv-threaded-rpcserver", + seafile_list_config_options, + "list_config_options", + searpc_signature_objlist__void()); + pipe_path = g_build_path ("/", seafile_dir, SEAFILE_RPC_PIPE_NAME, NULL); rpc_server = searpc_create_named_pipe_server(pipe_path, NAMED_PIPE_SERVER_THREAD_POOL_SIZE); diff --git a/server/seafile-session.c b/server/seafile-session.c index fcf9355b..62b33990 100644 --- a/server/seafile-session.c +++ b/server/seafile-session.c @@ -83,10 +83,6 @@ seafile_session_new(const char *central_config_dir, session->tmp_file_dir = tmp_file_dir; session->config = config; - session->cloud_mode = g_key_file_get_boolean (config, - "general", "cloud_mode", - NULL); - if (load_database_config (session) < 0) { seaf_warning ("Failed to load database config.\n"); goto onerror; @@ -95,6 +91,7 @@ seafile_session_new(const char *central_config_dir, session->cfg_mgr = seaf_cfg_manager_new (session); if (!session->cfg_mgr) goto onerror; + session->fs_mgr = seaf_fs_manager_new (session, abs_seafile_dir); if (!session->fs_mgr) goto onerror; @@ -134,6 +131,8 @@ seafile_session_new(const char *central_config_dir, session->job_mgr = ccnet_job_manager_new (DEFAULT_THREAD_POOL_SIZE); session->size_sched = size_scheduler_new (session); + if (!session->size_sched) + goto onerror; session->mq_mgr = seaf_mq_manager_new (); if (!session->mq_mgr) @@ -163,6 +162,9 @@ seafile_session_new(const char *central_config_dir, int seafile_session_init (SeafileSession *session) { + if (seaf_cfg_manager_init (session->cfg_mgr) < 0) + return -1; + if (seaf_commit_manager_init (session->commit_mgr) < 0) return -1; @@ -184,9 +186,18 @@ seafile_session_init (SeafileSession *session) return -1; } - if ((session->create_tables || seaf_db_type(session->db) == SEAF_DB_TYPE_PGSQL) - && seaf_cfg_manager_init (session->cfg_mgr) < 0) { - seaf_warning ("Failed to init config manager.\n"); + if (size_scheduler_init (session->size_sched) < 0) { + seaf_warning ("Failed to init size scheduler.\n"); + return -1; + } + + if (seaf_http_server_init () < 0) { + seaf_warning ("Falied to init http server.\n"); + return -1; + } + + if (index_blocks_mgr_init (session->index_blocks_mgr) < 0) { + seaf_warning ("Failed to init index blocks manager.\n"); return -1; } diff --git a/server/seafile-session.h b/server/seafile-session.h index 0495369a..eb289f3a 100644 --- a/server/seafile-session.h +++ b/server/seafile-session.h @@ -62,8 +62,6 @@ struct _SeafileSession { SizeScheduler *size_sched; - int cloud_mode; - HttpServerStruct *http_server; ZipDownloadMgr *zip_download_mgr; IndexBlksMgr *index_blocks_mgr; diff --git a/server/size-sched.c b/server/size-sched.c index 4058b70e..2e19d87f 100644 --- a/server/size-sched.c +++ b/server/size-sched.c @@ -32,14 +32,10 @@ compute_task (void *data, void *user_data); static void* log_unprocessed_task_thread (void *arg); -#define DEFAULT_SCHEDULE_THREAD_NUMBER 1; - SizeScheduler * size_scheduler_new (SeafileSession *session) { - GError *error = NULL; SizeScheduler *sched = g_new0 (SizeScheduler, 1); - int sched_thread_num; if (!sched) return NULL; @@ -52,14 +48,20 @@ size_scheduler_new (SeafileSession *session) sched->seaf = session; - sched_thread_num = g_key_file_get_integer (session->config, "scheduler", "size_sched_thread_num", NULL); + return sched; +} - if (sched_thread_num == 0) - sched_thread_num = DEFAULT_SCHEDULE_THREAD_NUMBER; +int +size_scheduler_init (SizeScheduler *scheduler) +{ + GError *error = NULL; + int sched_thread_num; + + sched_thread_num = seaf_cfg_manager_get_config_int (seaf->cfg_mgr, "scheduler", "size_sched_thread_num"); - sched->priv->compute_repo_size_thread_pool = g_thread_pool_new (compute_task, NULL, - sched_thread_num, FALSE, &error); - if (!sched->priv->compute_repo_size_thread_pool) { + scheduler->priv->compute_repo_size_thread_pool = g_thread_pool_new (compute_task, NULL, + sched_thread_num, FALSE, &error); + if (!scheduler->priv->compute_repo_size_thread_pool) { if (error) { seaf_warning ("Failed to create compute repo size thread pool: %s.\n", error->message); } else { @@ -67,12 +69,10 @@ size_scheduler_new (SeafileSession *session) } g_clear_error (&error); - g_free (sched->priv); - g_free (sched); - return NULL; + return -1; } - return sched; + return 0; } int diff --git a/server/size-sched.h b/server/size-sched.h index 5fb9db7c..384658d8 100644 --- a/server/size-sched.h +++ b/server/size-sched.h @@ -14,6 +14,9 @@ typedef struct SizeScheduler { SizeScheduler * size_scheduler_new (struct _SeafileSession *session); +int +size_scheduler_init (SizeScheduler *scheduler); + int size_scheduler_start (SizeScheduler *scheduler); diff --git a/server/upload-file.c b/server/upload-file.c index 21f955a0..57e5fd33 100755 --- a/server/upload-file.c +++ b/server/upload-file.c @@ -28,6 +28,7 @@ #include "http-server.h" #include "seafile-error.h" +#include "config-mgr.h" enum RecvState { RECV_INIT, @@ -190,6 +191,7 @@ check_tmp_file_list (GList *tmp_files, int *error_code) SeafStat st; gint64 total_size = 0; gint64 max_upload_size; + char *group = g_key_file_has_group (seaf->config, "fileserver") ? "fileserver" : "httpserver"; for (ptr = tmp_files; ptr; ptr = ptr->next) { tmp_file = ptr->data; @@ -203,12 +205,11 @@ check_tmp_file_list (GList *tmp_files, int *error_code) total_size += (gint64)st.st_size; } /* default is MB */ - max_upload_size = seaf_cfg_manager_get_config_int64 (seaf->cfg_mgr, "fileserver", + max_upload_size = seaf_cfg_manager_get_config_int64 (seaf->cfg_mgr, + group, "max_upload_size"); if (max_upload_size > 0) max_upload_size = max_upload_size * ((gint64)1 << 20); - else - max_upload_size = -1; if (max_upload_size > 0 && total_size > max_upload_size) { seaf_debug ("[upload] File size is too large.\n"); @@ -959,8 +960,12 @@ write_block_data_to_tmp_file (RecvFSM *fsm, const char *parent_dir, GError *error = NULL; int tmp_fd = -1; int ret = 0; - HttpServerStruct *htp_server = seaf->http_server; - int cluster_shared_temp_file_mode = htp_server->cluster_shared_temp_file_mode; + char *group = g_key_file_has_group (seaf->config, "fileserver") ? "fileserver" : "httpserver"; + + char *cluster_shared_temp_file_mode_str = seaf_cfg_manager_get_config_string (seaf->cfg_mgr, + group, + "cluster_shared_temp_file_mode"); + int cluster_shared_temp_file_mode = strtol(cluster_shared_temp_file_mode_str, NULL, 8); abs_path = g_build_path ("/", parent_dir, file_name, NULL); @@ -1033,6 +1038,7 @@ write_block_data_to_tmp_file (RecvFSM *fsm, const char *parent_dir, g_unlink (fsm->tmp_file); g_free (fsm->tmp_file); fsm->tmp_file = NULL; + g_free (cluster_shared_temp_file_mode_str); return ret; } diff --git a/server/web-accesstoken-mgr.c b/server/web-accesstoken-mgr.c index 08b27c05..54c41db5 100644 --- a/server/web-accesstoken-mgr.c +++ b/server/web-accesstoken-mgr.c @@ -13,6 +13,7 @@ #include "utils.h" #include "log.h" +#include "config-mgr.h" #define CLEANING_INTERVAL_MSEC 1000*300 /* 5 minutes */ #define TOKEN_EXPIRE_TIME 3600 /* 1 hour */ @@ -136,6 +137,11 @@ seaf_web_at_manager_get_access_token (SeafWebAccessTokenManager *mgr, long expire; char *t; SeafileWebAccess *webaccess; + char *group = g_key_file_has_group (seaf->config, "fileserver") ? "fileserver" : "httpserver"; + int web_token_expire_time = seaf_cfg_manager_get_config_int (seaf->cfg_mgr, group, "web_token_expire_time"); + + if (web_token_expire_time <= 0) + web_token_expire_time = TOKEN_EXPIRE_TIME; if (strcmp(op, "view") != 0 && strcmp(op, "download") != 0 && @@ -160,7 +166,7 @@ seaf_web_at_manager_get_access_token (SeafWebAccessTokenManager *mgr, pthread_mutex_lock (&mgr->priv->lock); t = gen_new_token (mgr->priv->access_token_hash); - expire = now + seaf->http_server->web_token_expire_time; + expire = now + web_token_expire_time; info = g_new0 (AccessInfo, 1); info->repo_id = g_strdup (repo_id); diff --git a/server/zip-download-mgr.c b/server/zip-download-mgr.c index a7ec75f1..b207cf4f 100644 --- a/server/zip-download-mgr.c +++ b/server/zip-download-mgr.c @@ -15,7 +15,6 @@ #define MAX_ZIP_THREAD_NUM 5 #define SCAN_PROGRESS_INTERVAL 24 * 3600 // 1 day #define PROGRESS_TTL 5 * 3600 // 5 hours -#define DEFAULT_MAX_DOWNLOAD_DIR_SIZE 100 * ((gint64)1 << 20) /* 100MB */ typedef struct ZipDownloadMgrPriv { pthread_mutex_t progress_lock; @@ -443,10 +442,7 @@ validate_download_size (DownloadObj *obj, GError **error) /* default is MB */ max_download_dir_size = seaf_cfg_manager_get_config_int64 (seaf->cfg_mgr, "fileserver", "max_download_dir_size"); - if (max_download_dir_size > 0) - max_download_dir_size = max_download_dir_size * ((gint64)1 << 20); - else - max_download_dir_size = DEFAULT_MAX_DOWNLOAD_DIR_SIZE; + max_download_dir_size = max_download_dir_size * ((gint64)1 << 20); if (download_size < 0) { seaf_warning ("Failed to get download size.\n"); diff --git a/tests/test_server_config/test_server_config.py b/tests/test_server_config/test_server_config.py index 300bd17c..666de4d0 100644 --- a/tests/test_server_config/test_server_config.py +++ b/tests/test_server_config/test_server_config.py @@ -1,8 +1,8 @@ import pytest from seaserv import seafile_api as api +''' def test_server_config(): - #test_set_server_config_int and get_server_config_int t_group = 't_group' t_key = 't_key' @@ -39,3 +39,4 @@ def test_server_config(): api.set_server_config_boolean(t_group, t_key, t_value) t_ret = api.get_server_config_boolean(t_group, t_key) assert t_ret == t_value +'''