From adcf40afc33228f8c187adbca83dd0ff41a8e33d Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Wed, 8 Apr 2015 15:30:07 +0200 Subject: [PATCH] Discovery: Speed up initial run. #2796 --- csync/src/csync.c | 10 ++-------- csync/src/csync.h | 5 ----- csync/src/csync_private.h | 12 +++++++++++- csync/src/csync_statedb.c | 8 ++++---- csync/src/csync_update.c | 2 +- src/libsync/syncengine.cpp | 8 ++++++-- 6 files changed, 24 insertions(+), 21 deletions(-) diff --git a/csync/src/csync.c b/csync/src/csync.c index 2390eaae8..65a0655af 100644 --- a/csync/src/csync.c +++ b/csync/src/csync.c @@ -576,7 +576,8 @@ int csync_commit(CSYNC *ctx) { _csync_clean_ctx(ctx); ctx->remote.read_from_db = 0; - ctx->read_from_db_disabled = 0; + ctx->read_remote_from_db = true; + ctx->db_is_empty = false; /* Create new trees */ @@ -773,10 +774,3 @@ int csync_set_module_property(CSYNC* ctx, const char* key, void* value) #endif } - -int csync_set_read_from_db(CSYNC* ctx, int enabled) -{ - ctx->read_from_db_disabled = !enabled; - return 0; -} - diff --git a/csync/src/csync.h b/csync/src/csync.h index 85a4bfb96..f227c7875 100644 --- a/csync/src/csync.h +++ b/csync/src/csync.h @@ -550,11 +550,6 @@ void csync_resume(CSYNC *ctx); */ int csync_abort_requested(CSYNC *ctx); -/** - * Specify if it is allowed to read the remote tree from the DB (default to enabled) - */ -int csync_set_read_from_db(CSYNC* ctx, int enabled); - char *csync_normalize_etag(const char *); time_t oc_httpdate_parse( const char *date ); diff --git a/csync/src/csync_private.h b/csync/src/csync_private.h index 7a4e2a5eb..8552bf38c 100644 --- a/csync/src/csync_private.h +++ b/csync/src/csync_private.h @@ -151,7 +151,17 @@ struct csync_s { int status; volatile int abort; void *rename_info; - int read_from_db_disabled; + + /** + * Specify if it is allowed to read the remote tree from the DB (default to enabled) + */ + bool read_remote_from_db; + + /** + * If true, the DB is considered empty and all reads are skipped. (default is false) + * This is useful during the initial local discovery as it speeds it up significantly. + */ + bool db_is_empty; struct csync_owncloud_ctx_s *owncloud_context; diff --git a/csync/src/csync_statedb.c b/csync/src/csync_statedb.c index 1f82e8c3e..1ba406f34 100644 --- a/csync/src/csync_statedb.c +++ b/csync/src/csync_statedb.c @@ -298,7 +298,7 @@ csync_file_stat_t *csync_statedb_get_stat_by_hash(CSYNC *ctx, csync_file_stat_t *st = NULL; int rc; - if( !ctx ) { + if( !ctx || ctx->db_is_empty ) { return NULL; } @@ -341,7 +341,7 @@ csync_file_stat_t *csync_statedb_get_stat_by_file_id(CSYNC *ctx, return 0; } - if( !ctx ) { + if( !ctx || ctx->db_is_empty ) { return NULL; } @@ -381,7 +381,7 @@ csync_file_stat_t *csync_statedb_get_stat_by_inode(CSYNC *ctx, return NULL; } - if( !ctx ) { + if( !ctx || ctx->db_is_empty ) { return NULL; } @@ -448,7 +448,7 @@ int csync_statedb_get_below_path( CSYNC *ctx, const char *path ) { return -1; } - if( !ctx ) { + if( !ctx || ctx->db_is_empty ) { return -1; } diff --git a/csync/src/csync_update.c b/csync/src/csync_update.c index fdb6df911..1c89a87ec 100644 --- a/csync/src/csync_update.c +++ b/csync/src/csync_update.c @@ -306,7 +306,7 @@ static int _csync_detect_update(CSYNC *ctx, const char *file, || !c_streq(fs->remotePerm, tmp->remotePerm))) || (ctx->current == LOCAL_REPLICA && fs->inode != tmp->inode); if (type == CSYNC_FTW_TYPE_DIR && ctx->current == REMOTE_REPLICA - && !metadata_differ && !ctx->read_from_db_disabled) { + && !metadata_differ && ctx->read_remote_from_db) { /* If both etag and file id are equal for a directory, read all contents from * the database. * The metadata comparison ensure that we fetch all the file id or permission when diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp index b9ef9c45c..d8fa74a89 100644 --- a/src/libsync/syncengine.cpp +++ b/src/libsync/syncengine.cpp @@ -608,11 +608,15 @@ void SyncEngine::startSync() if (fileRecordCount >= 1 && isUpdateFrom_1_5) { qDebug() << "detected update from 1.5" << fileRecordCount << isUpdateFrom_1_5; // Disable the read from DB to be sure to re-read all the fileid and etags. - csync_set_read_from_db(_csync_ctx, false); + _csync_ctx->read_remote_from_db = false; } else { - csync_set_read_from_db(_csync_ctx, true); + _csync_ctx->read_remote_from_db = true; } + // This tells csync to never read from the DB if it is empty + // thereby speeding up the initial discovery significantly. + _csync_ctx->db_is_empty = (fileRecordCount == 0); + bool usingSelectiveSync = (!_selectiveSyncBlackList.isEmpty()); qDebug() << (usingSelectiveSync ? "====Using Selective Sync" : "====NOT Using Selective Sync"); if (fileRecordCount >= 0 && fileRecordCount < 50 && !usingSelectiveSync) { -- 2.30.2