summaryrefslogtreecommitdiff
path: root/src/lsm
diff options
context:
space:
mode:
Diffstat (limited to 'src/lsm')
-rw-r--r--src/lsm/lsm_cursor.c17
-rw-r--r--src/lsm/lsm_cursor_bulk.c4
-rw-r--r--src/lsm/lsm_merge.c8
-rw-r--r--src/lsm/lsm_meta.c11
-rw-r--r--src/lsm/lsm_stat.c2
-rw-r--r--src/lsm/lsm_tree.c65
-rw-r--r--src/lsm/lsm_work_unit.c14
7 files changed, 78 insertions, 43 deletions
diff --git a/src/lsm/lsm_cursor.c b/src/lsm/lsm_cursor.c
index 9c124885086..839648b97d7 100644
--- a/src/lsm/lsm_cursor.c
+++ b/src/lsm/lsm_cursor.c
@@ -267,7 +267,7 @@ __clsm_enter(WT_CURSOR_LSM *clsm, bool reset, bool update)
(!update && F_ISSET(clsm, WT_CLSM_OPEN_READ))))
break;
-open: WT_WITH_SCHEMA_LOCK(session, ret,
+open: WT_WITH_SCHEMA_LOCK(session,
ret = __clsm_open_cursors(clsm, update, 0, 0));
WT_RET(ret);
}
@@ -409,13 +409,11 @@ static int
__clsm_resize_chunks(
WT_SESSION_IMPL *session, WT_CURSOR_LSM *clsm, u_int nchunks)
{
- WT_DECL_RET;
WT_LSM_CURSOR_CHUNK *chunk;
/* Don't allocate more iterators if we don't need them. */
- if (clsm->chunks_count >= nchunks) {
- return (ret);
- }
+ if (clsm->chunks_count >= nchunks)
+ return (0);
WT_RET(__wt_realloc_def(session, &clsm->chunks_alloc, nchunks,
&clsm->chunks));
@@ -423,7 +421,7 @@ __clsm_resize_chunks(
WT_RET(__wt_calloc_one(session, &chunk));
clsm->chunks[clsm->chunks_count] = chunk;
}
- return (ret);
+ return (0);
}
/*
@@ -434,9 +432,10 @@ static void
__clsm_free_chunks(WT_SESSION_IMPL *session, WT_CURSOR_LSM *clsm)
{
size_t i;
- for (i = 0; i < clsm->chunks_count; i++) {
+
+ for (i = 0; i < clsm->chunks_count; i++)
__wt_free(session, clsm->chunks[i]);
- }
+
__wt_free(session, clsm->chunks);
}
@@ -763,7 +762,7 @@ __wt_clsm_init_merge(
F_SET(clsm, WT_CLSM_MINOR_MERGE);
clsm->nchunks = nchunks;
- WT_WITH_SCHEMA_LOCK(session, ret,
+ WT_WITH_SCHEMA_LOCK(session,
ret = __clsm_open_cursors(clsm, false, start_chunk, start_id));
return (ret);
}
diff --git a/src/lsm/lsm_cursor_bulk.c b/src/lsm/lsm_cursor_bulk.c
index 319426de3f0..7a6a40e380f 100644
--- a/src/lsm/lsm_cursor_bulk.c
+++ b/src/lsm/lsm_cursor_bulk.c
@@ -45,7 +45,7 @@ __clsm_close_bulk(WT_CURSOR *cursor)
total_chunks /= avg_chunks)
++chunk->generation;
- WT_RET(__wt_lsm_meta_write(session, lsm_tree));
+ WT_RET(__wt_lsm_meta_write(session, lsm_tree, NULL));
++lsm_tree->dsk_gen;
/* Close the LSM cursor */
@@ -113,7 +113,7 @@ __wt_clsm_open_bulk(WT_CURSOR_LSM *clsm, const char *cfg[])
* switch inline, since switch needs a schema lock and online index
* creation opens a bulk cursor while holding the schema lock.
*/
- WT_WITH_SCHEMA_LOCK(session, ret,
+ WT_WITH_SCHEMA_LOCK(session,
ret = __wt_lsm_tree_switch(session, lsm_tree));
WT_RET(ret);
diff --git a/src/lsm/lsm_merge.c b/src/lsm/lsm_merge.c
index dc47d0118a2..ceb5f03a2f5 100644
--- a/src/lsm/lsm_merge.c
+++ b/src/lsm/lsm_merge.c
@@ -434,7 +434,7 @@ __wt_lsm_merge(WT_SESSION_IMPL *session, WT_LSM_TREE *lsm_tree, u_int id)
F_SET(src, WT_CURSTD_RAW);
WT_ERR(__wt_clsm_init_merge(src, start_chunk, start_id, nchunks));
- WT_WITH_SCHEMA_LOCK(session, ret,
+ WT_WITH_SCHEMA_LOCK(session,
ret = __wt_lsm_tree_setup_chunk(session, lsm_tree, chunk));
WT_ERR(ret);
if (create_bloom) {
@@ -579,7 +579,7 @@ __wt_lsm_merge(WT_SESSION_IMPL *session, WT_LSM_TREE *lsm_tree, u_int id)
* Any errors that happened after the tree was locked are
* fatal - we can't guarantee the state of the tree.
*/
- if ((ret = __wt_lsm_meta_write(session, lsm_tree)) != 0)
+ if ((ret = __wt_lsm_meta_write(session, lsm_tree, NULL)) != 0)
WT_PANIC_ERR(session, ret, "Failed finalizing LSM merge");
lsm_tree->dsk_gen++;
@@ -604,13 +604,13 @@ err: if (locked)
if (ret != 0 && created_chunk) {
/* Drop the newly-created files on error. */
if (chunk->uri != NULL) {
- WT_WITH_SCHEMA_LOCK(session, tret,
+ WT_WITH_SCHEMA_LOCK(session,
tret = __wt_schema_drop(
session, chunk->uri, drop_cfg));
WT_TRET(tret);
}
if (create_bloom && chunk->bloom_uri != NULL) {
- WT_WITH_SCHEMA_LOCK(session, tret,
+ WT_WITH_SCHEMA_LOCK(session,
tret = __wt_schema_drop(
session, chunk->bloom_uri, drop_cfg));
WT_TRET(tret);
diff --git a/src/lsm/lsm_meta.c b/src/lsm/lsm_meta.c
index ec52af96231..46ead6d6ac4 100644
--- a/src/lsm/lsm_meta.c
+++ b/src/lsm/lsm_meta.c
@@ -454,13 +454,14 @@ __wt_lsm_meta_read(WT_SESSION_IMPL *session, WT_LSM_TREE *lsm_tree)
* Write the metadata for an LSM tree.
*/
int
-__wt_lsm_meta_write(WT_SESSION_IMPL *session, WT_LSM_TREE *lsm_tree)
+__wt_lsm_meta_write(WT_SESSION_IMPL *session, WT_LSM_TREE *lsm_tree,
+ const char *newconfig)
{
WT_DECL_ITEM(buf);
WT_DECL_RET;
WT_LSM_CHUNK *chunk;
u_int i;
- const char *new_cfg[] = { NULL, NULL, NULL };
+ const char *new_cfg[] = { NULL, NULL, NULL, NULL, NULL };
char *new_metadata;
bool first;
@@ -504,8 +505,10 @@ __wt_lsm_meta_write(WT_SESSION_IMPL *session, WT_LSM_TREE *lsm_tree)
WT_ERR(__wt_buf_catfmt(session, buf, "]"));
/* Update the existing configuration with the new values. */
- new_cfg[0] = lsm_tree->config;
- new_cfg[1] = buf->data;
+ new_cfg[0] = WT_CONFIG_BASE(session, lsm_meta);
+ new_cfg[1] = lsm_tree->config;
+ new_cfg[2] = buf->data;
+ new_cfg[3] = newconfig;
WT_ERR(__wt_config_collapse(session, new_cfg, &new_metadata));
ret = __wt_metadata_update(session, lsm_tree->name, new_metadata);
WT_ERR(ret);
diff --git a/src/lsm/lsm_stat.c b/src/lsm/lsm_stat.c
index 3fe3ca1ba81..150de968722 100644
--- a/src/lsm/lsm_stat.c
+++ b/src/lsm/lsm_stat.c
@@ -178,7 +178,7 @@ __wt_curstat_lsm_init(
* Grab the schema lock because we will be locking the LSM tree and we
* may need to open some files.
*/
- WT_WITH_SCHEMA_LOCK(session, ret,
+ WT_WITH_SCHEMA_LOCK(session,
ret = __curstat_lsm_init(session, uri, cst));
return (ret);
diff --git a/src/lsm/lsm_tree.c b/src/lsm/lsm_tree.c
index 714007cda98..38d87dd852b 100644
--- a/src/lsm/lsm_tree.c
+++ b/src/lsm/lsm_tree.c
@@ -251,7 +251,7 @@ __lsm_tree_cleanup_old(WT_SESSION_IMPL *session, const char *uri)
WT_RET(__wt_fs_exist(session, uri + strlen("file:"), &exists));
if (exists)
- WT_WITH_SCHEMA_LOCK(session, ret,
+ WT_WITH_SCHEMA_LOCK(session,
ret = __wt_schema_drop(session, uri, cfg));
return (ret);
}
@@ -293,8 +293,6 @@ int
__wt_lsm_tree_setup_bloom(
WT_SESSION_IMPL *session, WT_LSM_TREE *lsm_tree, WT_LSM_CHUNK *chunk)
{
- WT_DECL_RET;
-
/*
* The Bloom URI can be populated when the chunk is created, but
* it isn't set yet on open or merge.
@@ -302,8 +300,8 @@ __wt_lsm_tree_setup_bloom(
if (chunk->bloom_uri == NULL)
WT_RET(__wt_lsm_tree_bloom_name(
session, lsm_tree, chunk->id, &chunk->bloom_uri));
- WT_RET(__lsm_tree_cleanup_old(session, chunk->bloom_uri));
- return (ret);
+
+ return (__lsm_tree_cleanup_old(session, chunk->bloom_uri));
}
/*
@@ -758,7 +756,7 @@ __wt_lsm_tree_switch(WT_SESSION_IMPL *session, WT_LSM_TREE *lsm_tree)
lsm_tree->chunk[lsm_tree->nchunks++] = chunk;
WT_ERR(__wt_lsm_tree_setup_chunk(session, lsm_tree, chunk));
- WT_ERR(__wt_lsm_meta_write(session, lsm_tree));
+ WT_ERR(__wt_lsm_meta_write(session, lsm_tree, NULL));
lsm_tree->need_switch = false;
++lsm_tree->dsk_gen;
@@ -843,6 +841,47 @@ __wt_lsm_tree_retire_chunks(WT_SESSION_IMPL *session,
}
/*
+ * __wt_lsm_tree_alter --
+ * Alter an LSM tree.
+ */
+int
+__wt_lsm_tree_alter(
+ WT_SESSION_IMPL *session, const char *uri, const char *cfg[])
+{
+ WT_DECL_RET;
+ WT_LSM_CHUNK *chunk;
+ WT_LSM_TREE *lsm_tree;
+ u_int i;
+ bool locked;
+
+ locked = false;
+
+ /* Get the LSM tree. */
+ WT_WITH_HANDLE_LIST_LOCK(session,
+ ret = __wt_lsm_tree_get(session, uri, false, &lsm_tree));
+ WT_RET(ret);
+
+ /* Prevent any new opens. */
+ __wt_lsm_tree_writelock(session, lsm_tree);
+ locked = true;
+
+ /* Alter the chunks. */
+ for (i = 0; i < lsm_tree->nchunks; i++) {
+ chunk = lsm_tree->chunk[i];
+ WT_ERR(__wt_schema_alter(session, chunk->uri, cfg));
+ if (F_ISSET(chunk, WT_LSM_CHUNK_BLOOM))
+ WT_ERR(
+ __wt_schema_alter(session, chunk->bloom_uri, cfg));
+ }
+ WT_ERR(__wt_lsm_meta_write(session, lsm_tree, cfg[0]));
+
+err: if (locked)
+ __wt_lsm_tree_writeunlock(session, lsm_tree);
+ __wt_lsm_tree_release(session, lsm_tree);
+ return (ret);
+}
+
+/*
* __wt_lsm_tree_drop --
* Drop an LSM tree.
*/
@@ -955,7 +994,7 @@ __wt_lsm_tree_rename(WT_SESSION_IMPL *session,
}
}
- WT_ERR(__wt_lsm_meta_write(session, lsm_tree));
+ WT_ERR(__wt_lsm_meta_write(session, lsm_tree, NULL));
locked = false;
__wt_lsm_tree_writeunlock(session, lsm_tree);
WT_ERR(__wt_metadata_remove(session, olduri));
@@ -1010,7 +1049,7 @@ __wt_lsm_tree_truncate(
WT_ERR(__wt_lsm_merge_update_tree(
session, lsm_tree, 0, lsm_tree->nchunks, chunk));
- WT_ERR(__wt_lsm_meta_write(session, lsm_tree));
+ WT_ERR(__wt_lsm_meta_write(session, lsm_tree, NULL));
locked = false;
__wt_lsm_tree_writeunlock(session, lsm_tree);
@@ -1102,7 +1141,6 @@ __wt_lsm_compact(WT_SESSION_IMPL *session, const char *name, bool *skipp)
WT_DECL_RET;
WT_LSM_CHUNK *chunk;
WT_LSM_TREE *lsm_tree;
- time_t begin, end;
uint64_t progress;
uint32_t i;
bool compacting, flushing, locked, ref;
@@ -1139,8 +1177,6 @@ __wt_lsm_compact(WT_SESSION_IMPL *session, const char *name, bool *skipp)
return (0);
}
- __wt_seconds(session, &begin);
-
/*
* Compacting has two distinct phases.
* 1. All in-memory chunks up to and including the current
@@ -1266,12 +1302,9 @@ __wt_lsm_compact(WT_SESSION_IMPL *session, const char *name, bool *skipp)
} else
break;
}
+ WT_ERR(__wt_session_compact_check_timeout(session));
__wt_sleep(1, 0);
- __wt_seconds(session, &end);
- if (session->compact->max_time > 0 &&
- session->compact->max_time < (uint64_t)(end - begin)) {
- WT_ERR(ETIMEDOUT);
- }
+
/*
* Push merge operations while they are still getting work
* done. If we are pushing merges, make sure they are
diff --git a/src/lsm/lsm_work_unit.c b/src/lsm/lsm_work_unit.c
index 66a57f15875..d9c185a3f58 100644
--- a/src/lsm/lsm_work_unit.c
+++ b/src/lsm/lsm_work_unit.c
@@ -172,7 +172,7 @@ __wt_lsm_work_switch(
*entryp = NULL;
if (entry->lsm_tree->need_switch) {
- WT_WITH_SCHEMA_LOCK(session, ret,
+ WT_WITH_SCHEMA_LOCK(session,
ret = __wt_lsm_tree_switch(session, entry->lsm_tree));
/* Failing to complete the switch is fine */
if (ret == EBUSY) {
@@ -346,8 +346,8 @@ __wt_lsm_checkpoint_chunk(WT_SESSION_IMPL *session,
* time, and our checkpoint operation should be very quick.
*/
WT_ERR(__wt_meta_track_on(session));
- WT_WITH_CHECKPOINT_LOCK(session, ret,
- WT_WITH_SCHEMA_LOCK(session, ret,
+ WT_WITH_CHECKPOINT_LOCK(session,
+ WT_WITH_SCHEMA_LOCK(session,
ret = __wt_schema_worker(
session, chunk->uri, __wt_checkpoint, NULL, NULL, 0)));
WT_TRET(__wt_meta_track_off(session, false, ret != 0));
@@ -364,7 +364,7 @@ __wt_lsm_checkpoint_chunk(WT_SESSION_IMPL *session,
/* Lock the tree, mark the chunk as on disk and update the metadata. */
__wt_lsm_tree_writelock(session, lsm_tree);
F_SET(chunk, WT_LSM_CHUNK_ONDISK);
- ret = __wt_lsm_meta_write(session, lsm_tree);
+ ret = __wt_lsm_meta_write(session, lsm_tree, NULL);
++lsm_tree->dsk_gen;
/* Update the throttle time. */
@@ -469,7 +469,7 @@ __lsm_bloom_create(WT_SESSION_IMPL *session,
/* Ensure the bloom filter is in the metadata. */
__wt_lsm_tree_writelock(session, lsm_tree);
F_SET(chunk, WT_LSM_CHUNK_BLOOM);
- ret = __wt_lsm_meta_write(session, lsm_tree);
+ ret = __wt_lsm_meta_write(session, lsm_tree, NULL);
++lsm_tree->dsk_gen;
__wt_lsm_tree_writeunlock(session, lsm_tree);
@@ -526,7 +526,7 @@ __lsm_drop_file(WT_SESSION_IMPL *session, const char *uri)
* results in the hot backup lock being taken when it updates the
* metadata (which would be too late to prevent our drop).
*/
- WT_WITH_SCHEMA_LOCK(session, ret,
+ WT_WITH_SCHEMA_LOCK(session,
ret = __wt_schema_drop(session, uri, drop_cfg));
if (ret == 0)
@@ -659,7 +659,7 @@ __wt_lsm_free_chunks(WT_SESSION_IMPL *session, WT_LSM_TREE *lsm_tree)
err: /* Flush the metadata unless the system is in panic */
if (flush_metadata && ret != WT_PANIC) {
__wt_lsm_tree_writelock(session, lsm_tree);
- WT_TRET(__wt_lsm_meta_write(session, lsm_tree));
+ WT_TRET(__wt_lsm_meta_write(session, lsm_tree, NULL));
__wt_lsm_tree_writeunlock(session, lsm_tree);
}
__lsm_unpin_chunks(session, &cookie);