summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/src/meta/meta_apply.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/third_party/wiredtiger/src/meta/meta_apply.c')
-rw-r--r--src/third_party/wiredtiger/src/meta/meta_apply.c34
1 files changed, 20 insertions, 14 deletions
diff --git a/src/third_party/wiredtiger/src/meta/meta_apply.c b/src/third_party/wiredtiger/src/meta/meta_apply.c
index 7722cd55fbd..fb483c21dd9 100644
--- a/src/third_party/wiredtiger/src/meta/meta_apply.c
+++ b/src/third_party/wiredtiger/src/meta/meta_apply.c
@@ -15,22 +15,26 @@
*/
static inline int
__meta_btree_apply(WT_SESSION_IMPL *session, WT_CURSOR *cursor,
- int (*func)(WT_SESSION_IMPL *, const char *[]), const char *cfg[])
+ int (*file_func)(WT_SESSION_IMPL *, const char *[]),
+ int (*name_func)(WT_SESSION_IMPL *, const char *, bool *),
+ const char *cfg[])
{
WT_DECL_RET;
const char *uri;
- int cmp;
+ bool skip;
- cursor->set_key(cursor, "file:");
- if ((ret = cursor->search_near(cursor, &cmp)) == 0 && cmp < 0)
- ret = cursor->next(cursor);
- for (; ret == 0; ret = cursor->next(cursor)) {
+ while ((ret = cursor->next(cursor)) == 0) {
WT_RET(cursor->get_key(cursor, &uri));
- if (!WT_PREFIX_MATCH(uri, "file:"))
- break;
if (strcmp(uri, WT_METAFILE_URI) == 0)
continue;
+ skip = false;
+ if (name_func != NULL)
+ WT_RET(name_func(session, uri, &skip));
+
+ if (file_func == NULL || skip || !WT_PREFIX_MATCH(uri, "file:"))
+ continue;
+
/*
* We need to pull the handle into the session handle cache
* and make sure it's referenced to stop other internal code
@@ -40,7 +44,7 @@ __meta_btree_apply(WT_SESSION_IMPL *session, WT_CURSOR *cursor,
if ((ret = __wt_session_get_btree(
session, uri, NULL, NULL, 0)) != 0)
return (ret == EBUSY ? 0 : ret);
- WT_SAVE_DHANDLE(session, ret = func(session, cfg));
+ WT_SAVE_DHANDLE(session, ret = file_func(session, cfg));
if (WT_META_TRACKING(session))
WT_TRET(__wt_meta_track_handle_lock(
session, false));
@@ -54,20 +58,22 @@ __meta_btree_apply(WT_SESSION_IMPL *session, WT_CURSOR *cursor,
}
/*
- * __wt_meta_btree_apply --
+ * __wt_meta_apply_all --
* Apply a function to all files listed in the metadata, apart from the
* metadata file.
*/
int
-__wt_meta_btree_apply(WT_SESSION_IMPL *session,
- int (*func)(WT_SESSION_IMPL *, const char *[]), const char *cfg[])
+__wt_meta_apply_all(WT_SESSION_IMPL *session,
+ int (*file_func)(WT_SESSION_IMPL *, const char *[]),
+ int (*name_func)(WT_SESSION_IMPL *, const char *, bool *),
+ const char *cfg[])
{
WT_CURSOR *cursor;
WT_DECL_RET;
WT_RET(__wt_metadata_cursor(session, &cursor));
- WT_SAVE_DHANDLE(session,
- ret = __meta_btree_apply(session, cursor, func, cfg));
+ WT_SAVE_DHANDLE(session, ret =
+ __meta_btree_apply(session, cursor, file_func, name_func, cfg));
WT_TRET(__wt_metadata_cursor_release(session, &cursor));
return (ret);