summaryrefslogtreecommitdiff
path: root/src/btree/col_modify.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/btree/col_modify.c')
-rw-r--r--src/btree/col_modify.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/btree/col_modify.c b/src/btree/col_modify.c
index 645d98d9c9b..fd60b12538a 100644
--- a/src/btree/col_modify.c
+++ b/src/btree/col_modify.c
@@ -25,6 +25,7 @@ __wt_col_modify(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt,
WT_INSERT_HEAD *ins_head, **ins_headp;
WT_ITEM _value;
WT_PAGE *page;
+ WT_PAGE_MODIFY *mod;
WT_UPDATE *old_upd, *upd;
size_t ins_size, upd_size;
u_int i, skipdepth;
@@ -60,6 +61,7 @@ __wt_col_modify(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt,
/* If we don't yet have a modify structure, we'll need one. */
WT_RET(__wt_page_modify_init(session, page));
+ mod = page->modify;
/*
* Delete, insert or update a column-store entry.
@@ -105,17 +107,17 @@ __wt_col_modify(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt,
/* Allocate the append/update list reference as necessary. */
if (append) {
WT_PAGE_ALLOC_AND_SWAP(session,
- page, page->modify->mod_append, ins_headp, 1);
- ins_headp = &page->modify->mod_append[0];
+ page, mod->mod_append, ins_headp, 1);
+ ins_headp = &mod->mod_append[0];
} else if (page->type == WT_PAGE_COL_FIX) {
WT_PAGE_ALLOC_AND_SWAP(session,
- page, page->modify->mod_update, ins_headp, 1);
- ins_headp = &page->modify->mod_update[0];
+ page, mod->mod_update, ins_headp, 1);
+ ins_headp = &mod->mod_update[0];
} else {
WT_PAGE_ALLOC_AND_SWAP(session,
- page, page->modify->mod_update, ins_headp,
+ page, mod->mod_update, ins_headp,
page->pg_var_entries);
- ins_headp = &page->modify->mod_update[cbt->slot];
+ ins_headp = &mod->mod_update[cbt->slot];
}
/* Allocate the WT_INSERT_HEAD structure as necessary. */
@@ -135,6 +137,14 @@ __wt_col_modify(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt,
cbt->ins_head = ins_head;
cbt->ins = ins;
+ /*
+ * Check for insert split and checkpoint races in column-store:
+ * it's easy (as opposed to in row-store) and a difficult bug to
+ * otherwise diagnose.
+ */
+ WT_ASSERT(session, mod->mod_split_recno == WT_RECNO_OOB ||
+ (recno != WT_RECNO_OOB && mod->mod_split_recno > recno));
+
if (upd_arg == NULL) {
WT_ERR(
__wt_update_alloc(session, value, &upd, &upd_size));