diff options
author | Alex Gorrod <alexg@wiredtiger.com> | 2013-05-28 15:00:53 +1000 |
---|---|---|
committer | Alex Gorrod <alexg@wiredtiger.com> | 2013-05-28 15:00:53 +1000 |
commit | 5dd08956f367d46dcec672344366164e2a761d4a (patch) | |
tree | f317368227b82d502098391d3d133a6b118aefce | |
parent | f5419223022aee228d03fd48b66bec6ba78a3896 (diff) | |
download | mongo-5dd08956f367d46dcec672344366164e2a761d4a.tar.gz |
Update __wt_schema_worker so that it can operate on names.
It can now traverse either names, or files.
-rw-r--r-- | src/cursor/cur_backup.c | 3 | ||||
-rw-r--r-- | src/include/extern.h | 8 | ||||
-rw-r--r-- | src/lsm/lsm_tree.c | 9 | ||||
-rw-r--r-- | src/lsm/lsm_worker.c | 2 | ||||
-rw-r--r-- | src/schema/schema_worker.c | 61 | ||||
-rw-r--r-- | src/session/session_api.c | 14 | ||||
-rw-r--r-- | src/txn/txn_ckpt.c | 2 |
7 files changed, 51 insertions, 48 deletions
diff --git a/src/cursor/cur_backup.c b/src/cursor/cur_backup.c index c45b869cfeb..53b1729aa0f 100644 --- a/src/cursor/cur_backup.c +++ b/src/cursor/cur_backup.c @@ -361,7 +361,8 @@ __backup_uri(WT_SESSION_IMPL *session, "%s: invalid backup target: URIs may need quoting", uri); - WT_ERR(__wt_schema_worker(session, uri, NULL, cfg, 0)); + WT_ERR(__wt_schema_worker( + session, uri, NULL, __wt_backup_list_append, cfg, 0)); } WT_ERR_NOTFOUND_OK(ret); diff --git a/src/include/extern.h b/src/include/extern.h index de5b4469783..6a1ef920c7b 100644 --- a/src/include/extern.h +++ b/src/include/extern.h @@ -727,8 +727,10 @@ extern int __wt_lsm_tree_truncate( WT_SESSION_IMPL *session, const char *cfg[]); extern int __wt_lsm_tree_worker(WT_SESSION_IMPL *session, const char *uri, - int (*func)(WT_SESSION_IMPL *, + int (*file_func)(WT_SESSION_IMPL *, const char *[]), + int (*name_func)(WT_SESSION_IMPL *, + const char *), const char *cfg[], uint32_t open_flags); extern void *__wt_lsm_merge_worker(void *vargs); @@ -1048,8 +1050,10 @@ extern int __wt_schema_get_source( WT_SESSION_IMPL *session, extern int __wt_schema_name_check(WT_SESSION_IMPL *session, const char *uri); extern int __wt_schema_worker(WT_SESSION_IMPL *session, const char *uri, - int (*func)(WT_SESSION_IMPL *, + int (*file_func)(WT_SESSION_IMPL *, const char *[]), + int (*name_func)(WT_SESSION_IMPL *, + const char *), const char *cfg[], uint32_t open_flags); extern int __wt_open_cursor(WT_SESSION_IMPL *session, diff --git a/src/lsm/lsm_tree.c b/src/lsm/lsm_tree.c index 1131c2f09f8..9a92cceae3e 100644 --- a/src/lsm/lsm_tree.c +++ b/src/lsm/lsm_tree.c @@ -820,7 +820,8 @@ err: if (locked) int __wt_lsm_tree_worker(WT_SESSION_IMPL *session, const char *uri, - int (*func)(WT_SESSION_IMPL *, const char *[]), + int (*file_func)(WT_SESSION_IMPL *, const char *[]), + int (*name_func)(WT_SESSION_IMPL *, const char *), const char *cfg[], uint32_t open_flags) { WT_DECL_RET; @@ -832,11 +833,11 @@ __wt_lsm_tree_worker(WT_SESSION_IMPL *session, FLD_ISSET(open_flags, WT_DHANDLE_EXCLUSIVE) ? 1 : 0, &lsm_tree)); for (i = 0; i < lsm_tree->nchunks; i++) { chunk = lsm_tree->chunk[i]; - if (func == __wt_checkpoint && + if (file_func == __wt_checkpoint && F_ISSET(chunk, WT_LSM_CHUNK_ONDISK)) continue; - WT_ERR(__wt_schema_worker( - session, chunk->uri, func, cfg, open_flags)); + WT_ERR(__wt_schema_worker(session, chunk->uri, + file_func, name_func, cfg, open_flags)); } err: __wt_lsm_tree_release(session, lsm_tree); return (ret); diff --git a/src/lsm/lsm_worker.c b/src/lsm/lsm_worker.c index 3d791003ee6..e29607f9901 100644 --- a/src/lsm/lsm_worker.c +++ b/src/lsm/lsm_worker.c @@ -279,7 +279,7 @@ __wt_lsm_checkpoint_worker(void *arg) F_SET(lsm_tree, WT_LSM_TREE_LOCKED); WT_WITH_SCHEMA_LOCK(session, ret = __wt_schema_worker(session, chunk->uri, - __wt_checkpoint, NULL, 0)); + __wt_checkpoint, NULL, NULL, 0)); F_CLR(lsm_tree, WT_LSM_TREE_LOCKED); if (ret != 0) { diff --git a/src/schema/schema_worker.c b/src/schema/schema_worker.c index beef496a392..485c751acd7 100644 --- a/src/schema/schema_worker.c +++ b/src/schema/schema_worker.c @@ -15,7 +15,8 @@ int __wt_schema_worker(WT_SESSION_IMPL *session, const char *uri, - int (*func)(WT_SESSION_IMPL *, const char *[]), + int (*file_func)(WT_SESSION_IMPL *, const char *[]), + int (*name_func)(WT_SESSION_IMPL *, const char *), const char *cfg[], uint32_t open_flags) { WT_COLGROUP *colgroup; @@ -30,69 +31,65 @@ __wt_schema_worker(WT_SESSION_IMPL *session, table = NULL; tablename = uri; + if (name_func != NULL) + WT_ERR(name_func(session, uri)); + /* Get the btree handle(s) and call the underlying function. */ if (WT_PREFIX_MATCH(uri, "file:")) { - if (func == NULL) - WT_ERR(__wt_backup_list_append(session, uri)); - else { + if (file_func != NULL) { WT_ERR(__wt_session_get_btree_ckpt( session, uri, cfg, open_flags)); - ret = func(session, cfg); + ret = file_func(session, cfg); WT_TRET(__wt_session_release_btree(session)); } } else if (WT_PREFIX_MATCH(uri, "colgroup:")) { WT_ERR(__wt_schema_get_colgroup(session, uri, NULL, &colgroup)); - if (func == NULL) - WT_ERR( - __wt_backup_list_append(session, colgroup->name)); - WT_ERR(__wt_schema_worker(session, - colgroup->source, func, cfg, open_flags)); + WT_ERR(__wt_schema_worker(session, colgroup->source, + file_func, name_func, cfg, open_flags)); } else if (WT_PREFIX_SKIP(tablename, "index:")) { idx = NULL; WT_ERR(__wt_schema_get_index(session, uri, NULL, &idx)); - if (func == NULL) - WT_ERR(__wt_backup_list_append(session, idx->name)); - WT_ERR(__wt_schema_worker( - session, idx->source, func, cfg, open_flags)); + WT_ERR(__wt_schema_worker(session, idx->source, + file_func, name_func, cfg, open_flags)); } else if (WT_PREFIX_MATCH(uri, "lsm:")) { - if (func == NULL) - WT_ERR(__wt_backup_list_append(session, uri)); WT_ERR(__wt_lsm_tree_worker( - session, uri, func, cfg, open_flags)); + session, uri, file_func, name_func, cfg, open_flags)); } else if (WT_PREFIX_SKIP(tablename, "table:")) { WT_ERR(__wt_schema_get_table(session, tablename, strlen(tablename), 0, &table)); - if (func == NULL) - WT_ERR(__wt_backup_list_append(session, uri)); WT_ASSERT(session, session->dhandle == NULL); + /* + * We could make a recursive call for each colgroup or index + * URI, but since we have already opened the table, we can take + * a short cut and skip straight to the sources. If we have a + * name function, it needs to know about the intermediate URIs. + */ for (i = 0; i < WT_COLGROUPS(table); i++) { colgroup = table->cgroups[i]; - if (func == NULL) - WT_ERR(__wt_backup_list_append( - session, colgroup->name)); - WT_ERR(__wt_schema_worker( - session, colgroup->source, func, cfg, open_flags)); + if (name_func != NULL) + WT_ERR(name_func(session, colgroup->name)); + WT_ERR(__wt_schema_worker(session, colgroup->source, + file_func, name_func, cfg, open_flags)); } WT_ERR(__wt_schema_open_indices(session, table)); for (i = 0; i < table->nindices; i++) { idx = table->indices[i]; - if (func == NULL) - WT_ERR(__wt_backup_list_append( - session, idx->name)); - WT_ERR(__wt_schema_worker( - session, idx->source, func, cfg, open_flags)); + if (name_func != NULL) + WT_ERR(name_func(session, idx->name)); + WT_ERR(__wt_schema_worker(session, idx->source, + file_func, name_func, cfg, open_flags)); } } else if ((ret = __wt_schema_get_source(session, uri, &dsrc)) == 0) { wt_session = (WT_SESSION *)session; - if (func == __wt_compact && dsrc->compact != NULL) + if (file_func == __wt_compact && dsrc->compact != NULL) WT_ERR(dsrc->compact( dsrc, wt_session, uri, (WT_CONFIG_ARG *)cfg)); - else if (func == __wt_salvage && dsrc->salvage != NULL) + else if (file_func == __wt_salvage && dsrc->salvage != NULL) WT_ERR(dsrc->salvage( dsrc, wt_session, uri, (WT_CONFIG_ARG *)cfg)); - else if (func == __wt_verify && dsrc->verify != NULL) + else if (file_func == __wt_verify && dsrc->verify != NULL) WT_ERR(dsrc->verify( dsrc, wt_session, uri, (WT_CONFIG_ARG *)cfg)); else diff --git a/src/session/session_api.c b/src/session/session_api.c index 2d037051955..68d04a8f640 100644 --- a/src/session/session_api.c +++ b/src/session/session_api.c @@ -350,7 +350,7 @@ __session_compact_worker( SESSION_API_CALL(session, compact, config, cfg); WT_WITH_SCHEMA_LOCK(session, - ret = __wt_schema_worker(session, uri, __wt_compact, cfg, 0)); + ret = __wt_schema_worker(session, uri, __wt_compact, NULL, cfg, 0)); err: API_END_NOTFOUND_MAP(session, ret); } @@ -466,8 +466,8 @@ __session_salvage(WT_SESSION *wt_session, const char *uri, const char *config) SESSION_API_CALL(session, salvage, config, cfg); WT_WITH_SCHEMA_LOCK(session, - ret = __wt_schema_worker(session, uri, - __wt_salvage, cfg, WT_DHANDLE_EXCLUSIVE | WT_BTREE_SALVAGE)); + ret = __wt_schema_worker(session, uri, __wt_salvage, + NULL, cfg, WT_DHANDLE_EXCLUSIVE | WT_BTREE_SALVAGE)); err: API_END_NOTFOUND_MAP(session, ret); } @@ -588,8 +588,8 @@ __session_upgrade(WT_SESSION *wt_session, const char *uri, const char *config) SESSION_API_CALL(session, upgrade, config, cfg); WT_WITH_SCHEMA_LOCK(session, - ret = __wt_schema_worker(session, uri, - __wt_upgrade, cfg, WT_DHANDLE_EXCLUSIVE | WT_BTREE_UPGRADE)); + ret = __wt_schema_worker(session, uri, __wt_upgrade, + NULL, cfg, WT_DHANDLE_EXCLUSIVE | WT_BTREE_UPGRADE)); err: API_END_NOTFOUND_MAP(session, ret); } @@ -608,8 +608,8 @@ __session_verify(WT_SESSION *wt_session, const char *uri, const char *config) SESSION_API_CALL(session, verify, config, cfg); WT_WITH_SCHEMA_LOCK(session, - ret = __wt_schema_worker(session, uri, - __wt_verify, cfg, WT_DHANDLE_EXCLUSIVE | WT_BTREE_VERIFY)); + ret = __wt_schema_worker(session, uri, __wt_verify, + NULL, cfg, WT_DHANDLE_EXCLUSIVE | WT_BTREE_VERIFY)); err: API_END_NOTFOUND_MAP(session, ret); } diff --git a/src/txn/txn_ckpt.c b/src/txn/txn_ckpt.c index 8d4b56de2f1..d1c14362758 100644 --- a/src/txn/txn_ckpt.c +++ b/src/txn/txn_ckpt.c @@ -95,7 +95,7 @@ __checkpoint_apply(WT_SESSION_IMPL *session, const char *cfg[], WT_ERR(__wt_buf_fmt(session, tmp, "%.*s", (int)k.len, k.str)); if ((ret = __wt_schema_worker( - session, tmp->data, op, cfg, 0)) != 0) + session, tmp->data, op, NULL, cfg, 0)) != 0) WT_ERR_MSG(session, ret, "%s", (const char *)tmp->data); } WT_ERR_NOTFOUND_OK(ret); |