summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Gorrod <alexg@wiredtiger.com>2013-05-28 15:00:53 +1000
committerAlex Gorrod <alexg@wiredtiger.com>2013-05-28 15:00:53 +1000
commit5dd08956f367d46dcec672344366164e2a761d4a (patch)
treef317368227b82d502098391d3d133a6b118aefce
parentf5419223022aee228d03fd48b66bec6ba78a3896 (diff)
downloadmongo-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.c3
-rw-r--r--src/include/extern.h8
-rw-r--r--src/lsm/lsm_tree.c9
-rw-r--r--src/lsm/lsm_worker.c2
-rw-r--r--src/schema/schema_worker.c61
-rw-r--r--src/session/session_api.c14
-rw-r--r--src/txn/txn_ckpt.c2
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);