summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dist/api_data.py4
-rw-r--r--dist/s_string.ok1
-rw-r--r--src/block/block_mgr.c6
-rw-r--r--src/block/block_open.c12
-rw-r--r--src/btree/bt_handle.c74
-rw-r--r--src/btree/bt_huffman.c8
-rw-r--r--src/config/config_def.c18
-rw-r--r--src/conn/conn_btree.c110
-rw-r--r--src/include/btree.h2
-rw-r--r--src/include/extern.h9
-rw-r--r--src/schema/schema_create.c20
11 files changed, 151 insertions, 113 deletions
diff --git a/dist/api_data.py b/dist/api_data.py
index 9d0dc6ee861..e24f9e1bc00 100644
--- a/dist/api_data.py
+++ b/dist/api_data.py
@@ -122,7 +122,7 @@ lsm_config = [
]
# Per-file configuration
-file_config = format_meta + lsm_config + [
+file_config = format_meta + [
Config('allocation_size', '512B', r'''
the file unit allocation size, in bytes, must a power-of-two;
smaller values decrease the file space required by overflow
@@ -351,7 +351,7 @@ methods = {
min='10', max='50'),
]),
-'session.create' : Method(table_only_meta + file_config + source_meta + [
+'session.create' : Method(table_only_meta + file_config + lsm_config + source_meta + [
Config('exclusive', 'false', r'''
fail if the object exists. When false (the default), if the
object exists, check that its settings match the specified
diff --git a/dist/s_string.ok b/dist/s_string.ok
index 3a1f14afa4f..0b4118937d4 100644
--- a/dist/s_string.ok
+++ b/dist/s_string.ok
@@ -510,6 +510,7 @@ memcpy
memfree
memmove
memsize
+metaconf
metadata
metafile
mfence
diff --git a/src/block/block_mgr.c b/src/block/block_mgr.c
index 4ad65247825..ddf23a97866 100644
--- a/src/block/block_mgr.c
+++ b/src/block/block_mgr.c
@@ -378,8 +378,8 @@ __bm_method_set(WT_BM *bm, int readonly)
* Open a file.
*/
int
-__wt_block_manager_open(WT_SESSION_IMPL *session, const char *filename,
- const char *config, const char *cfg[], int forced_salvage, WT_BM **bmp)
+__wt_block_manager_open(WT_SESSION_IMPL *session,
+ const char *filename, const char *cfg[], int forced_salvage, WT_BM **bmp)
{
WT_BM *bm;
WT_DECL_RET;
@@ -390,7 +390,7 @@ __wt_block_manager_open(WT_SESSION_IMPL *session, const char *filename,
__bm_method_set(bm, 0);
WT_ERR(__wt_block_open(
- session, filename, config, cfg, forced_salvage, &bm->block));
+ session, filename, cfg, forced_salvage, &bm->block));
*bmp = bm;
return (0);
diff --git a/src/block/block_open.c b/src/block/block_open.c
index d47a3962ca3..49900d4bb31 100644
--- a/src/block/block_open.c
+++ b/src/block/block_open.c
@@ -93,8 +93,7 @@ __block_destroy(WT_SESSION_IMPL *session, WT_BLOCK *block)
*/
int
__wt_block_open(WT_SESSION_IMPL *session, const char *filename,
- const char *config, const char *cfg[], int forced_salvage,
- WT_BLOCK **blockp)
+ const char *cfg[], int forced_salvage, WT_BLOCK **blockp)
{
WT_BLOCK *block;
WT_CONFIG_ITEM cval;
@@ -123,12 +122,12 @@ __wt_block_open(WT_SESSION_IMPL *session, const char *filename,
WT_ERR(__wt_strdup(session, filename, &block->name));
- /* Configuration: allocation size. */
- WT_ERR(__wt_config_getones(session, config, "allocation_size", &cval));
+ /* Get the allocation size. */
+ WT_ERR(__wt_config_gets(session, cfg, "allocation_size", &cval));
block->allocsize = (uint32_t)cval.val;
/* Configuration: optional OS buffer cache maximum size. */
- WT_ERR(__wt_config_getones(session, config, "os_cache_max", &cval));
+ WT_ERR(__wt_config_gets(session, cfg, "os_cache_max", &cval));
block->os_cache_max = cval.val;
#ifdef HAVE_POSIX_FADVISE
if (conn->direct_io && block->os_cache_max)
@@ -142,8 +141,7 @@ __wt_block_open(WT_SESSION_IMPL *session, const char *filename,
#endif
/* Configuration: optional immediate write scheduling flag. */
- WT_ERR(
- __wt_config_getones(session, config, "os_cache_dirty_max", &cval));
+ WT_ERR(__wt_config_gets(session, cfg, "os_cache_dirty_max", &cval));
block->os_cache_dirty_max = cval.val;
#ifdef HAVE_SYNC_FILE_RANGE
if (conn->direct_io && block->os_cache_dirty_max)
diff --git a/src/btree/bt_handle.c b/src/btree/bt_handle.c
index b537c2a42d2..6eaeb762c09 100644
--- a/src/btree/bt_handle.c
+++ b/src/btree/bt_handle.c
@@ -9,7 +9,7 @@
static int __btree_conf(WT_SESSION_IMPL *, WT_CKPT *ckpt);
static int __btree_get_last_recno(WT_SESSION_IMPL *);
-static int __btree_page_sizes(WT_SESSION_IMPL *, const char *);
+static int __btree_page_sizes(WT_SESSION_IMPL *);
static int __btree_tree_open_empty(WT_SESSION_IMPL *, int);
static int pse1(WT_SESSION_IMPL *, const char *, uint32_t, uint32_t);
@@ -20,7 +20,7 @@ static int pse2(WT_SESSION_IMPL *, const char *, uint32_t, uint32_t, uint32_t);
* Open a Btree.
*/
int
-__wt_btree_open(WT_SESSION_IMPL *session, const char *cfg[])
+__wt_btree_open(WT_SESSION_IMPL *session, const char *op_cfg[])
{
WT_BM *bm;
WT_BTREE *btree;
@@ -54,12 +54,9 @@ __wt_btree_open(WT_SESSION_IMPL *session, const char *cfg[])
/* Handle salvage configuration. */
forced_salvage = 0;
- if (F_ISSET(btree, WT_BTREE_SALVAGE) && cfg != NULL) {
- ret = __wt_config_gets(session, cfg, "force", &cval);
- if (ret != 0 && ret != WT_NOTFOUND)
- WT_ERR(ret);
- if (ret == 0 && cval.val != 0)
- forced_salvage = 1;
+ if (F_ISSET(btree, WT_BTREE_SALVAGE)) {
+ WT_ERR(__wt_config_gets(session, op_cfg, "force", &cval));
+ forced_salvage = (cval.val != 0);
}
/* Initialize and configure the WT_BTREE structure. */
@@ -70,7 +67,7 @@ __wt_btree_open(WT_SESSION_IMPL *session, const char *cfg[])
if (!WT_PREFIX_SKIP(filename, "file:"))
WT_ERR_MSG(session, EINVAL, "expected a 'file:' URI");
WT_ERR(__wt_block_manager_open(
- session, filename, btree->config, cfg, forced_salvage, &btree->bm));
+ session, filename, btree->cfg, forced_salvage, &btree->bm));
bm = btree->bm;
/*
@@ -175,14 +172,14 @@ __btree_conf(WT_SESSION_IMPL *session, WT_CKPT *ckpt)
WT_NAMED_COMPRESSOR *ncomp;
uint32_t bitcnt;
int fixed;
- const char *config;
+ const char **cfg;
- btree = session->btree;
conn = S2C(session);
- config = btree->config;
+ btree = session->btree;
+ cfg = btree->cfg;
/* Validate file types and check the data format plan. */
- WT_RET(__wt_config_getones(session, config, "key_format", &cval));
+ WT_RET(__wt_config_gets(session, cfg, "key_format", &cval));
WT_RET(__wt_struct_check(session, cval.str, cval.len, NULL, NULL));
if (WT_STRING_MATCH("r", cval.str, cval.len))
btree->type = BTREE_COL_VAR;
@@ -190,12 +187,12 @@ __btree_conf(WT_SESSION_IMPL *session, WT_CKPT *ckpt)
btree->type = BTREE_ROW;
WT_RET(__wt_strndup(session, cval.str, cval.len, &btree->key_format));
- WT_RET(__wt_config_getones(session, config, "value_format", &cval));
+ WT_RET(__wt_config_gets(session, cfg, "value_format", &cval));
WT_RET(__wt_strndup(session, cval.str, cval.len, &btree->value_format));
/* Row-store key comparison and key gap for prefix compression. */
if (btree->type == BTREE_ROW) {
- WT_RET(__wt_config_getones(session, config, "collator", &cval));
+ WT_RET(__wt_config_gets(session, cfg, "collator", &cval));
if (cval.len > 0) {
TAILQ_FOREACH(ncoll, &conn->collqh, q) {
if (WT_STRING_MATCH(
@@ -209,7 +206,7 @@ __btree_conf(WT_SESSION_IMPL *session, WT_CKPT *ckpt)
"unknown collator '%.*s'",
(int)cval.len, cval.str);
}
- WT_RET(__wt_config_getones(session, config, "key_gap", &cval));
+ WT_RET(__wt_config_gets(session, cfg, "key_gap", &cval));
btree->key_gap = (uint32_t)cval.val;
}
/* Check for fixed-size data. */
@@ -227,14 +224,13 @@ __btree_conf(WT_SESSION_IMPL *session, WT_CKPT *ckpt)
}
/* Page sizes */
- WT_RET(__btree_page_sizes(session, config));
+ WT_RET(__btree_page_sizes(session));
/* Eviction; the metadata file is never evicted. */
if (strcmp(btree->name, WT_METADATA_URI) == 0)
F_SET(btree, WT_BTREE_NO_EVICTION | WT_BTREE_NO_HAZARD);
else {
- WT_RET(__wt_config_getones(
- session, config, "cache_resident", &cval));
+ WT_RET(__wt_config_gets(session, cfg, "cache_resident", &cval));
if (cval.val)
F_SET(btree, WT_BTREE_NO_EVICTION | WT_BTREE_NO_HAZARD);
else
@@ -242,7 +238,7 @@ __btree_conf(WT_SESSION_IMPL *session, WT_CKPT *ckpt)
}
/* Checksums */
- WT_RET(__wt_config_getones(session, config, "checksum", &cval));
+ WT_RET(__wt_config_gets(session, cfg, "checksum", &cval));
if (WT_STRING_MATCH("on", cval.str, cval.len))
btree->checksum = CKSUM_ON;
else if (WT_STRING_MATCH("off", cval.str, cval.len))
@@ -251,7 +247,7 @@ __btree_conf(WT_SESSION_IMPL *session, WT_CKPT *ckpt)
btree->checksum = CKSUM_UNCOMPRESSED;
/* Huffman encoding */
- WT_RET(__wt_btree_huffman_open(session, config));
+ WT_RET(__wt_btree_huffman_open(session));
/*
* Reconciliation configuration:
@@ -265,22 +261,21 @@ __btree_conf(WT_SESSION_IMPL *session, WT_CKPT *ckpt)
case BTREE_COL_FIX:
break;
case BTREE_ROW:
- WT_RET(__wt_config_getones(
- session, config, "internal_key_truncate", &cval));
+ WT_RET(__wt_config_gets(
+ session, cfg, "internal_key_truncate", &cval));
btree->internal_key_truncate = cval.val == 0 ? 0 : 1;
- WT_RET(__wt_config_getones(
- session, config, "prefix_compression", &cval));
+ WT_RET(__wt_config_gets(
+ session, cfg, "prefix_compression", &cval));
btree->prefix_compression = cval.val == 0 ? 0 : 1;
/* FALLTHROUGH */
case BTREE_COL_VAR:
- WT_RET(
- __wt_config_getones(session, config, "dictionary", &cval));
+ WT_RET(__wt_config_gets(session, cfg, "dictionary", &cval));
btree->dictionary = (u_int)cval.val;
break;
}
- WT_RET(__wt_config_getones(session, config, "block_compressor", &cval));
+ WT_RET(__wt_config_gets(session, cfg, "block_compressor", &cval));
if (cval.len > 0) {
TAILQ_FOREACH(ncomp, &conn->compqh, q)
if (WT_STRING_MATCH(ncomp->name, cval.str, cval.len)) {
@@ -539,37 +534,36 @@ __btree_get_last_recno(WT_SESSION_IMPL *session)
* Verify the page sizes.
*/
static int
-__btree_page_sizes(WT_SESSION_IMPL *session, const char *config)
+__btree_page_sizes(WT_SESSION_IMPL *session)
{
WT_BTREE *btree;
WT_CONFIG_ITEM cval;
uint32_t intl_split_size, leaf_split_size;
+ const char **cfg;
btree = session->btree;
+ cfg = btree->cfg;
- WT_RET(__wt_config_getones(session, config, "allocation_size", &cval));
+ WT_RET(__wt_config_gets(session, cfg, "allocation_size", &cval));
btree->allocsize = (uint32_t)cval.val;
- WT_RET(
- __wt_config_getones(session, config, "internal_page_max", &cval));
+ WT_RET(__wt_config_gets(session, cfg, "internal_page_max", &cval));
btree->maxintlpage = (uint32_t)cval.val;
- WT_RET(__wt_config_getones(
- session, config, "internal_item_max", &cval));
+ WT_RET(__wt_config_gets(session, cfg, "internal_item_max", &cval));
btree->maxintlitem = (uint32_t)cval.val;
- WT_RET(__wt_config_getones(session, config, "leaf_page_max", &cval));
+ WT_RET(__wt_config_gets(session, cfg, "leaf_page_max", &cval));
btree->maxleafpage = (uint32_t)cval.val;
- WT_RET(__wt_config_getones(
- session, config, "leaf_item_max", &cval));
+ WT_RET(__wt_config_gets(session, cfg, "leaf_item_max", &cval));
btree->maxleafitem = (uint32_t)cval.val;
- WT_RET(__wt_config_getones(session, config, "split_pct", &cval));
+ WT_RET(__wt_config_gets(session, cfg, "split_pct", &cval));
btree->split_pct = (u_int)cval.val;
/*
* When a page is forced to split, we want at least 50 entries on its
* parent.
*/
- WT_RET(__wt_config_getones(session, config, "memory_page_max", &cval));
- btree->maxmempage = (uint64_t)WT_MAX(cval.val, 50 * btree->maxleafpage);
+ WT_RET(__wt_config_gets(session, cfg, "memory_page_max", &cval));
+ btree->maxmempage = WT_MAX((uint64_t)cval.val, 50 * btree->maxleafpage);
/*
* Limit allocation units to 128MB, and page sizes to 512MB. There's no
diff --git a/src/btree/bt_huffman.c b/src/btree/bt_huffman.c
index 25e760e2e99..a01a474eb29 100644
--- a/src/btree/bt_huffman.c
+++ b/src/btree/bt_huffman.c
@@ -132,7 +132,7 @@ static int __wt_huffman_read(WT_SESSION_IMPL *,
* Configure Huffman encoding for the tree.
*/
int
-__wt_btree_huffman_open(WT_SESSION_IMPL *session, const char *config)
+__wt_btree_huffman_open(WT_SESSION_IMPL *session)
{
struct __wt_huffman_table *table;
WT_BTREE *btree;
@@ -142,9 +142,9 @@ __wt_btree_huffman_open(WT_SESSION_IMPL *session, const char *config)
btree = session->btree;
- WT_RET(__wt_config_getones(session, config, "huffman_key", &key_conf));
- WT_RET(__wt_config_getones(
- session, config, "huffman_value", &value_conf));
+ WT_RET(__wt_config_gets(session, btree->cfg, "huffman_key", &key_conf));
+ WT_RET(__wt_config_gets(
+ session, btree->cfg, "huffman_value", &value_conf));
if (key_conf.len == 0 && value_conf.len == 0)
return (0);
diff --git a/src/config/config_def.c b/src/config/config_def.c
index 9eb023e9928..fda40121674 100644
--- a/src/config/config_def.c
+++ b/src/config/config_def.c
@@ -130,12 +130,9 @@ __wt_confdfl_file_meta =
"checksum=on,collator=,columns=,dictionary=0,format=btree,"
"huffman_key=,huffman_value=,internal_item_max=0,"
"internal_key_truncate=,internal_page_max=2KB,key_format=u,key_gap=10"
- ",leaf_item_max=0,leaf_page_max=1MB,lsm_bloom=,lsm_bloom_bit_count=8,"
- "lsm_bloom_config=,lsm_bloom_hash_count=4,lsm_bloom_newest=0,"
- "lsm_bloom_oldest=0,lsm_chunk_size=2MB,lsm_merge_max=15,"
- "lsm_merge_threads=1,memory_page_max=5MB,os_cache_dirty_max=0,"
- "os_cache_max=0,prefix_compression=,split_pct=75,value_format=u,"
- "version=(major=0,minor=0)";
+ ",leaf_item_max=0,leaf_page_max=1MB,memory_page_max=5MB,"
+ "os_cache_dirty_max=0,os_cache_max=0,prefix_compression=,split_pct=75"
+ ",value_format=u,version=(major=0,minor=0)";
WT_CONFIG_CHECK
__wt_confchk_file_meta[] = {
@@ -159,15 +156,6 @@ __wt_confchk_file_meta[] = {
{ "key_gap", "int", "min=0", NULL},
{ "leaf_item_max", "int", "min=0", NULL},
{ "leaf_page_max", "int", "min=512B,max=512MB", NULL},
- { "lsm_bloom", "boolean", NULL, NULL},
- { "lsm_bloom_bit_count", "int", "min=2,max=1000", NULL},
- { "lsm_bloom_config", "string", NULL, NULL},
- { "lsm_bloom_hash_count", "int", "min=2,max=100", NULL},
- { "lsm_bloom_newest", "boolean", NULL, NULL},
- { "lsm_bloom_oldest", "boolean", NULL, NULL},
- { "lsm_chunk_size", "int", "min=512K,max=500MB", NULL},
- { "lsm_merge_max", "int", "min=2,max=100", NULL},
- { "lsm_merge_threads", "int", "min=1,max=10", NULL},
{ "memory_page_max", "int", "min=512B,max=10TB", NULL},
{ "os_cache_dirty_max", "int", "min=0", NULL},
{ "os_cache_max", "int", "min=0", NULL},
diff --git a/src/conn/conn_btree.c b/src/conn/conn_btree.c
index ab75be0038f..3016e721bea 100644
--- a/src/conn/conn_btree.c
+++ b/src/conn/conn_btree.c
@@ -193,12 +193,77 @@ __wt_conn_btree_sync_and_close(WT_SESSION_IMPL *session)
}
/*
+ * __conn_btree_config_clear --
+ * Clear the underlying object's configuration information.
+ */
+static void
+__conn_btree_config_clear(WT_SESSION_IMPL *session)
+{
+ WT_BTREE *btree;
+ const char **a;
+
+ btree = session->btree;
+
+ if (btree->cfg == NULL)
+ return;
+ for (a = btree->cfg; *a != NULL; ++a)
+ __wt_free(session, *a);
+ __wt_free(session, btree->cfg);
+}
+
+/*
+ * __conn_btree_config_set --
+ * Set up a btree handle's configuration information.
+ */
+static int
+__conn_btree_config_set(WT_SESSION_IMPL *session)
+{
+ WT_BTREE *btree;
+ WT_DECL_RET;
+ const char *metaconf;
+
+ btree = session->btree;
+
+ /*
+ * Read the object's entry from the metadata file, we're done if we
+ * don't find one.
+ */
+ if ((ret = __wt_metadata_read(session, btree->name, &metaconf)) != 0) {
+ if (ret == WT_NOTFOUND)
+ ret = ENOENT;
+ WT_RET(ret);
+ }
+
+ /*
+ * The defaults are included because underlying objects have persistent
+ * configuration information stored in the metadata file. If defaults
+ * are included in the configuration, we can add new configuration
+ * strings without upgrading the metadata file or writing special code
+ * in case a configuration string isn't initialized, as long as the new
+ * configuration string has an appropriate default value.
+ *
+ * The error handling is a little odd, but be careful: we're holding a
+ * chunk of allocated memory in metaconf. If we fail before we copy a
+ * reference to it into the object's configuration array, we must free
+ * it, after the copy, we don't want to free it.
+ */
+ WT_ERR(__wt_calloc_def(session, 3, &btree->cfg));
+ WT_ERR(__wt_strdup(session, __wt_confdfl_file_meta, &btree->cfg[0]));
+ btree->cfg[1] = metaconf;
+ metaconf = NULL;
+ return (0);
+
+err: __wt_free(session, metaconf);
+ return (ret);
+}
+
+/*
* __conn_btree_open --
* Open the current btree handle.
*/
static int
-__conn_btree_open(WT_SESSION_IMPL *session,
- const char *config, const char *cfg[], uint32_t flags)
+__conn_btree_open(
+ WT_SESSION_IMPL *session, const char *op_cfg[], uint32_t flags)
{
WT_BTREE *btree;
WT_DECL_RET;
@@ -209,10 +274,6 @@ __conn_btree_open(WT_SESSION_IMPL *session,
F_ISSET(btree, WT_BTREE_EXCLUSIVE) &&
!LF_ISSET(WT_BTREE_LOCK_ONLY));
- /* Open the underlying file, free any old config. */
- __wt_free(session, btree->config);
- btree->config = config;
-
/*
* If the handle is already open, it has to be closed so it can be
* reopened with a new configuration. We don't need to check again:
@@ -222,11 +283,15 @@ __conn_btree_open(WT_SESSION_IMPL *session,
if (F_ISSET(btree, WT_BTREE_OPEN))
WT_RET(__wt_conn_btree_sync_and_close(session));
+ /* Discard any previous configuration, set up the new configuration. */
+ __conn_btree_config_clear(session);
+ WT_RET(__conn_btree_config_set(session));
+
/* Set any special flags on the handle. */
F_SET(btree, LF_ISSET(WT_BTREE_SPECIAL_FLAGS));
do {
- WT_ERR(__wt_btree_open(session, cfg));
+ WT_ERR(__wt_btree_open(session, op_cfg));
F_SET(btree, WT_BTREE_OPEN);
/*
* Checkpoint handles are read only, so eviction calculations
@@ -257,11 +322,10 @@ err: F_CLR(btree, WT_BTREE_SPECIAL_FLAGS);
*/
int
__wt_conn_btree_get(WT_SESSION_IMPL *session,
- const char *name, const char *ckpt, const char *cfg[], uint32_t flags)
+ const char *name, const char *ckpt, const char *op_cfg[], uint32_t flags)
{
WT_BTREE *btree;
WT_DECL_RET;
- const char *treeconf;
WT_RET(__conn_btree_get(session, name, ckpt, flags));
@@ -269,19 +333,11 @@ __wt_conn_btree_get(WT_SESSION_IMPL *session,
if (!LF_ISSET(WT_BTREE_LOCK_ONLY) &&
(!F_ISSET(btree, WT_BTREE_OPEN) ||
- LF_ISSET(WT_BTREE_SPECIAL_FLAGS))) {
- if ((ret = __wt_metadata_read(session, name, &treeconf)) != 0) {
- if (ret == WT_NOTFOUND)
- ret = ENOENT;
- goto err;
+ LF_ISSET(WT_BTREE_SPECIAL_FLAGS)))
+ if ((ret = __conn_btree_open(session, op_cfg, flags)) != 0) {
+ F_CLR(btree, WT_BTREE_EXCLUSIVE);
+ WT_TRET(__wt_rwunlock(session, btree->rwlock));
}
- ret = __conn_btree_open(session, treeconf, cfg, flags);
- }
-
-err: if (ret != 0) {
- F_CLR(btree, WT_BTREE_EXCLUSIVE);
- WT_TRET(__wt_rwunlock(session, btree->rwlock));
- }
WT_ASSERT(session, ret != 0 ||
LF_ISSET(WT_BTREE_EXCLUSIVE) == F_ISSET(btree, WT_BTREE_EXCLUSIVE));
@@ -492,17 +548,19 @@ __wt_conn_btree_discard_single(WT_SESSION_IMPL *session, WT_BTREE *btree)
{
WT_DECL_RET;
- if (F_ISSET(btree, WT_BTREE_OPEN)) {
- WT_SET_BTREE_IN_SESSION(session, btree);
+ WT_SET_BTREE_IN_SESSION(session, btree);
+
+ if (F_ISSET(btree, WT_BTREE_OPEN))
WT_TRET(__wt_conn_btree_sync_and_close(session));
- WT_CLEAR_BTREE_IN_SESSION(session);
- }
+
WT_TRET(__wt_rwlock_destroy(session, &btree->rwlock));
- __wt_free(session, btree->config);
__wt_free(session, btree->name);
__wt_free(session, btree->checkpoint);
+ __conn_btree_config_clear(session);
__wt_overwrite_and_free(session, btree);
+ WT_CLEAR_BTREE_IN_SESSION(session);
+
return (ret);
}
diff --git a/src/include/btree.h b/src/include/btree.h
index 2070f20f294..624e9fe0b1c 100644
--- a/src/include/btree.h
+++ b/src/include/btree.h
@@ -63,7 +63,7 @@ struct __wt_btree {
const char *name; /* Object name as a URI */
const char *checkpoint; /* Checkpoint name (or NULL) */
- const char *config; /* Configuration string */
+ const char **cfg; /* Configuration information */
WT_DSRC_STATS stats; /* Data-source statistics */
int maximum_depth; /* Maximum tree depth */
diff --git a/src/include/extern.h b/src/include/extern.h
index bed015e316e..917d898977e 100644
--- a/src/include/extern.h
+++ b/src/include/extern.h
@@ -122,7 +122,6 @@ extern int __wt_block_unmap( WT_SESSION_IMPL *session,
size_t maplen);
extern int __wt_block_manager_open(WT_SESSION_IMPL *session,
const char *filename,
- const char *config,
const char *cfg[],
int forced_salvage,
WT_BM **bmp);
@@ -132,7 +131,6 @@ extern int __wt_block_manager_create(WT_SESSION_IMPL *session,
const char *filename);
extern int __wt_block_open(WT_SESSION_IMPL *session,
const char *filename,
- const char *config,
const char *cfg[],
int forced_salvage,
WT_BLOCK **blockp);
@@ -267,7 +265,7 @@ extern void *__wt_cache_evict_server(void *arg);
extern void __wt_evict_clear_tree_walk(WT_SESSION_IMPL *session, WT_PAGE *page);
extern int __wt_sync_file(WT_SESSION_IMPL *session, int syncop);
extern int __wt_evict_lru_page(WT_SESSION_IMPL *session, int is_app);
-extern int __wt_btree_open(WT_SESSION_IMPL *session, const char *cfg[]);
+extern int __wt_btree_open(WT_SESSION_IMPL *session, const char *op_cfg[]);
extern int __wt_btree_close(WT_SESSION_IMPL *session);
extern int __wt_btree_tree_open( WT_SESSION_IMPL *session,
const uint8_t *addr,
@@ -281,8 +279,7 @@ extern int __wt_btree_get_memsize(WT_SESSION_IMPL *session,
extern int __wt_btree_release_memsize(WT_SESSION_IMPL *session,
WT_BTREE *btree);
extern uint32_t __wt_split_page_size(WT_BTREE *btree, uint32_t maxpagesize);
-extern int __wt_btree_huffman_open(WT_SESSION_IMPL *session,
- const char *config);
+extern int __wt_btree_huffman_open(WT_SESSION_IMPL *session);
extern void __wt_btree_huffman_close(WT_SESSION_IMPL *session);
extern int __wt_bt_read(WT_SESSION_IMPL *session,
WT_ITEM *buf,
@@ -570,7 +567,7 @@ extern int __wt_conn_btree_sync_and_close(WT_SESSION_IMPL *session);
extern int __wt_conn_btree_get(WT_SESSION_IMPL *session,
const char *name,
const char *ckpt,
- const char *cfg[],
+ const char *op_cfg[],
uint32_t flags);
extern int __wt_conn_btree_apply(WT_SESSION_IMPL *session,
int (*func)(WT_SESSION_IMPL *,
diff --git a/src/schema/schema_create.c b/src/schema/schema_create.c
index 3a92bde32db..6a9fa218532 100644
--- a/src/schema/schema_create.c
+++ b/src/schema/schema_create.c
@@ -14,11 +14,10 @@ __create_file(WT_SESSION_IMPL *session,
WT_DECL_ITEM(val);
WT_DECL_RET;
int is_metadata;
- const char *cfg[] = API_CONF_DEFAULTS(session, create, config);
const char *filecfg[4] = API_CONF_DEFAULTS(file, meta, config);
- const char *filename, *treeconf;
+ const char *fileconf, *filename;
- treeconf = NULL;
+ fileconf = NULL;
is_metadata = strcmp(uri, WT_METADATA_URI) == 0;
@@ -28,7 +27,7 @@ __create_file(WT_SESSION_IMPL *session,
/* Check if the file already exists. */
if (!is_metadata && (ret =
- __wt_metadata_read(session, uri, &treeconf)) != WT_NOTFOUND) {
+ __wt_metadata_read(session, uri, &fileconf)) != WT_NOTFOUND) {
if (exclusive)
WT_TRET(EEXIST);
goto err;
@@ -50,8 +49,8 @@ __create_file(WT_SESSION_IMPL *session,
WT_BTREE_MAJOR_VERSION, WT_BTREE_MINOR_VERSION));
filecfg[2] = val->data;
filecfg[3] = NULL;
- WT_ERR(__wt_config_collapse(session, filecfg, &treeconf));
- if ((ret = __wt_metadata_insert(session, uri, treeconf)) != 0) {
+ WT_ERR(__wt_config_collapse(session, filecfg, &fileconf));
+ if ((ret = __wt_metadata_insert(session, uri, fileconf)) != 0) {
if (ret == WT_DUPLICATE_KEY)
ret = EEXIST;
goto err;
@@ -59,20 +58,23 @@ __create_file(WT_SESSION_IMPL *session,
}
/*
- * Open the file to check that it was setup correctly.
+ * Open the file to check that it was setup correctly. We don't need
+ * to pass the configuration, we just wrote the collapsed configuration
+ * into the metadata file, and it's going to be read/used by underlying
+ * functions.
*
* Keep the handle exclusive until it is released at the end of the
* call, otherwise we could race with a drop.
*/
WT_ERR(__wt_conn_btree_get(
- session, uri, NULL, cfg, WT_BTREE_EXCLUSIVE));
+ session, uri, NULL, NULL, WT_BTREE_EXCLUSIVE));
if (WT_META_TRACKING(session))
WT_ERR(__wt_meta_track_handle_lock(session, 1));
else
WT_ERR(__wt_session_release_btree(session));
err: __wt_scr_free(&val);
- __wt_free(session, treeconf);
+ __wt_free(session, fileconf);
return (ret);
}