diff options
-rw-r--r-- | dist/api_data.py | 4 | ||||
-rw-r--r-- | dist/s_string.ok | 1 | ||||
-rw-r--r-- | src/block/block_mgr.c | 6 | ||||
-rw-r--r-- | src/block/block_open.c | 12 | ||||
-rw-r--r-- | src/btree/bt_handle.c | 74 | ||||
-rw-r--r-- | src/btree/bt_huffman.c | 8 | ||||
-rw-r--r-- | src/config/config_def.c | 18 | ||||
-rw-r--r-- | src/conn/conn_btree.c | 110 | ||||
-rw-r--r-- | src/include/btree.h | 2 | ||||
-rw-r--r-- | src/include/extern.h | 9 | ||||
-rw-r--r-- | src/schema/schema_create.c | 20 |
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); } |