From c142d4bf4f3d3a4622bb45bb38e0680fd505d911 Mon Sep 17 00:00:00 2001 From: Jonathan Xu Date: Mon, 1 Jul 2019 16:41:41 +0800 Subject: [PATCH] Improve code after use named pipe for RPC and support python 3. --- ci/run.py | 3 +- ci/serverctl.py | 17 +- ci/utils.py | 1 - common/branch-mgr.c | 77 ++-- common/commit-mgr.c | 19 +- common/fs-mgr.c | 18 +- common/obj-store.c | 407 +----------------- common/obj-store.h | 73 +--- common/seaf-utils.c | 29 +- common/seaf-utils.h | 8 +- fuse/getattr.c | 10 +- fuse/readdir.c | 19 +- fuse/seafile-session.c | 8 +- fuse/seafile-session.h | 8 +- python/seaserv/service.py | 5 +- server/gc/Makefile.am | 27 +- server/gc/seaf-fsck.c | 17 +- server/gc/seaf-migrate.c | 305 ------------- server/gc/seafile-session.c | 9 +- server/gc/seafile-session.h | 7 +- server/gc/seafserv-gc.c | 17 +- server/http-server.c | 52 +-- server/quota-mgr.c | 8 +- server/repo-mgr.c | 16 +- server/repo-perm.c | 25 +- server/seaf-server.c | 57 +-- server/seafile-session.c | 8 +- server/seafile-session.h | 6 +- .../test_file_operation.py | 1 - .../test_shared_repo_perm.py | 1 - 30 files changed, 206 insertions(+), 1052 deletions(-) delete mode 100644 server/gc/seaf-migrate.c diff --git a/ci/run.py b/ci/run.py index dc980cc..7b8b931 100755 --- a/ci/run.py +++ b/ci/run.py @@ -28,8 +28,7 @@ TOPDIR = abspath(join(os.getcwd(), '..')) if on_travis(): PREFIX = expanduser('~/opt/local') else: - #PREFIX = os.environ.get('SEAFILE_INSTALL_PREFIX', '/usr/local') - PREFIX = os.environ.get('SEAFILE_INSTALL_PREFIX', '/home/ly/.pyenv/versions/3.5.3') + PREFIX = os.environ.get('SEAFILE_INSTALL_PREFIX', '/usr/local') INSTALLDIR = '/tmp/seafile-tests' diff --git a/ci/serverctl.py b/ci/serverctl.py index d8e4fda..fa3f8ec 100755 --- a/ci/serverctl.py +++ b/ci/serverctl.py @@ -148,7 +148,7 @@ connection_charset = utf8 def print_logs(self): for logfile in self.ccnet_log, self.seafile_log: if exists(logfile): - shell('cat {0}'.format(logfile)) + shell(f'cat {logfile}') @retry(wait=wait_fixed(1), stop=stop_after_attempt(10)) def wait_ccnet_ready(self): @@ -168,8 +168,7 @@ connection_charset = utf8 if self.db == 'mysql': ccnet_sql_path = join(self.sql_dir, 'mysql', 'ccnet.sql') seafile_sql_path = join(self.sql_dir, 'mysql', 'seafile.sql') - sql = '''USE ccnet; source {}; - USE seafile; source {};'''.format(ccnet_sql_path, seafile_sql_path) + sql = f'USE ccnet; source {ccnet_sql_path}; USE seafile; source {seafile_sql_path};'.encode() shell('mysql -u root', inputdata=sql, wait=False) else: config_sql_path = join(self.sql_dir, 'sqlite', 'config.sql') @@ -193,17 +192,15 @@ connection_charset = utf8 usermgr_db_path = join(usermgr_dir, 'usermgr.db') seafile_db_path = join(self.seafile_conf_dir, 'seafile.db') - sql = '.read {}'.format(config_sql_path).encode() + sql = f'.read {config_sql_path}'.encode() shell('sqlite3 ' + config_db_path, inputdata=sql, wait=False) - sql = '.read {}'.format(groupmgr_sql_path).encode() + sql = f'.read {groupmgr_sql_path}'.encode() shell('sqlite3 ' + groupmgr_db_path, inputdata=sql, wait=False) - sql = '.read {}'.format(org_sql_path).encode() + sql = f'.read {org_sql_path}'.encode() shell('sqlite3 ' + orgmgr_db_path, inputdata=sql, wait=False) - sql = '.read {}'.format(user_sql_path).encode() + sql = f'.read {user_sql_path}'.encode() shell('sqlite3 ' + usermgr_db_path, inputdata=sql, wait=False) - sql = '.read {}'.format(user_sql_path).encode() - shell('sqlite3 ' + usermgr_db_path, inputdata=sql, wait=False) - sql = '.read {}'.format(seafile_sql_path).encode() + sql = f'.read {seafile_sql_path}'.encode() shell('sqlite3 ' + seafile_db_path, inputdata=sql, wait=False) def start_ccnet(self): diff --git a/ci/utils.py b/ci/utils.py index 3ad2b38..0e908c5 100644 --- a/ci/utils.py +++ b/ci/utils.py @@ -1,5 +1,4 @@ #coding: UTF-8 -from builtins import str import logging import os diff --git a/common/branch-mgr.c b/common/branch-mgr.c index c856faa..fcbaa85 100644 --- a/common/branch-mgr.c +++ b/common/branch-mgr.c @@ -80,19 +80,8 @@ struct _SeafBranchManagerPriv { #ifndef SEAFILE_SERVER pthread_mutex_t db_lock; #endif - -#if defined( SEAFILE_SERVER ) && defined( FULL_FEATURE ) - uint32_t cevent_id; -#endif }; -#if defined( SEAFILE_SERVER ) && defined( FULL_FEATURE ) - -#include -//static void publish_repo_update_event (CEvent *event, void *data); - -#endif - static int open_db (SeafBranchManager *mgr); SeafBranchManager * @@ -114,14 +103,6 @@ seaf_branch_manager_new (struct _SeafileSession *seaf) int seaf_branch_manager_init (SeafBranchManager *mgr) { -#if defined( SEAFILE_SERVER ) && defined( FULL_FEATURE ) -/* - mgr->priv->cevent_id = cevent_manager_register (seaf->ev_mgr, - (cevent_handler)publish_repo_update_event, - NULL); -*/ -#endif - return open_db (mgr); } @@ -330,45 +311,43 @@ get_commit_id (SeafDBRow *row, void *data) return FALSE; } -typedef struct { - char *repo_id; - char *commit_id; -} RepoUpdateEventData; +/* typedef struct { */ +/* char *repo_id; */ +/* char *commit_id; */ +/* } RepoUpdateEventData; */ -/* -static void -publish_repo_update_event (CEvent *event, void *data) -{ - RepoUpdateEventData *rdata = event->data; +/* static void */ +/* publish_repo_update_event (CEvent *event, void *data) */ +/* { */ +/* RepoUpdateEventData *rdata = event->data; */ - char buf[128]; - snprintf (buf, sizeof(buf), "repo-update\t%s\t%s", - rdata->repo_id, rdata->commit_id); +/* char buf[128]; */ +/* snprintf (buf, sizeof(buf), "repo-update\t%s\t%s", */ +/* rdata->repo_id, rdata->commit_id); */ - seaf_mq_manager_publish_event (seaf->mq_mgr, buf); +/* seaf_mq_manager_publish_event (seaf->mq_mgr, buf); */ - g_free (rdata->repo_id); - g_free (rdata->commit_id); - g_free (rdata); -} -*/ +/* g_free (rdata->repo_id); */ +/* g_free (rdata->commit_id); */ +/* g_free (rdata); */ +/* } */ -static void -on_branch_updated (SeafBranchManager *mgr, SeafBranch *branch) -{ - seaf_repo_manager_update_repo_info (seaf->repo_mgr, branch->repo_id, branch->commit_id); +/* static void */ +/* on_branch_updated (SeafBranchManager *mgr, SeafBranch *branch) */ +/* { */ +/* seaf_repo_manager_update_repo_info (seaf->repo_mgr, branch->repo_id, branch->commit_id); */ - if (seaf_repo_manager_is_virtual_repo (seaf->repo_mgr, branch->repo_id)) - return; +/* if (seaf_repo_manager_is_virtual_repo (seaf->repo_mgr, branch->repo_id)) */ +/* return; */ - RepoUpdateEventData *rdata = g_new0 (RepoUpdateEventData, 1); +/* RepoUpdateEventData *rdata = g_new0 (RepoUpdateEventData, 1); */ - rdata->repo_id = g_strdup (branch->repo_id); - rdata->commit_id = g_strdup (branch->commit_id); +/* rdata->repo_id = g_strdup (branch->repo_id); */ +/* rdata->commit_id = g_strdup (branch->commit_id); */ - cevent_manager_add_event (seaf->ev_mgr, mgr->priv->cevent_id, rdata); +/* cevent_manager_add_event (seaf->ev_mgr, mgr->priv->cevent_id, rdata); */ -} +/* } */ int seaf_branch_manager_test_and_update_branch (SeafBranchManager *mgr, @@ -428,7 +407,7 @@ seaf_branch_manager_test_and_update_branch (SeafBranchManager *mgr, seaf_db_trans_close (trans); - on_branch_updated (mgr, branch); + /* on_branch_updated (mgr, branch); */ return 0; } diff --git a/common/commit-mgr.c b/common/commit-mgr.c index 2227e5f..bf28a5b 100644 --- a/common/commit-mgr.c +++ b/common/commit-mgr.c @@ -202,27 +202,10 @@ seaf_commit_manager_new (SeafileSession *seaf) int seaf_commit_manager_init (SeafCommitManager *mgr) { -#ifdef SEAFILE_SERVER - -#ifdef FULL_FEATURE - if (seaf_obj_store_init (mgr->obj_store, TRUE, seaf->ev_mgr) < 0) { + if (seaf_obj_store_init (mgr->obj_store) < 0) { seaf_warning ("[commit mgr] Failed to init commit object store.\n"); return -1; } -#else - if (seaf_obj_store_init (mgr->obj_store, FALSE, NULL) < 0) { - seaf_warning ("[commit mgr] Failed to init commit object store.\n"); - return -1; - } -#endif - -#else - if (seaf_obj_store_init (mgr->obj_store, TRUE, seaf->ev_mgr) < 0) { - seaf_warning ("[commit mgr] Failed to init commit object store.\n"); - return -1; - } -#endif - return 0; } diff --git a/common/fs-mgr.c b/common/fs-mgr.c index 86a8d20..943a02d 100644 --- a/common/fs-mgr.c +++ b/common/fs-mgr.c @@ -89,26 +89,10 @@ seaf_fs_manager_new (SeafileSession *seaf, int seaf_fs_manager_init (SeafFSManager *mgr) { -#ifdef SEAFILE_SERVER - -#ifdef FULL_FEATURE - if (seaf_obj_store_init (mgr->obj_store, TRUE, seaf->ev_mgr) < 0) { + if (seaf_obj_store_init (mgr->obj_store) < 0) { seaf_warning ("[fs mgr] Failed to init fs object store.\n"); return -1; } -#else - if (seaf_obj_store_init (mgr->obj_store, FALSE, NULL) < 0) { - seaf_warning ("[fs mgr] Failed to init fs object store.\n"); - return -1; - } -#endif - -#else - if (seaf_obj_store_init (mgr->obj_store, TRUE, seaf->ev_mgr) < 0) { - seaf_warning ("[fs mgr] Failed to init fs object store.\n"); - return -1; - } -#endif return 0; } diff --git a/common/obj-store.c b/common/obj-store.c index e568183..4e482d2 100644 --- a/common/obj-store.c +++ b/common/obj-store.c @@ -2,7 +2,6 @@ #include "log.h" -#include #include "seafile-session.h" #include "utils.h" @@ -10,65 +9,11 @@ #include "obj-backend.h" #include "obj-store.h" -#define MAX_READER_THREADS 2 -#define MAX_WRITER_THREADS 2 -#define MAX_STAT_THREADS 2 - -typedef struct AsyncTask { - guint32 rw_id; - char obj_id[41]; - void *data; - int len; - gboolean need_sync; - gboolean success; -} AsyncTask; - -typedef struct OSCallbackStruct { - char repo_id[37]; - int version; - OSAsyncCallback cb; - void *cb_data; -} OSCallbackStruct; - struct SeafObjStore { ObjBackend *bend; - - CEventManager *ev_mgr; - - /* For async read. */ - guint32 next_rd_id; - GThreadPool *read_tpool; - GHashTable *readers; - guint32 read_ev_id; - - /* For async write. */ - guint32 next_wr_id; - GThreadPool *write_tpool; - GHashTable *writers; - guint32 write_ev_id; - - /* For async stat. */ - guint32 next_st_id; - GThreadPool *stat_tpool; - GHashTable *stats; - guint32 stat_ev_id; }; typedef struct SeafObjStore SeafObjStore; -static void -reader_thread (void *data, void *user_data); -static void -writer_thread (void *data, void *user_data); -static void -stat_thread (void *data, void *user_data); - -static void -on_read_done (CEvent *event, void *data); -static void -on_write_done (CEvent *event, void *data); -static void -on_stat_done (CEvent *event, void *data); - extern ObjBackend * obj_backend_fs_new (const char *seaf_dir, const char *obj_type); @@ -90,75 +35,9 @@ seaf_obj_store_new (SeafileSession *seaf, const char *obj_type) return store; } -static int -async_init (SeafObjStore *obj_store, CEventManager *ev_mgr) -{ - GError *error = NULL; - - obj_store->ev_mgr = ev_mgr; - - obj_store->read_tpool = g_thread_pool_new (reader_thread, - obj_store, - MAX_READER_THREADS, - FALSE, - &error); - if (error) { - seaf_warning ("Failed to start reader thread pool: %s.\n", error->message); - g_clear_error (&error); - return -1; - } - - obj_store->readers = g_hash_table_new_full (g_direct_hash, g_direct_equal, - NULL, g_free); - obj_store->read_ev_id = cevent_manager_register (ev_mgr, - on_read_done, - obj_store); - - obj_store->write_tpool = g_thread_pool_new (writer_thread, - obj_store, - MAX_WRITER_THREADS, - FALSE, - &error); - if (error) { - seaf_warning ("Failed to start writer thread pool: %s.\n", error->message); - g_clear_error (&error); - return -1; - } - - obj_store->writers = g_hash_table_new_full (g_direct_hash, g_direct_equal, - NULL, g_free); - obj_store->write_ev_id = cevent_manager_register (ev_mgr, - on_write_done, - obj_store); - - obj_store->stat_tpool = g_thread_pool_new (stat_thread, - obj_store, - MAX_STAT_THREADS, - FALSE, - &error); - if (error) { - seaf_warning ("Failed to start statr thread pool: %s.\n", error->message); - g_clear_error (&error); - return -1; - } - - obj_store->stats = g_hash_table_new_full (g_direct_hash, g_direct_equal, - NULL, g_free); - obj_store->stat_ev_id = cevent_manager_register (ev_mgr, - on_stat_done, - obj_store); - - return 0; -} - int -seaf_obj_store_init (SeafObjStore *obj_store, - gboolean enable_async, - CEventManager *ev_mgr) +seaf_obj_store_init (SeafObjStore *obj_store) { - if (enable_async && async_init (obj_store, ev_mgr) < 0) - return -1; - return 0; } @@ -255,290 +134,6 @@ seaf_obj_store_copy_obj (struct SeafObjStore *obj_store, return bend->copy (bend, src_repo_id, src_version, dst_repo_id, dst_version, obj_id); } -static void -reader_thread (void *data, void *user_data) -{ - AsyncTask *task = data; - SeafObjStore *obj_store = user_data; - ObjBackend *bend = obj_store->bend; - OSCallbackStruct *callback; - - callback = g_hash_table_lookup (obj_store->readers, - (gpointer)(long)(task->rw_id)); - if (callback) { - task->success = TRUE; - - if (bend->read (bend, callback->repo_id, callback->version, - task->obj_id, &task->data, &task->len) < 0) - task->success = FALSE; - } - - cevent_manager_add_event (obj_store->ev_mgr, obj_store->read_ev_id, - task); -} - -static void -stat_thread (void *data, void *user_data) -{ - AsyncTask *task = data; - SeafObjStore *obj_store = user_data; - ObjBackend *bend = obj_store->bend; - OSCallbackStruct *callback; - - callback = g_hash_table_lookup (obj_store->stats, - (gpointer)(long)(task->rw_id)); - if (callback) { - task->success = TRUE; - - if (!bend->exists (bend, callback->repo_id, callback->version, task->obj_id)) - task->success = FALSE; - } - - cevent_manager_add_event (obj_store->ev_mgr, obj_store->stat_ev_id, - task); -} - -static void -writer_thread (void *data, void *user_data) -{ - AsyncTask *task = data; - SeafObjStore *obj_store = user_data; - ObjBackend *bend = obj_store->bend; - OSCallbackStruct *callback; - - callback = g_hash_table_lookup (obj_store->writers, - (gpointer)(long)(task->rw_id)); - if (callback) { - task->success = TRUE; - - if (bend->write (bend, callback->repo_id, callback->version, - task->obj_id, task->data, task->len, task->need_sync) < 0) - task->success = FALSE; - } - - cevent_manager_add_event (obj_store->ev_mgr, obj_store->write_ev_id, - task); -} - -static void -on_read_done (CEvent *event, void *user_data) -{ - AsyncTask *task = event->data; - SeafObjStore *obj_store = user_data; - OSCallbackStruct *callback; - OSAsyncResult res; - - callback = g_hash_table_lookup (obj_store->readers, - (gpointer)(long)(task->rw_id)); - if (callback) { - res.rw_id = task->rw_id; - memcpy (res.obj_id, task->obj_id, 41); - res.data = task->data; - res.len = task->len; - res.success = task->success; - - callback->cb (&res, callback->cb_data); - } - - g_free (task->data); - g_free (task); -} - -static void -on_stat_done (CEvent *event, void *user_data) -{ - AsyncTask *task = event->data; - SeafObjStore *obj_store = user_data; - OSCallbackStruct *callback; - OSAsyncResult res; - - callback = g_hash_table_lookup (obj_store->stats, - (gpointer)(long)(task->rw_id)); - if (callback) { - res.rw_id = task->rw_id; - memcpy (res.obj_id, task->obj_id, 41); - res.data = NULL; - res.len = task->len; - res.success = task->success; - - callback->cb (&res, callback->cb_data); - } - - g_free (task->data); - g_free (task); -} - -static void -on_write_done (CEvent *event, void *user_data) -{ - AsyncTask *task = event->data; - SeafObjStore *obj_store = user_data; - OSCallbackStruct *callback; - OSAsyncResult res; - - callback = g_hash_table_lookup (obj_store->writers, - (gpointer)(long)(task->rw_id)); - if (callback) { - res.rw_id = task->rw_id; - memcpy (res.obj_id, task->obj_id, 41); - res.data = task->data; - res.len = task->len; - res.success = task->success; - - callback->cb (&res, callback->cb_data); - } - - g_free (task->data); - g_free (task); -} - -guint32 -seaf_obj_store_register_async_read (struct SeafObjStore *obj_store, - const char *repo_id, - int version, - OSAsyncCallback callback, - void *cb_data) -{ - guint32 id = obj_store->next_rd_id++; - OSCallbackStruct *cb_struct = g_new0 (OSCallbackStruct, 1); - - memcpy (cb_struct->repo_id, repo_id, 36); - cb_struct->version = version; - cb_struct->cb = callback; - cb_struct->cb_data = cb_data; - - g_hash_table_insert (obj_store->readers, (gpointer)(long)id, cb_struct); - - return id; -} - -void -seaf_obj_store_unregister_async_read (struct SeafObjStore *obj_store, - guint32 reader_id) -{ - g_hash_table_remove (obj_store->readers, (gpointer)(long)reader_id); -} - -int -seaf_obj_store_async_read (struct SeafObjStore *obj_store, - guint32 reader_id, - const char *obj_id) -{ - AsyncTask *task = g_new0 (AsyncTask, 1); - GError *error = NULL; - - task->rw_id = reader_id; - memcpy (task->obj_id, obj_id, 41); - - g_thread_pool_push (obj_store->read_tpool, task, &error); - if (error) { - seaf_warning ("Failed to start aysnc read of %s.\n", obj_id); - return -1; - } - - return 0; -} - -guint32 -seaf_obj_store_register_async_stat (struct SeafObjStore *obj_store, - const char *repo_id, - int version, - OSAsyncCallback callback, - void *cb_data) -{ - guint32 id = obj_store->next_st_id++; - OSCallbackStruct *cb_struct = g_new0 (OSCallbackStruct, 1); - - memcpy (cb_struct->repo_id, repo_id, 36); - cb_struct->version = version; - cb_struct->cb = callback; - cb_struct->cb_data = cb_data; - - g_hash_table_insert (obj_store->stats, (gpointer)(long)id, cb_struct); - - return id; -} - -void -seaf_obj_store_unregister_async_stat (struct SeafObjStore *obj_store, - guint32 stat_id) -{ - g_hash_table_remove (obj_store->stats, (gpointer)(long)stat_id); -} - -int -seaf_obj_store_async_stat (struct SeafObjStore *obj_store, - guint32 stat_id, - const char *obj_id) -{ - AsyncTask *task = g_new0 (AsyncTask, 1); - GError *error = NULL; - - task->rw_id = stat_id; - memcpy (task->obj_id, obj_id, 41); - - g_thread_pool_push (obj_store->stat_tpool, task, &error); - if (error) { - seaf_warning ("Failed to start aysnc stat of %s.\n", obj_id); - return -1; - } - - return 0; -} - -guint32 -seaf_obj_store_register_async_write (struct SeafObjStore *obj_store, - const char *repo_id, - int version, - OSAsyncCallback callback, - void *cb_data) -{ - guint32 id = obj_store->next_rd_id++; - OSCallbackStruct *cb_struct = g_new0 (OSCallbackStruct, 1); - - memcpy (cb_struct->repo_id, repo_id, 36); - cb_struct->version = version; - cb_struct->cb = callback; - cb_struct->cb_data = cb_data; - - g_hash_table_insert (obj_store->writers, (gpointer)(long)id, cb_struct); - - return id; -} - -void -seaf_obj_store_unregister_async_write (struct SeafObjStore *obj_store, - guint32 writer_id) -{ - g_hash_table_remove (obj_store->writers, (gpointer)(long)writer_id); -} - -int -seaf_obj_store_async_write (struct SeafObjStore *obj_store, - guint32 writer_id, - const char *obj_id, - const void *obj_data, - int data_len, - gboolean need_sync) -{ - AsyncTask *task = g_new0 (AsyncTask, 1); - GError *error = NULL; - - task->rw_id = writer_id; - memcpy (task->obj_id, obj_id, 41); - task->data = g_memdup (obj_data, data_len); - task->len = data_len; - task->need_sync = need_sync; - - g_thread_pool_push (obj_store->write_tpool, task, &error); - if (error) { - seaf_warning ("Failed to start aysnc write of %s.\n", obj_id); - return -1; - } - - return 0; -} - int seaf_obj_store_remove_store (struct SeafObjStore *obj_store, const char *store_id) diff --git a/common/obj-store.h b/common/obj-store.h index 12be43f..01ae21d 100644 --- a/common/obj-store.h +++ b/common/obj-store.h @@ -6,15 +6,12 @@ struct _SeafileSession; struct SeafObjStore; -struct CEventManager; struct SeafObjStore * seaf_obj_store_new (struct _SeafileSession *seaf, const char *obj_type); int -seaf_obj_store_init (struct SeafObjStore *obj_store, - gboolean enable_async, - struct CEventManager *ev_mgr); +seaf_obj_store_init (struct SeafObjStore *obj_store); /* Synchronous I/O interface. */ @@ -67,74 +64,8 @@ seaf_obj_store_copy_obj (struct SeafObjStore *obj_store, int dst_version, const char *obj_id); -/* Asynchronous I/O interface. */ - -typedef struct OSAsyncResult { - guint32 rw_id; - char obj_id[41]; - /* @data is owned by obj-store, don't free it. */ - void *data; - int len; - gboolean success; -} OSAsyncResult; - -typedef void (*OSAsyncCallback) (OSAsyncResult *res, void *cb_data); - -/* Async read */ -guint32 -seaf_obj_store_register_async_read (struct SeafObjStore *obj_store, - const char *repo_id, - int version, - OSAsyncCallback callback, - void *cb_data); - -void -seaf_obj_store_unregister_async_read (struct SeafObjStore *obj_store, - guint32 reader_id); - -int -seaf_obj_store_async_read (struct SeafObjStore *obj_store, - guint32 reader_id, - const char *obj_id); - -/* Async write */ -guint32 -seaf_obj_store_register_async_write (struct SeafObjStore *obj_store, - const char *repo_id, - int version, - OSAsyncCallback callback, - void *cb_data); - -void -seaf_obj_store_unregister_async_write (struct SeafObjStore *obj_store, - guint32 writer_id); - -int -seaf_obj_store_async_write (struct SeafObjStore *obj_store, - guint32 writer_id, - const char *obj_id, - const void *obj_data, - int data_len, - gboolean need_sync); - -/* Async stat */ -guint32 -seaf_obj_store_register_async_stat (struct SeafObjStore *obj_store, - const char *repo_id, - int version, - OSAsyncCallback callback, - void *cb_data); - -void -seaf_obj_store_unregister_async_stat (struct SeafObjStore *obj_store, - guint32 stat_id); - -int -seaf_obj_store_async_stat (struct SeafObjStore *obj_store, - guint32 stat_id, - const char *obj_id); - int seaf_obj_store_remove_store (struct SeafObjStore *obj_store, const char *store_id); + #endif diff --git a/common/seaf-utils.c b/common/seaf-utils.c index b71e704..2fa1d42 100644 --- a/common/seaf-utils.c +++ b/common/seaf-utils.c @@ -10,6 +10,9 @@ #include #include +#include +#include + char * seafile_session_get_tmp_file_path (SeafileSession *session, const char *basename, @@ -228,19 +231,31 @@ load_database_config (SeafileSession *session) } SearpcClient * -create_rpc_clients (const char *config_dir) +create_ccnet_rpc_client () { - SearpcNamedPipeClient *rpc_client = NULL; + SearpcNamedPipeClient *transport = NULL; char *pipe_path = NULL; - pipe_path = g_strdup_printf ("%s/%s", config_dir, "ccnet-rpc.sock"); - rpc_client = searpc_create_named_pipe_client(pipe_path); + pipe_path = g_build_path ("/", seaf->ccnet_dir, CCNET_RPC_PIPE_NAME, NULL); + transport = searpc_create_named_pipe_client(pipe_path); g_free(pipe_path); + if (!transport) + return NULL; - if (searpc_named_pipe_client_connect(rpc_client) < 0) { + if (searpc_named_pipe_client_connect(transport) < 0) { seaf_warning ("Named pipe client failed to connect.\n"); - exit (1); + g_free (transport); + return NULL; } - return searpc_client_with_named_pipe_transport (rpc_client, "ccnet-threaded-rpcserver"); + return searpc_client_with_named_pipe_transport (transport, "ccnet-threaded-rpcserver"); +} + +void +release_ccnet_rpc_client (SearpcClient *client) +{ + if (!client) + return; + + searpc_free_client_with_pipe_transport (client); } diff --git a/common/seaf-utils.h b/common/seaf-utils.h index 4cdd80a..d90dc75 100644 --- a/common/seaf-utils.h +++ b/common/seaf-utils.h @@ -2,11 +2,9 @@ #define SEAF_UTILS_H #include -#include struct _SeafileSession; - char * seafile_session_get_tmp_file_path (struct _SeafileSession *session, const char *basename, @@ -16,5 +14,9 @@ int load_database_config (struct _SeafileSession *session); SearpcClient * -create_rpc_clients (const char *config_dir); +create_ccnet_rpc_client (); + +void +release_ccnet_rpc_client (SearpcClient *client); + #endif diff --git a/fuse/getattr.c b/fuse/getattr.c index 14406b5..7875aeb 100644 --- a/fuse/getattr.c +++ b/fuse/getattr.c @@ -38,11 +38,15 @@ static int getattr_user(SeafileSession *seaf, const char *user, struct stat *stb SearpcClient *client; CcnetEmailUser *emailuser; - client = create_rpc_clients (seaf->config_dir); + client = create_ccnet_rpc_client (); + if (!client) { + seaf_warning ("Failed to alloc ccnet rpc client.\n"); + return -ENOMEM; + } emailuser = get_user_from_ccnet (client, user); if (!emailuser) { - searpc_free_client_with_pipe_transport(client); + release_ccnet_rpc_client (client); return -ENOENT; } g_object_unref (emailuser); @@ -50,7 +54,7 @@ static int getattr_user(SeafileSession *seaf, const char *user, struct stat *stb stbuf->st_mode = S_IFDIR | 0755; stbuf->st_nlink = 2; stbuf->st_size = 4096; - searpc_free_client_with_pipe_transport(client); + release_ccnet_rpc_client (client); return 0; } diff --git a/fuse/readdir.c b/fuse/readdir.c index f6e0d83..ea51b54 100644 --- a/fuse/readdir.c +++ b/fuse/readdir.c @@ -54,7 +54,11 @@ static int readdir_root(SeafileSession *seaf, GHashTable *user_hash; int dummy; - client = create_rpc_clients (seaf->config_dir); + client = create_ccnet_rpc_client (); + if (!client) { + seaf_warning ("Failed to alloc ccnet rpc client.\n"); + return -ENOMEM; + } user_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); @@ -88,7 +92,7 @@ static int readdir_root(SeafileSession *seaf, g_hash_table_destroy (user_hash); - searpc_free_client_with_pipe_transport(client); + release_ccnet_rpc_client (client); return 0; } @@ -102,18 +106,22 @@ static int readdir_user(SeafileSession *seaf, const char *user, GList *list = NULL, *p; GString *name; - client = create_rpc_clients (seaf->config_dir); + client = create_ccnet_rpc_client (); + if (!client) { + seaf_warning ("Failed to alloc ccnet rpc client.\n"); + return -ENOMEM; + } emailuser = get_user_from_ccnet (client, user); if (!emailuser) { - searpc_free_client_with_pipe_transport(client); + release_ccnet_rpc_client (client); return -ENOENT; } g_object_unref (emailuser); + release_ccnet_rpc_client (client); list = seaf_repo_manager_get_repos_by_owner (seaf->repo_mgr, user); if (!list) { - searpc_free_client_with_pipe_transport(client); return 0; } @@ -144,7 +152,6 @@ static int readdir_user(SeafileSession *seaf, const char *user, g_list_free (list); - searpc_free_client_with_pipe_transport(client); return 0; } diff --git a/fuse/seafile-session.c b/fuse/seafile-session.c index fff3f2a..65fb533 100644 --- a/fuse/seafile-session.c +++ b/fuse/seafile-session.c @@ -19,18 +19,18 @@ read_excluded_users (SeafileSession *session); SeafileSession * seafile_session_new(const char *central_config_dir, const char *seafile_dir, - const char *config_dir) + const char *ccnet_dir) { char *abs_central_config_dir = NULL; char *abs_seafile_dir; - char *abs_config_dir = NULL; + char *abs_ccnet_dir = NULL; char *tmp_file_dir; char *config_file_path; struct stat st; GKeyFile *config; SeafileSession *session = NULL; - abs_config_dir = ccnet_expand_path (config_dir); + abs_ccnet_dir = ccnet_expand_path (ccnet_dir); abs_seafile_dir = ccnet_expand_path (seafile_dir); tmp_file_dir = g_build_filename(abs_seafile_dir, "tmpfiles", NULL); if (central_config_dir) { @@ -63,7 +63,7 @@ seafile_session_new(const char *central_config_dir, session = g_new0(SeafileSession, 1); session->seaf_dir = abs_seafile_dir; - session->config_dir = abs_config_dir; + session->ccnet_dir = abs_ccnet_dir; session->tmp_file_dir = tmp_file_dir; session->config = config; session->excluded_users = g_hash_table_new_full (g_str_hash, g_str_equal, diff --git a/fuse/seafile-session.h b/fuse/seafile-session.h index ed75853..a5d677b 100644 --- a/fuse/seafile-session.h +++ b/fuse/seafile-session.h @@ -12,15 +12,11 @@ #include "commit-mgr.h" #include "repo-mgr.h" -#include - typedef struct _SeafileSession SeafileSession; struct _SeafileSession { - SearpcClient *rpc_client; - char *seaf_dir; - char *config_dir; + char *ccnet_dir; char *tmp_file_dir; /* Config that's only loaded on start */ GKeyFile *config; @@ -42,7 +38,7 @@ extern SeafileSession *seaf; SeafileSession * seafile_session_new(const char *central_config_dir, const char *seafile_dir, - const char *config_dir); + const char *ccnet_dir); int seafile_session_init (SeafileSession *session); diff --git a/python/seaserv/service.py b/python/seaserv/service.py index 030b289..db59186 100644 --- a/python/seaserv/service.py +++ b/python/seaserv/service.py @@ -35,10 +35,7 @@ SEAFILE_CENTRAL_CONF_DIR = _load_path_from_env('SEAFILE_CENTRAL_CONF_DIR', check ccnet_pipe_path = os.path.join (CCNET_CONF_PATH, 'ccnet-rpc.sock') ccnet_threaded_rpc = ccnet.CcnetThreadedRpcClient(ccnet_pipe_path) -if SEAFILE_CENTRAL_CONF_DIR: - seafile_pipe_path = os.path.join(SEAFILE_CENTRAL_CONF_DIR, 'seafile.sock') -else: - seafile_pipe_path = os.path.join(SEAFILE_CONF_DIR, 'seafile.sock') +seafile_pipe_path = os.path.join(SEAFILE_CONF_DIR, 'seafile.sock') seafserv_threaded_rpc = seafile.ServerThreadedRpcClient(seafile_pipe_path) # load ccnet server addr and port from ccnet.conf. diff --git a/server/gc/Makefile.am b/server/gc/Makefile.am index 7f113fc..4538f1b 100644 --- a/server/gc/Makefile.am +++ b/server/gc/Makefile.am @@ -12,7 +12,7 @@ AM_CFLAGS = -DPKGDATADIR=\"$(pkgdatadir)\" \ @MSVC_CFLAGS@ \ -Wall -bin_PROGRAMS = seafserv-gc seaf-fsck seaf-migrate +bin_PROGRAMS = seafserv-gc seaf-fsck noinst_HEADERS = \ seafile-session.h \ @@ -64,28 +64,3 @@ seaf_fsck_LDADD = @CCNET_LIBS@ \ @GLIB2_LIBS@ @GOBJECT_LIBS@ @SSL_LIBS@ @LIB_RT@ @LIB_UUID@ -lsqlite3 @LIBEVENT_LIBS@ \ @SEARPC_LIBS@ @JANSSON_LIBS@ ${LIB_WS32} @ZLIB_LIBS@ \ @MYSQL_LIBS@ @PGSQL_LIBS@ - -seaf_migrate_SOURCES = \ - seaf-migrate.c \ - $(common_sources) - -seaf_migrate_LDADD = @CCNET_LIBS@ \ - $(top_builddir)/common/cdc/libcdc.la \ - $(top_builddir)/common/db-wrapper/libdbwrapper.la \ - $(top_builddir)/lib/libseafile_common.la \ - @GLIB2_LIBS@ @GOBJECT_LIBS@ @SSL_LIBS@ @LIB_RT@ @LIB_UUID@ -lsqlite3 @LIBEVENT_LIBS@ \ - @SEARPC_LIBS@ @JANSSON_LIBS@ ${LIB_WS32} @ZLIB_LIBS@ \ - @MYSQL_LIBS@ @PGSQL_LIBS@ - -seaf_migrate_CFLAGS = -DPKGDATADIR=\"$(pkgdatadir)\" \ - -DPACKAGE_DATA_DIR=\""$(pkgdatadir)"\" \ - -DSEAFILE_SERVER -DMIGRATION \ - -I$(top_srcdir)/include \ - -I$(top_srcdir)/lib \ - -I$(top_builddir)/lib \ - -I$(top_srcdir)/common \ - @CCNET_CFLAGS@ \ - @SEARPC_CFLAGS@ \ - @GLIB2_CFLAGS@ \ - @MSVC_CFLAGS@ \ - -Wall diff --git a/server/gc/seaf-fsck.c b/server/gc/seaf-fsck.c index 890f61a..9a3be56 100644 --- a/server/gc/seaf-fsck.c +++ b/server/gc/seaf-fsck.c @@ -10,11 +10,10 @@ #include "utils.h" -static char *config_dir = NULL; +static char *ccnet_dir = NULL; static char *seafile_dir = NULL; static char *central_config_dir = NULL; -CcnetClient *ccnet_client; SeafileSession *seaf; static const char *short_opts = "hvft:c:d:rE:F:"; @@ -102,7 +101,7 @@ main(int argc, char *argv[]) argv = get_argv_utf8 (&argc); #endif - config_dir = DEFAULT_CONFIG_DIR; + ccnet_dir = DEFAULT_CONFIG_DIR; while ((c = getopt_long(argc, argv, short_opts, long_opts, NULL)) != EOF) { @@ -126,7 +125,7 @@ main(int argc, char *argv[]) export_path = strdup(optarg); break; case 'c': - config_dir = strdup(optarg); + ccnet_dir = strdup(optarg); break; case 'd': seafile_dir = strdup(optarg); @@ -149,14 +148,8 @@ main(int argc, char *argv[]) exit (1); } - ccnet_client = ccnet_client_new(); - if ((ccnet_client_load_confdir(ccnet_client, central_config_dir, config_dir)) < 0) { - seaf_warning ("Read config dir error\n"); - return -1; - } - if (seafile_dir == NULL) - seafile_dir = g_build_filename (config_dir, "seafile-data", NULL); + seafile_dir = g_build_filename (ccnet_dir, "seafile-data", NULL); #ifdef __linux__ uid_t current_user, seafile_user; @@ -168,7 +161,7 @@ main(int argc, char *argv[]) } #endif - seaf = seafile_session_new(central_config_dir, seafile_dir, ccnet_client, + seaf = seafile_session_new(central_config_dir, seafile_dir, ccnet_dir, export_path == NULL); if (!seaf) { seaf_warning ("Failed to create seafile session.\n"); diff --git a/server/gc/seaf-migrate.c b/server/gc/seaf-migrate.c deleted file mode 100644 index 2d66b27..0000000 --- a/server/gc/seaf-migrate.c +++ /dev/null @@ -1,305 +0,0 @@ -#include "common.h" - -#define DEBUG_FLAG SEAFILE_DEBUG_OTHER -#include "log.h" - -#include - -#include - -#include "seafile-session.h" - -#include "utils.h" - -static char *config_dir = NULL; -static char *seafile_dir = NULL; -static char *central_config_dir = NULL; - -CcnetClient *ccnet_client; -SeafileSession *seaf; - -static const char *short_opts = "hvc:d:VDiF:"; -static const struct option long_opts[] = { - { "help", no_argument, NULL, 'h', }, - { "version", no_argument, NULL, 'v', }, - { "config-file", required_argument, NULL, 'c', }, - { "central-config-dir", required_argument, NULL, 'F' }, - { "seafdir", required_argument, NULL, 'd', }, - { 0, 0, 0, 0, }, -}; - -static int -migrate_v0_repos_to_v1_layout (); - -static void usage () -{ - fprintf (stderr, - "usage: seaf-migrate [-c config_dir] [-d seafile_dir]\n"); -} - -#ifdef WIN32 -/* Get the commandline arguments in unicode, then convert them to utf8 */ -static char ** -get_argv_utf8 (int *argc) -{ - int i = 0; - char **argv = NULL; - const wchar_t *cmdline = NULL; - wchar_t **argv_w = NULL; - - cmdline = GetCommandLineW(); - argv_w = CommandLineToArgvW (cmdline, argc); - if (!argv_w) { - printf("failed to CommandLineToArgvW(), GLE=%lu\n", GetLastError()); - return NULL; - } - - argv = (char **)malloc (sizeof(char*) * (*argc)); - for (i = 0; i < *argc; i++) { - argv[i] = wchar_to_utf8 (argv_w[i]); - } - - return argv; -} -#endif - -int -main(int argc, char *argv[]) -{ - int c; - -#ifdef WIN32 - argv = get_argv_utf8 (&argc); -#endif - - config_dir = DEFAULT_CONFIG_DIR; - - while ((c = getopt_long(argc, argv, - short_opts, long_opts, NULL)) != EOF) { - switch (c) { - case 'h': - usage(); - exit(0); - case 'v': - exit(-1); - break; - case 'c': - config_dir = strdup(optarg); - break; - case 'd': - seafile_dir = strdup(optarg); - break; - case 'F': - central_config_dir = strdup(optarg); - break; - default: - usage(); - exit(-1); - } - } - -#if !GLIB_CHECK_VERSION(2, 35, 0) - g_type_init(); -#endif - - if (seafile_log_init ("-", "info", "debug") < 0) { - seaf_warning ("Failed to init log.\n"); - exit (1); - } - - ccnet_client = ccnet_client_new(); - if ((ccnet_client_load_confdir(ccnet_client, central_config_dir, config_dir)) < 0) { - seaf_warning ("Read config dir error\n"); - return -1; - } - - if (seafile_dir == NULL) - seafile_dir = g_build_filename (config_dir, "seafile-data", NULL); - - seaf = seafile_session_new(central_config_dir, seafile_dir, ccnet_client, TRUE); - if (!seaf) { - seaf_warning ("Failed to create seafile session.\n"); - exit (1); - } - - migrate_v0_repos_to_v1_layout (); - - return 0; -} - -typedef struct { - SeafRepo *repo; - GHashTable *visited; - - /* > 0: keep a period of history; - * == 0: only keep data in head commit; - * < 0: keep all history data. - */ - gint64 truncate_time; - gboolean traversed_head; - gboolean stop_copy_blocks; -} MigrationData; - -static int -migrate_file_blocks (SeafFSManager *mgr, MigrationData *data, const char *file_id) -{ - SeafRepo *repo = data->repo; - Seafile *seafile; - int i; - char *block_id; - - seafile = seaf_fs_manager_get_seafile (mgr, repo->store_id, repo->version, file_id); - if (!seafile) { - seaf_warning ("Failed to find file %s.\n", file_id); - return -1; - } - - for (i = 0; i < seafile->n_blocks; ++i) { - block_id = seafile->blk_sha1s[i]; - if (seaf_block_manager_copy_block (seaf->block_mgr, - repo->store_id, repo->version, - repo->store_id, 1, - block_id) < 0) { - seaf_warning ("Failed to copy block %s.\n", block_id); - seafile_unref (seafile); - return -1; - } - } - - seafile_unref (seafile); - - return 0; -} - -static gboolean -fs_callback (SeafFSManager *mgr, - const char *store_id, - int version, - const char *obj_id, - int type, - void *user_data, - gboolean *stop) -{ - MigrationData *data = user_data; - SeafRepo *repo = data->repo; - - if (data->visited != NULL) { - if (g_hash_table_lookup (data->visited, obj_id) != NULL) { - *stop = TRUE; - return TRUE; - } - - char *key = g_strdup(obj_id); - g_hash_table_replace (data->visited, key, key); - } - - if (seaf_obj_store_copy_obj (seaf->fs_mgr->obj_store, - repo->store_id, repo->version, - repo->store_id, 1, - obj_id) < 0) { - seaf_warning ("Failed to copy fs object %s.\n", obj_id); - return FALSE; - } - - if (data->stop_copy_blocks) - return TRUE; - - if (type == SEAF_METADATA_TYPE_FILE && - migrate_file_blocks (mgr, data, obj_id) < 0) - return FALSE; - - return TRUE; -} - -static gboolean -traverse_commit (SeafCommit *commit, void *vdata, gboolean *stop) -{ - MigrationData *data = vdata; - SeafRepo *repo = data->repo; - int ret; - - if (data->truncate_time > 0 && - (gint64)(commit->ctime) < data->truncate_time && - data->traversed_head && !data->stop_copy_blocks) { - data->stop_copy_blocks = TRUE; - } - - if (!data->traversed_head) - data->traversed_head = TRUE; - - if (seaf_obj_store_copy_obj (seaf->commit_mgr->obj_store, - repo->id, repo->version, - repo->id, 1, - commit->commit_id) < 0) { - seaf_warning ("Failed to copy commit %s.\n", commit->commit_id); - return FALSE; - } - - ret = seaf_fs_manager_traverse_tree (seaf->fs_mgr, - data->repo->store_id, data->repo->version, - commit->root_id, - fs_callback, - data, FALSE); - if (ret < 0) - return FALSE; - - if (data->truncate_time == 0 && !data->stop_copy_blocks) { - data->stop_copy_blocks = TRUE; - /* Stop after traversing the head commit. */ - } - - return TRUE; -} - -static int -migrate_repo (SeafRepo *repo) -{ - MigrationData *data; - int ret = 0; - - seaf_message ("Migrating data for repo %.8s.\n", repo->id); - - data = g_new0(MigrationData, 1); - data->repo = repo; - data->visited = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); - - gint64 truncate_time = seaf_repo_manager_get_repo_truncate_time (repo->manager, - repo->id); - data->truncate_time = truncate_time; - - gboolean res = seaf_commit_manager_traverse_commit_tree (seaf->commit_mgr, - repo->id, - repo->version, - repo->head->commit_id, - traverse_commit, - data, - FALSE); - if (!res) { - seaf_warning ("Migration of repo %s is not completed.\n", repo->id); - ret = -1; - } - - g_hash_table_destroy (data->visited); - g_free (data); - - return ret; -} - -static int -migrate_v0_repos_to_v1_layout () -{ - GList *repos = NULL, *ptr; - SeafRepo *repo; - gboolean error = FALSE; - - repos = seaf_repo_manager_get_repo_list (seaf->repo_mgr, -1, -1, &error); - for (ptr = repos; ptr; ptr = ptr->next) { - repo = ptr->data; - if (!repo->is_corrupted && repo->version == 0) - migrate_repo (repo); - seaf_repo_unref (repo); - } - g_list_free (repos); - - return 0; -} diff --git a/server/gc/seafile-session.c b/server/gc/seafile-session.c index 4fcbcf1..ebdb6b6 100644 --- a/server/gc/seafile-session.c +++ b/server/gc/seafile-session.c @@ -15,21 +15,20 @@ SeafileSession * seafile_session_new(const char *central_config_dir, const char *seafile_dir, - CcnetClient *ccnet_session, + const char *ccnet_dir, gboolean need_db) { char *abs_central_config_dir = NULL; char *abs_seafile_dir; + char *abs_ccnet_dir; char *tmp_file_dir; char *config_file_path; struct stat st; GKeyFile *config; SeafileSession *session = NULL; - if (!ccnet_session) - return NULL; - abs_seafile_dir = ccnet_expand_path (seafile_dir); + abs_ccnet_dir = ccnet_expand_path (ccnet_dir); tmp_file_dir = g_build_filename (abs_seafile_dir, "tmpfiles", NULL); if (central_config_dir) { abs_central_config_dir = ccnet_expand_path (central_config_dir); @@ -66,8 +65,8 @@ seafile_session_new(const char *central_config_dir, session = g_new0(SeafileSession, 1); session->seaf_dir = abs_seafile_dir; + session->ccnet_dir = abs_ccnet_dir; session->tmp_file_dir = tmp_file_dir; - session->session = ccnet_session; session->config = config; if (need_db) { diff --git a/server/gc/seafile-session.h b/server/gc/seafile-session.h index f154387..20b4a1d 100644 --- a/server/gc/seafile-session.h +++ b/server/gc/seafile-session.h @@ -13,14 +13,11 @@ #include "seaf-db.h" #include "config-mgr.h" -struct _CcnetClient; - typedef struct _SeafileSession SeafileSession; struct _SeafileSession { - struct _CcnetClient *session; - char *seaf_dir; + char *ccnet_dir; char *tmp_file_dir; /* Config that's only loaded on start */ GKeyFile *config; @@ -41,7 +38,7 @@ extern SeafileSession *seaf; SeafileSession * seafile_session_new(const char *central_config_dir, const char *seafile_dir, - struct _CcnetClient *ccnet, + const char *ccnet_dir, gboolean need_db); #endif diff --git a/server/gc/seafserv-gc.c b/server/gc/seafserv-gc.c index 77965a2..0a104da 100644 --- a/server/gc/seafserv-gc.c +++ b/server/gc/seafserv-gc.c @@ -11,11 +11,10 @@ #include "utils.h" -static char *config_dir = NULL; +static char *ccnet_dir = NULL; static char *seafile_dir = NULL; static char *central_config_dir = NULL; -CcnetClient *ccnet_client; SeafileSession *seaf; static const char *short_opts = "hvc:d:VDrF:"; @@ -80,7 +79,7 @@ main(int argc, char *argv[]) argv = get_argv_utf8 (&argc); #endif - config_dir = DEFAULT_CONFIG_DIR; + ccnet_dir = DEFAULT_CONFIG_DIR; while ((c = getopt_long(argc, argv, short_opts, long_opts, NULL)) != EOF) { @@ -92,7 +91,7 @@ main(int argc, char *argv[]) exit(-1); break; case 'c': - config_dir = strdup(optarg); + ccnet_dir = strdup(optarg); break; case 'd': seafile_dir = strdup(optarg); @@ -124,16 +123,10 @@ main(int argc, char *argv[]) exit (1); } - ccnet_client = ccnet_client_new(); - if ((ccnet_client_load_confdir(ccnet_client, central_config_dir, config_dir)) < 0) { - seaf_warning ("Read config dir error\n"); - return -1; - } - if (seafile_dir == NULL) - seafile_dir = g_build_filename (config_dir, "seafile-data", NULL); + seafile_dir = g_build_filename (ccnet_dir, "seafile-data", NULL); - seaf = seafile_session_new(central_config_dir, seafile_dir, ccnet_client, TRUE); + seaf = seafile_session_new(central_config_dir, seafile_dir, ccnet_dir, TRUE); if (!seaf) { seaf_warning ("Failed to create seafile session.\n"); exit (1); diff --git a/server/http-server.c b/server/http-server.c index 8fcbc6e..0e38496 100644 --- a/server/http-server.c +++ b/server/http-server.c @@ -62,8 +62,8 @@ struct _HttpServer { GHashTable *vir_repo_info_cache; pthread_mutex_t vir_repo_info_cache_lock; - uint32_t cevent_id; /* Used for sending activity events. */ - uint32_t stats_event_id; /* Used for sending events for statistics. */ + /* uint32_t cevent_id; /\* Used for sending activity events. *\/ */ + /* uint32_t stats_event_id; /\* Used for sending events for statistics. *\/ */ event_t *reap_timer; }; @@ -562,39 +562,41 @@ static void on_repo_oper (HttpServer *htp_server, const char *etype, const char *repo_id, char *user, char *ip, char *client_name) { - RepoEventData *rdata = g_new0 (RepoEventData, 1); - SeafVirtRepo *vinfo = seaf_repo_manager_get_virtual_repo_info (seaf->repo_mgr, - repo_id); + /* RepoEventData *rdata = g_new0 (RepoEventData, 1); */ + /* SeafVirtRepo *vinfo = seaf_repo_manager_get_virtual_repo_info (seaf->repo_mgr, */ + /* repo_id); */ - if (vinfo) { - memcpy (rdata->repo_id, vinfo->origin_repo_id, 36); - rdata->path = g_strdup(vinfo->path); - } else - memcpy (rdata->repo_id, repo_id, 36); - rdata->etype = g_strdup (etype); - rdata->user = g_strdup (user); - rdata->ip = g_strdup (ip); - rdata->client_name = g_strdup(client_name); + /* if (vinfo) { */ + /* memcpy (rdata->repo_id, vinfo->origin_repo_id, 36); */ + /* rdata->path = g_strdup(vinfo->path); */ + /* } else */ + /* memcpy (rdata->repo_id, repo_id, 36); */ + /* rdata->etype = g_strdup (etype); */ + /* rdata->user = g_strdup (user); */ + /* rdata->ip = g_strdup (ip); */ + /* rdata->client_name = g_strdup(client_name); */ - cevent_manager_add_event (seaf->ev_mgr, htp_server->cevent_id, rdata); + /* cevent_manager_add_event (seaf->ev_mgr, htp_server->cevent_id, rdata); */ - if (vinfo) { - g_free (vinfo->path); - g_free (vinfo); - } + /* if (vinfo) { */ + /* g_free (vinfo->path); */ + /* g_free (vinfo); */ + /* } */ + return; } void send_statistic_msg (const char *repo_id, char *user, char *operation, guint64 bytes) { - StatsEventData *rdata = g_new0 (StatsEventData, 1); + /* StatsEventData *rdata = g_new0 (StatsEventData, 1); */ - memcpy (rdata->repo_id, repo_id, 36); - rdata->etype = g_strdup (operation); - rdata->user = g_strdup (user); - rdata->bytes = bytes; + /* memcpy (rdata->repo_id, repo_id, 36); */ + /* rdata->etype = g_strdup (operation); */ + /* rdata->user = g_strdup (user); */ + /* rdata->bytes = bytes; */ - cevent_manager_add_event (seaf->ev_mgr, seaf->http_server->priv->stats_event_id, rdata); + /* cevent_manager_add_event (seaf->ev_mgr, seaf->http_server->priv->stats_event_id, rdata); */ + return; } char * diff --git a/server/quota-mgr.c b/server/quota-mgr.c index 039c374..373de29 100644 --- a/server/quota-mgr.c +++ b/server/quota-mgr.c @@ -11,6 +11,7 @@ #include "seafile-session.h" #include "seaf-db.h" #include "quota-mgr.h" +#include "seaf-utils.h" #define KB 1000L #define MB 1000000L @@ -375,7 +376,11 @@ get_num_shared_to (const char *user, const char *repo_id) } /* Then groups... */ - client = seaf->rpc_client; + client = create_ccnet_rpc_client (); + if (!client) { + seaf_warning ("Failed to alloc ccnet rpc client.\n"); + goto out; + } groups = seaf_repo_manager_get_groups_by_repo (seaf->repo_mgr, repo_id, NULL); @@ -399,6 +404,7 @@ out: g_hash_table_destroy (user_hash); string_list_free (personal); g_list_free (groups); + release_ccnet_rpc_client (client); return n_shared_to; } diff --git a/server/repo-mgr.c b/server/repo-mgr.c index e0ca88b..93ceeab 100644 --- a/server/repo-mgr.c +++ b/server/repo-mgr.c @@ -4254,13 +4254,17 @@ seaf_get_group_repos_by_user (SeafRepoManager *mgr, GString *sql = NULL; int group_id = 0; - rpc_client = create_rpc_clients (seaf->config_dir); + rpc_client = create_ccnet_rpc_client (); + if (!rpc_client) + return NULL; /* Get the groups this user belongs to. */ groups = ccnet_get_groups_by_user (rpc_client, user, 1); if (!groups) { + release_ccnet_rpc_client (rpc_client); goto out; } + release_ccnet_rpc_client (rpc_client); sql = g_string_new (""); g_string_printf (sql, "SELECT g.repo_id, v.repo_id, " @@ -4330,7 +4334,6 @@ out: for (p = groups; p != NULL; p = p->next) g_object_unref ((GObject *)p->data); g_list_free (groups); - searpc_free_client_with_pipe_transport(rpc_client); return g_list_reverse (repos); } @@ -4462,13 +4465,17 @@ seaf_repo_manager_convert_repo_path (SeafRepoManager *mgr, if (ret) goto out; - rpc_client = create_rpc_clients (seaf->config_dir); - /* Get the groups this user belongs to. */ + + rpc_client = create_ccnet_rpc_client (); + if (!rpc_client) + goto out; groups = ccnet_get_groups_by_user (rpc_client, user, 1); if (!groups) { + release_ccnet_rpc_client (rpc_client); goto out; } + release_ccnet_rpc_client (rpc_client); g_string_printf (sql, "SELECT v.repo_id, path, r.group_id FROM VirtualRepo v, %s r WHERE " "v.origin_repo=? AND v.repo_id=r.repo_id AND r.group_id IN(", @@ -4504,7 +4511,6 @@ out: for (p1 = groups; p1 != NULL; p1 = p1->next) g_object_unref ((GObject *)p1->data); g_list_free (groups); - searpc_free_client_with_pipe_transport(rpc_client); return ret; } diff --git a/server/repo-perm.c b/server/repo-perm.c index 5cb515b..acbe479 100644 --- a/server/repo-perm.c +++ b/server/repo-perm.c @@ -48,13 +48,17 @@ check_group_permission_by_user (SeafRepoManager *mgr, int group_id; GString *sql; - rpc_client = create_rpc_clients (seaf->config_dir); + rpc_client = create_ccnet_rpc_client (); + if (!rpc_client) + return NULL; /* Get the groups this user belongs to. */ groups = ccnet_get_groups_by_user (rpc_client, user_name, 1); if (!groups) { + release_ccnet_rpc_client (rpc_client); goto out; } + release_ccnet_rpc_client (rpc_client); sql = g_string_new (""); g_string_printf (sql, "SELECT permission FROM RepoGroup WHERE repo_id = ? AND group_id IN ("); @@ -80,7 +84,6 @@ out: for (p1 = groups; p1 != NULL; p1 = p1->next) g_object_unref ((GObject *)p1->data); g_list_free (groups); - searpc_free_client_with_pipe_transport(rpc_client); return permission; } @@ -141,14 +144,11 @@ check_perm_on_parent_repo (const char *origin_repo_id, GList *iter; char *perm = NULL; - rpc_client = create_rpc_clients (seaf->config_dir); - user_perms = seaf_share_manager_get_shared_dirs_to_user (seaf->share_mgr, origin_repo_id, user); if (!user_perms) { - searpc_free_client_with_pipe_transport(rpc_client); return NULL; } @@ -161,13 +161,18 @@ check_perm_on_parent_repo (const char *origin_repo_id, } g_hash_table_destroy (user_perms); - groups = ccnet_get_groups_by_user (rpc_client, user, 1); - - if (!groups) { - searpc_free_client_with_pipe_transport(rpc_client); + rpc_client = create_ccnet_rpc_client (); + if (!rpc_client) { return NULL; } + groups = ccnet_get_groups_by_user (rpc_client, user, 1); + if (!groups) { + release_ccnet_rpc_client (rpc_client); + return NULL; + } + release_ccnet_rpc_client (rpc_client); + group_perms = seaf_share_manager_get_shared_dirs_to_group (seaf->share_mgr, origin_repo_id, groups); @@ -177,7 +182,6 @@ check_perm_on_parent_repo (const char *origin_repo_id, g_list_free (groups); if (!group_perms) { - searpc_free_client_with_pipe_transport(rpc_client); return NULL; } if (g_hash_table_size (group_perms) > 0) { @@ -185,7 +189,6 @@ check_perm_on_parent_repo (const char *origin_repo_id, } g_hash_table_destroy (group_perms); - searpc_free_client_with_pipe_transport(rpc_client); return perm; } diff --git a/server/seaf-server.c b/server/seaf-server.c index a5d4773..05ea72f 100644 --- a/server/seaf-server.c +++ b/server/seaf-server.c @@ -57,27 +57,17 @@ static void usage () #include "searpc-marshal.h" #include -static void start_rpc_service (int cloud_mode, char *seafile_dir, char *central_conf_dir) +#define SEAFILE_RPC_PIPE_NAME "seafile.sock" + +static void start_rpc_service (int cloud_mode, char *seafile_dir) { - seaf_message ("Mydebug %s\n", __FUNCTION__); SearpcNamedPipeServer *rpc_server = NULL; - char *socket_dir = NULL; char *pipe_path = NULL; searpc_server_init (register_marshals); searpc_create_service ("seafserv-threaded-rpcserver"); - socket_dir = central_conf_dir ? central_conf_dir : seafile_dir; - pipe_path = g_strdup_printf ("%s/%s", socket_dir, "seafile.sock"); - seaf_message ("Mydebug pipe_path = %s\n", pipe_path); - rpc_server = searpc_create_named_pipe_server(pipe_path); - g_free(pipe_path); - if (searpc_named_pipe_server_start(rpc_server) < 0) { - seaf_warning ("Failed to start named pipe server.\n"); - exit (1); - } - /* threaded services */ /* repo manipulation */ @@ -554,32 +544,32 @@ static void start_rpc_service (int cloud_mode, char *seafile_dir, char *central_ /* -------- rpc services -------- */ /* token for web access to repo */ - searpc_server_register_function ("seafserv-rpcserver", + searpc_server_register_function ("seafserv-threaded-rpcserver", seafile_web_get_access_token, "seafile_web_get_access_token", searpc_signature_string__string_string_string_string_int()); - searpc_server_register_function ("seafserv-rpcserver", + searpc_server_register_function ("seafserv-threaded-rpcserver", seafile_web_query_access_token, "seafile_web_query_access_token", searpc_signature_object__string()); - searpc_server_register_function ("seafserv-rpcserver", + searpc_server_register_function ("seafserv-threaded-rpcserver", seafile_query_zip_progress, "seafile_query_zip_progress", searpc_signature_string__string()); - searpc_server_register_function ("seafserv-rpcserver", + searpc_server_register_function ("seafserv-threaded-rpcserver", seafile_cancel_zip_task, "cancel_zip_task", searpc_signature_int__string()); /* Copy task related. */ - searpc_server_register_function ("seafserv-rpcserver", + searpc_server_register_function ("seafserv-threaded-rpcserver", seafile_get_copy_task, "get_copy_task", searpc_signature_object__string()); - searpc_server_register_function ("seafserv-rpcserver", + searpc_server_register_function ("seafserv-threaded-rpcserver", seafile_cancel_copy_task, "cancel_copy_task", searpc_signature_int__string()); @@ -597,11 +587,11 @@ static void start_rpc_service (int cloud_mode, char *seafile_dir, char *central_ seafile_unset_passwd, "seafile_unset_passwd", searpc_signature_int__string_string()); - searpc_server_register_function ("seafserv-rpcserver", + searpc_server_register_function ("seafserv-threaded-rpcserver", seafile_is_passwd_set, "seafile_is_passwd_set", searpc_signature_int__string_string()); - searpc_server_register_function ("seafserv-rpcserver", + searpc_server_register_function ("seafserv-threaded-rpcserver", seafile_get_decrypt_key, "seafile_get_decrypt_key", searpc_signature_object__string_string()); @@ -761,6 +751,18 @@ static void start_rpc_service (int cloud_mode, char *seafile_dir, char *central_ "set_server_config_boolean", searpc_signature_int__string_string_int()); + pipe_path = g_build_path ("/", seafile_dir, SEAFILE_RPC_PIPE_NAME, NULL); + rpc_server = searpc_create_named_pipe_server(pipe_path); + g_free(pipe_path); + if (!rpc_server) { + seaf_warning ("Failed to create rpc server.\n"); + exit (1); + } + + if (searpc_named_pipe_server_start(rpc_server) < 0) { + seaf_warning ("Failed to start rpc server.\n"); + exit (1); + } } static struct event sigusr1; @@ -856,7 +858,7 @@ int main (int argc, char **argv) { int c; - char *config_dir = DEFAULT_CONFIG_DIR; + char *ccnet_dir = DEFAULT_CONFIG_DIR; char *seafile_dir = NULL; char *central_config_dir = NULL; char *logfile = NULL; @@ -866,7 +868,6 @@ main (int argc, char **argv) char *ccnet_debug_level_str = "info"; char *seafile_debug_level_str = "debug"; int cloud_mode = 0; - SearpcClient *rpc_client = NULL; #ifdef WIN32 argv = get_argv_utf8 (&argc); @@ -883,7 +884,7 @@ main (int argc, char **argv) exit (1); break; case 'c': - config_dir = optarg; + ccnet_dir = optarg; break; case 'd': seafile_dir = g_strdup(optarg); @@ -962,7 +963,7 @@ main (int argc, char **argv) seafile_debug_set_flags_string (debug_str); if (seafile_dir == NULL) - seafile_dir = g_build_filename (config_dir, "seafile", NULL); + seafile_dir = g_build_filename (ccnet_dir, "seafile", NULL); if (logfile == NULL) logfile = g_build_filename (seafile_dir, "seafile.log", NULL); @@ -973,16 +974,16 @@ main (int argc, char **argv) } event_init (); - start_rpc_service (cloud_mode, seafile_dir, central_config_dir); - seaf = seafile_session_new (central_config_dir, seafile_dir, config_dir); + start_rpc_service (cloud_mode, seafile_dir); + + seaf = seafile_session_new (central_config_dir, seafile_dir, ccnet_dir); if (!seaf) { seaf_warning ("Failed to create seafile session.\n"); exit (1); } seaf->is_master = is_master; seaf->cloud_mode = cloud_mode; - seaf->rpc_client = rpc_client; #ifndef WIN32 diff --git a/server/seafile-session.c b/server/seafile-session.c index df42114..44564ed 100644 --- a/server/seafile-session.c +++ b/server/seafile-session.c @@ -37,17 +37,17 @@ load_thread_pool_config (SeafileSession *session); SeafileSession * seafile_session_new(const char *central_config_dir, const char *seafile_dir, - const char *config_dir) + const char *ccnet_dir) { char *abs_central_config_dir = NULL; char *abs_seafile_dir; - char *abs_config_dir = NULL; + char *abs_ccnet_dir = NULL; char *tmp_file_dir; char *config_file_path; GKeyFile *config; SeafileSession *session = NULL; - abs_config_dir = ccnet_expand_path (config_dir); + abs_ccnet_dir = ccnet_expand_path (ccnet_dir); abs_seafile_dir = ccnet_expand_path (seafile_dir); tmp_file_dir = g_build_filename (abs_seafile_dir, "tmpfiles", NULL); if (central_config_dir) { @@ -81,7 +81,7 @@ seafile_session_new(const char *central_config_dir, session = g_new0(SeafileSession, 1); session->seaf_dir = abs_seafile_dir; - session->config_dir = abs_config_dir; + session->ccnet_dir = abs_ccnet_dir; session->tmp_file_dir = tmp_file_dir; session->config = config; diff --git a/server/seafile-session.h b/server/seafile-session.h index ceee10d..32b8a12 100644 --- a/server/seafile-session.h +++ b/server/seafile-session.h @@ -35,11 +35,9 @@ typedef struct _SeafileSession SeafileSession; struct _SeafileSession { - SearpcClient *rpc_client; - char *central_config_dir; char *seaf_dir; - char *config_dir; + char *ccnet_dir; char *tmp_file_dir; /* Config that's only loaded on start */ GKeyFile *config; @@ -82,7 +80,7 @@ extern SeafileSession *seaf; SeafileSession * seafile_session_new(const char *central_config_dir, const char *seafile_dir, - const char *config_dir); + const char *ccnet_dir); int seafile_session_init (SeafileSession *session); diff --git a/tests/test_file_operation/test_file_operation.py b/tests/test_file_operation/test_file_operation.py index 273edaf..2d0c153 100644 --- a/tests/test_file_operation/test_file_operation.py +++ b/tests/test_file_operation/test_file_operation.py @@ -19,7 +19,6 @@ def create_the_file (): def test_file_operation(): t_repo_version = 1 - print ("Mydebug create repo") t_repo_id1 = api.create_repo('test_file_operation1', '', USER, passwd = None) create_the_file() diff --git a/tests/test_share_and_perm/test_shared_repo_perm.py b/tests/test_share_and_perm/test_shared_repo_perm.py index e35a39e..2bc3e2c 100644 --- a/tests/test_share_and_perm/test_shared_repo_perm.py +++ b/tests/test_share_and_perm/test_shared_repo_perm.py @@ -1,4 +1,3 @@ -from builtins import str import pytest import time from seaserv import seafile_api as api