diff options
Diffstat (limited to 'xlators/storage/bdb/src/bctx.c')
-rw-r--r-- | xlators/storage/bdb/src/bctx.c | 531 |
1 files changed, 268 insertions, 263 deletions
diff --git a/xlators/storage/bdb/src/bctx.c b/xlators/storage/bdb/src/bctx.c index ce7e49f2c..7fc47cd7b 100644 --- a/xlators/storage/bdb/src/bctx.c +++ b/xlators/storage/bdb/src/bctx.c @@ -24,75 +24,74 @@ static void __destroy_bctx (bctx_t *bctx) { - if (bctx->directory) - FREE (bctx->directory); - - if (bctx->db_path) - FREE (bctx->db_path); - - FREE (bctx); + if (bctx->directory) + FREE (bctx->directory); + + if (bctx->db_path) + FREE (bctx->db_path); + + FREE (bctx); } static void __unhash_bctx (bctx_t *bctx) { - list_del_init (&bctx->b_hash); + list_del_init (&bctx->b_hash); } static int32_t bctx_table_prune (bctx_table_t *table) { - int32_t ret = 0; - struct list_head purge = {0,}; - struct list_head *next = NULL; - bctx_t *entry = NULL; - bctx_t *del = NULL, *tmp = NULL; - - if (!table) - return 0; - - INIT_LIST_HEAD (&purge); - - LOCK (&table->lock); - { - if ((table->lru_limit) && - (table->lru_size > table->lru_limit)) { - while (table->lru_size > table->lru_limit) { - next = table->b_lru.next; - entry = list_entry (next, bctx_t, list); - - list_move_tail (next, &table->purge); - __unhash_bctx (entry); - - table->lru_size--; - ret++; - } - } - list_move_tail (&purge, &table->purge); - list_del_init (&table->purge); - } - UNLOCK (&table->lock); - - { - list_for_each_entry_safe (del, tmp, &purge, list) { - list_del_init (&del->list); - if (del->dbp) { - ret = del->dbp->close (del->dbp, 0); - if (ret != 0) { - gf_log (table->this->name, GF_LOG_ERROR, - "failed to close db on path (%s): %s", - del->directory, db_strerror (ret)); - } else { - gf_log (table->this->name, GF_LOG_WARNING, - "close db for path %s; table->lru_count = %d", - del->directory, table->lru_size); - } - } - __destroy_bctx (del); - } - } - - return ret; + int32_t ret = 0; + struct list_head purge = {0,}; + struct list_head *next = NULL; + bctx_t *entry = NULL; + bctx_t *del = NULL, *tmp = NULL; + + if (!table) + return 0; + + INIT_LIST_HEAD (&purge); + + LOCK (&table->lock); + { + if ((table->lru_limit) && + (table->lru_size > table->lru_limit)) { + while (table->lru_size > table->lru_limit) { + next = table->b_lru.next; + entry = list_entry (next, bctx_t, list); + + list_move_tail (next, &table->purge); + __unhash_bctx (entry); + + table->lru_size--; + ret++; + } + } + list_move_tail (&purge, &table->purge); + list_del_init (&table->purge); + } + UNLOCK (&table->lock); + + list_for_each_entry_safe (del, tmp, &purge, list) { + list_del_init (&del->list); + if (del->dbp) { + ret = del->dbp->close (del->dbp, 0); + if (ret != 0) { + gf_log (table->this->name, GF_LOG_ERROR, + "failed to close db on path (%s): %s", + del->directory, db_strerror (ret)); + } else { + gf_log (table->this->name, GF_LOG_WARNING, + "close db for path %s; " + "table->lru_count = %d", + del->directory, table->lru_size); + } + } + __destroy_bctx (del); + } + + return ret; } @@ -100,115 +99,116 @@ bctx_table_prune (bctx_table_t *table) static inline uint32_t bdb_key_hash (char *key, uint32_t hash_size) { - uint32_t hash = 0; - - hash = *key; - - if (hash) { - for (key += 1; *key != '\0'; key++) { - hash = (hash << 5) - hash + *key; - } - } - - return (hash + *key) % hash_size; + uint32_t hash = 0; + + hash = *key; + + if (hash) { + for (key += 1; *key != '\0'; key++) { + hash = (hash << 5) - hash + *key; + } + } + + return (hash + *key) % hash_size; } static void __hash_bctx (bctx_t *bctx) { - bctx_table_t *table = NULL; - char *key = NULL; + bctx_table_t *table = NULL; + char *key = NULL; - table = bctx->table; + table = bctx->table; - MAKE_KEY_FROM_PATH (key, bctx->directory); - bctx->key_hash = bdb_key_hash (key, table->hash_size); + MAKE_KEY_FROM_PATH (key, bctx->directory); + bctx->key_hash = bdb_key_hash (key, table->hash_size); - list_del_init (&bctx->b_hash); - list_add (&bctx->b_hash, &table->b_hash[bctx->key_hash]); + list_del_init (&bctx->b_hash); + list_add (&bctx->b_hash, &table->b_hash[bctx->key_hash]); } static inline bctx_t * __bctx_passivate (bctx_t *bctx) { - if (bctx->dbp) { - list_move_tail (&bctx->list, &(bctx->table->b_lru)); - bctx->table->lru_size++; - } else { - list_move_tail (&bctx->list, &bctx->table->purge); - __unhash_bctx (bctx); - } - return bctx; + if (bctx->dbp) { + list_move_tail (&bctx->list, &(bctx->table->b_lru)); + bctx->table->lru_size++; + } else { + list_move_tail (&bctx->list, &bctx->table->purge); + __unhash_bctx (bctx); + } + return bctx; } static inline bctx_t * __bctx_activate (bctx_t *bctx) { - list_move (&bctx->list, &bctx->table->active); - bctx->table->lru_size--; - - return bctx; + list_move (&bctx->list, &bctx->table->active); + bctx->table->lru_size--; + + return bctx; } static bctx_t * __bdb_ctx_unref (bctx_t *bctx) { - assert (bctx->ref); - - --bctx->ref; - - if (!bctx->ref) - bctx = __bctx_passivate (bctx); - - return bctx; + assert (bctx->ref); + + --bctx->ref; + + if (!bctx->ref) + bctx = __bctx_passivate (bctx); + + return bctx; } bctx_t * bctx_unref (bctx_t *bctx) { - bctx_table_t *table = NULL; - - if (!bctx && !bctx->table) - return NULL; - - table = bctx->table; - - LOCK (&table->lock); - { - bctx = __bdb_ctx_unref (bctx); - } - UNLOCK (&table->lock); - - bctx_table_prune (table); - - return bctx; + bctx_table_t *table = NULL; + + if (!bctx && !bctx->table) + return NULL; + + table = bctx->table; + + LOCK (&table->lock); + { + bctx = __bdb_ctx_unref (bctx); + } + UNLOCK (&table->lock); + + bctx_table_prune (table); + + return bctx; } /* - * NOTE: __bdb_ctx_ref() is called only after holding table->lock and bctx->lock, in that order + * NOTE: __bdb_ctx_ref() is called only after holding table->lock and + * bctx->lock, in that order */ static inline bctx_t * __bctx_ref (bctx_t *bctx) { - if (!bctx->ref) - __bctx_activate (bctx); + if (!bctx->ref) + __bctx_activate (bctx); - bctx->ref++; + bctx->ref++; - return bctx; + return bctx; } bctx_t * bctx_ref (bctx_t *bctx) { - LOCK (&(bctx->table->lock)); - { - __bctx_ref (bctx); - } - UNLOCK (&(bctx->table->lock)); + LOCK (&(bctx->table->lock)); + { + __bctx_ref (bctx); + } + UNLOCK (&(bctx->table->lock)); - return bctx; + return bctx; } @@ -216,179 +216,184 @@ bctx_ref (bctx_t *bctx) static inline bctx_t * __create_bctx (bctx_table_t *table, - const char *path) + const char *path) { - bctx_t *bctx = NULL; - char *db_path = NULL; + bctx_t *bctx = NULL; + char *db_path = NULL; - bctx = CALLOC (1, sizeof (*bctx)); - GF_VALIDATE_OR_GOTO ("bctx", bctx, out); + bctx = CALLOC (1, sizeof (*bctx)); + GF_VALIDATE_OR_GOTO ("bctx", bctx, out); - bctx->table = table; - bctx->directory = strdup (path); - GF_VALIDATE_OR_GOTO ("bctx", bctx->directory, out); + bctx->table = table; + bctx->directory = strdup (path); + GF_VALIDATE_OR_GOTO ("bctx", bctx->directory, out); - MAKE_REAL_PATH_TO_STORAGE_DB (db_path, BDB_THIS (table), path); + MAKE_REAL_PATH_TO_STORAGE_DB (db_path, BDB_THIS (table), path); - bctx->db_path = strdup (db_path); - GF_VALIDATE_OR_GOTO ("bctx", bctx->directory, out); + bctx->db_path = strdup (db_path); + GF_VALIDATE_OR_GOTO ("bctx", bctx->directory, out); - INIT_LIST_HEAD (&bctx->c_list); - INIT_LIST_HEAD (&bctx->list); - INIT_LIST_HEAD (&bctx->b_hash); + INIT_LIST_HEAD (&bctx->c_list); + INIT_LIST_HEAD (&bctx->list); + INIT_LIST_HEAD (&bctx->b_hash); - LOCK_INIT (&bctx->lock); + LOCK_INIT (&bctx->lock); - __hash_bctx (bctx); + __hash_bctx (bctx); - list_add (&bctx->list, &table->b_lru); - table->lru_size++; + list_add (&bctx->list, &table->b_lru); + table->lru_size++; out: - return bctx; + return bctx; } -/* bctx_lookup - lookup bctx_t for the directory @directory. (see description of bctx_t in bdb.h) +/* bctx_lookup - lookup bctx_t for the directory @directory. + * (see description of bctx_t in bdb.h) * * @table: bctx_table_t for this instance of bdb. - * @directory: directory for which bctx_t is being looked up. + * @directory: directory for which bctx_t is being looked up. */ bctx_t * -bctx_lookup (bctx_table_t *table, - const char *directory) +bctx_lookup (bctx_table_t *table, + const char *directory) { - char *key = NULL; - uint32_t key_hash = 0; - bctx_t *trav = NULL, *bctx = NULL, *tmp = NULL; - int32_t need_break = 0; - - GF_VALIDATE_OR_GOTO ("bctx", table, out); - GF_VALIDATE_OR_GOTO ("bctx", directory, out); - - MAKE_KEY_FROM_PATH (key, directory); - key_hash = bdb_key_hash (key, table->hash_size); - - LOCK (&table->lock); - { - if (!list_empty (&table->b_hash[key_hash])) { - list_for_each_entry_safe (trav, tmp, &table->b_hash[key_hash], b_hash) { - LOCK(&trav->lock); - if (!strcmp(trav->directory, directory)) { - bctx = __bctx_ref (trav); - need_break = 1; - } - UNLOCK(&trav->lock); - if (need_break) - break; - } - } - - if (!bctx) { - bctx = __create_bctx (table, directory); - bctx = __bctx_ref (bctx); - } - } - UNLOCK (&table->lock); + char *key = NULL; + uint32_t key_hash = 0; + bctx_t *trav = NULL, *bctx = NULL, *tmp = NULL; + int32_t need_break = 0; + + GF_VALIDATE_OR_GOTO ("bctx", table, out); + GF_VALIDATE_OR_GOTO ("bctx", directory, out); + + MAKE_KEY_FROM_PATH (key, directory); + key_hash = bdb_key_hash (key, table->hash_size); + + LOCK (&table->lock); + { + if (list_empty (&table->b_hash[key_hash])) { + goto creat_bctx; + } + + list_for_each_entry_safe (trav, tmp, &table->b_hash[key_hash], + b_hash) { + LOCK(&trav->lock); + { + if (!strcmp(trav->directory, directory)) { + bctx = __bctx_ref (trav); + need_break = 1; + } + } + UNLOCK(&trav->lock); + + if (need_break) + break; + } + + creat_bctx: + if (!bctx) { + bctx = __create_bctx (table, directory); + bctx = __bctx_ref (bctx); + } + } + UNLOCK (&table->lock); out: - return bctx; + return bctx; } bctx_t * bctx_parent (bctx_table_t *table, - const char *path) + const char *path) { - char *pathname = NULL, *directory = NULL; - bctx_t *bctx = NULL; - - GF_VALIDATE_OR_GOTO ("bctx", table, out); - GF_VALIDATE_OR_GOTO ("bctx", path, out); - - pathname = strdup (path); - GF_VALIDATE_OR_GOTO ("bctx", pathname, out); - directory = dirname (pathname); - - bctx = bctx_lookup (table, directory); - GF_VALIDATE_OR_GOTO ("bctx", bctx, out); - + char *pathname = NULL, *directory = NULL; + bctx_t *bctx = NULL; + + GF_VALIDATE_OR_GOTO ("bctx", table, out); + GF_VALIDATE_OR_GOTO ("bctx", path, out); + + pathname = strdup (path); + GF_VALIDATE_OR_GOTO ("bctx", pathname, out); + directory = dirname (pathname); + + bctx = bctx_lookup (table, directory); + GF_VALIDATE_OR_GOTO ("bctx", bctx, out); + out: - if (pathname) - free (pathname); - return bctx; + if (pathname) + free (pathname); + return bctx; } inline int32_t -bdb_db_rename (bctx_table_t *table, - const char *oldpath, - const char *newpath) +bdb_db_rename (bctx_table_t *table, + const char *oldpath, + const char *newpath) { - DB_ENV *dbenv = NULL; - int32_t ret = -1; - - GF_VALIDATE_OR_GOTO ("bctx", table, out); - GF_VALIDATE_OR_GOTO ("bctx", oldpath, out); - GF_VALIDATE_OR_GOTO ("bctx", newpath, out); - - dbenv = table->dbenv; - GF_VALIDATE_OR_GOTO ("bctx", dbenv, out); - - LOCK (&table->lock); - { - ret = dbenv->dbrename (dbenv, NULL, oldpath, NULL, newpath, 0); - - if (ret != 0) { - gf_log ("bctx", - GF_LOG_ERROR, - "failed to rename %s to %s: %s", - oldpath, newpath, db_strerror (ret)); - } else { - gf_log ("bctx", - GF_LOG_DEBUG, - "successfully renamed %s to %s: %s", - oldpath, newpath, db_strerror (ret)); - } - } - UNLOCK (&table->lock); + DB_ENV *dbenv = NULL; + int32_t ret = -1; + + GF_VALIDATE_OR_GOTO ("bctx", table, out); + GF_VALIDATE_OR_GOTO ("bctx", oldpath, out); + GF_VALIDATE_OR_GOTO ("bctx", newpath, out); + + dbenv = table->dbenv; + GF_VALIDATE_OR_GOTO ("bctx", dbenv, out); + + LOCK (&table->lock); + { + ret = dbenv->dbrename (dbenv, NULL, oldpath, NULL, newpath, 0); + + if (ret != 0) { + gf_log ("bctx", GF_LOG_ERROR, + "failed to rename %s to %s: %s", + oldpath, newpath, db_strerror (ret)); + } else { + gf_log ("bctx", GF_LOG_DEBUG, + "successfully renamed %s to %s: %s", + oldpath, newpath, db_strerror (ret)); + } + } + UNLOCK (&table->lock); out: - return ret; + return ret; } bctx_t * -bctx_rename (bctx_t *bctx, - const char *db_newpath) +bctx_rename (bctx_t *bctx, + const char *db_newpath) { - bctx_table_t *table = NULL; - int32_t ret = -1; - - table = bctx->table; - - LOCK (&table->lock); - { - __unhash_bctx (bctx); - list_del_init (&bctx->list); - if (bctx->dbp) { - ret = bctx->dbp->close (bctx->dbp, 0); - if (ret != 0) { - gf_log ("bdb-ll", - GF_LOG_ERROR, - "failed to close db for directory %s (%s)", - bctx->directory, db_strerror (ret)); - } - bctx->dbp = NULL; - } - } - UNLOCK (&table->lock); - - ret = bdb_db_rename (table, bctx->db_path, db_newpath); - - if (ret != 0) { - gf_log ("bctx", - GF_LOG_ERROR, - "bdb_db_rename failed for directory %s", - bctx->directory); - bctx = NULL; - } - - return bctx; + bctx_table_t *table = NULL; + int32_t ret = -1; + + table = bctx->table; + + LOCK (&table->lock); + { + __unhash_bctx (bctx); + list_del_init (&bctx->list); + if (bctx->dbp) { + ret = bctx->dbp->close (bctx->dbp, 0); + if (ret != 0) { + gf_log ("bdb-ll", GF_LOG_ERROR, + "failed to close db for " + "directory %s (%s)", + bctx->directory, db_strerror (ret)); + } + bctx->dbp = NULL; + } + } + UNLOCK (&table->lock); + + ret = bdb_db_rename (table, bctx->db_path, db_newpath); + + if (ret != 0) { + gf_log ("bctx", GF_LOG_ERROR, + "bdb_db_rename failed for directory %s", + bctx->directory); + bctx = NULL; + } + + return bctx; } |