summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/src/btree
diff options
context:
space:
mode:
Diffstat (limited to 'src/third_party/wiredtiger/src/btree')
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_curnext.c10
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_curprev.c10
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_debug.c16
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_page.c27
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_sync.c19
5 files changed, 66 insertions, 16 deletions
diff --git a/src/third_party/wiredtiger/src/btree/bt_curnext.c b/src/third_party/wiredtiger/src/btree/bt_curnext.c
index 7e68ff39870..fa2db5a02e1 100644
--- a/src/third_party/wiredtiger/src/btree/bt_curnext.c
+++ b/src/third_party/wiredtiger/src/btree/bt_curnext.c
@@ -941,10 +941,12 @@ __wt_btcur_next_prefix(WT_CURSOR_BTREE *cbt, WT_ITEM *prefix, bool truncating)
done:
err:
- if (total_skipped < 100)
- WT_STAT_CONN_DATA_INCR(session, cursor_next_skip_lt_100);
- else
- WT_STAT_CONN_DATA_INCR(session, cursor_next_skip_ge_100);
+ if (total_skipped != 0) {
+ if (total_skipped < 100)
+ WT_STAT_CONN_DATA_INCR(session, cursor_next_skip_lt_100);
+ else
+ WT_STAT_CONN_DATA_INCR(session, cursor_next_skip_ge_100);
+ }
WT_STAT_CONN_DATA_INCRV(session, cursor_next_skip_total, total_skipped);
diff --git a/src/third_party/wiredtiger/src/btree/bt_curprev.c b/src/third_party/wiredtiger/src/btree/bt_curprev.c
index 73edc3e1aa3..3db52201c9c 100644
--- a/src/third_party/wiredtiger/src/btree/bt_curprev.c
+++ b/src/third_party/wiredtiger/src/btree/bt_curprev.c
@@ -873,10 +873,12 @@ __wt_btcur_prev(WT_CURSOR_BTREE *cbt, bool truncating)
done:
err:
- if (total_skipped < 100)
- WT_STAT_CONN_DATA_INCR(session, cursor_prev_skip_lt_100);
- else
- WT_STAT_CONN_DATA_INCR(session, cursor_prev_skip_ge_100);
+ if (total_skipped != 0) {
+ if (total_skipped < 100)
+ WT_STAT_CONN_DATA_INCR(session, cursor_next_skip_lt_100);
+ else
+ WT_STAT_CONN_DATA_INCR(session, cursor_next_skip_ge_100);
+ }
WT_STAT_CONN_DATA_INCRV(session, cursor_prev_skip_total, total_skipped);
diff --git a/src/third_party/wiredtiger/src/btree/bt_debug.c b/src/third_party/wiredtiger/src/btree/bt_debug.c
index af9ead0dbec..d7b77055ee8 100644
--- a/src/third_party/wiredtiger/src/btree/bt_debug.c
+++ b/src/third_party/wiredtiger/src/btree/bt_debug.c
@@ -545,6 +545,7 @@ __debug_cell_int(WT_DBG *ds, const WT_PAGE_HEADER *dsk, WT_CELL_UNPACK_ADDR *unp
{
WT_DECL_ITEM(buf);
WT_DECL_RET;
+ WT_PAGE_DELETED *page_del;
WT_SESSION_IMPL *session;
char time_string[WT_TIME_STRING_SIZE];
@@ -562,6 +563,14 @@ __debug_cell_int(WT_DBG *ds, const WT_PAGE_HEADER *dsk, WT_CELL_UNPACK_ADDR *unp
/* Dump timestamps and addresses. */
switch (unpack->raw) {
case WT_CELL_ADDR_DEL:
+ /* Dump the deleted pages transaction ID, commit timestamp, and durable timestamp. */
+ if (F_ISSET(dsk, WT_PAGE_FT_UPDATE)) {
+ page_del = &unpack->page_del;
+ WT_RET(ds->f(ds, ", page_del : %s",
+ __wt_time_point_to_string(
+ page_del->timestamp, page_del->durable_timestamp, page_del->txnid, time_string)));
+ }
+ /* FALLTHROUGH */
case WT_CELL_ADDR_INT:
case WT_CELL_ADDR_LEAF:
case WT_CELL_ADDR_LEAF_NO:
@@ -1621,6 +1630,7 @@ static int
__debug_ref(WT_DBG *ds, WT_REF *ref)
{
WT_ADDR_COPY addr;
+ WT_PAGE_DELETED *page_del;
WT_SESSION_IMPL *session;
char time_string[WT_TIME_STRING_SIZE];
@@ -1638,6 +1648,12 @@ __debug_ref(WT_DBG *ds, WT_REF *ref)
if (__wt_ref_addr_copy(session, ref, &addr) && !WT_TIME_AGGREGATE_IS_EMPTY(&addr.ta))
WT_RET(ds->f(ds, ", %s, %s", __wt_time_aggregate_to_string(&addr.ta, time_string),
__wt_addr_string(session, addr.addr, addr.size, ds->t1)));
+ if (ref->page_del != NULL) {
+ page_del = ref->page_del;
+ WT_RET(ds->f(ds, ", page_del : %s",
+ __wt_time_point_to_string(
+ page_del->timestamp, page_del->durable_timestamp, page_del->txnid, time_string)));
+ }
return (ds->f(ds, "\n"));
}
#endif
diff --git a/src/third_party/wiredtiger/src/btree/bt_page.c b/src/third_party/wiredtiger/src/btree/bt_page.c
index d4de7ab603d..e6ca2a8cb4a 100644
--- a/src/third_party/wiredtiger/src/btree/bt_page.c
+++ b/src/third_party/wiredtiger/src/btree/bt_page.c
@@ -638,6 +638,10 @@ static int
__inmem_col_int_init_ref(WT_SESSION_IMPL *session, WT_REF *ref, WT_PAGE *home, uint32_t hint,
void *addr, uint64_t recno, bool internal, bool deleted, WT_PAGE_DELETED *page_del)
{
+ WT_BTREE *btree;
+
+ btree = S2BT(session);
+
ref->home = home;
ref->pindex_hint = hint;
ref->addr = addr;
@@ -657,6 +661,16 @@ __inmem_col_int_init_ref(WT_SESSION_IMPL *session, WT_REF *ref, WT_PAGE *home, u
*ref->page_del = *page_del;
}
WT_REF_SET_STATE(ref, WT_REF_DELETED);
+
+ /*
+ * If the tree is already dirty and so will be written, mark the page dirty. (We want to
+ * free the deleted pages, but if the handle is read-only or if the application never
+ * modifies the tree, we're not able to do so.)
+ */
+ if (btree->modified) {
+ WT_RET(__wt_page_modify_init(session, home));
+ __wt_page_only_modify_set(session, home);
+ }
}
return (0);
@@ -811,6 +825,7 @@ __inmem_col_var(
static int
__inmem_row_int(WT_SESSION_IMPL *session, WT_PAGE *page, size_t *sizep)
{
+ WT_BTREE *btree;
WT_CELL_UNPACK_ADDR unpack;
WT_DECL_ITEM(current);
WT_DECL_RET;
@@ -819,6 +834,8 @@ __inmem_row_int(WT_SESSION_IMPL *session, WT_PAGE *page, size_t *sizep)
uint32_t hint;
bool overflow_keys;
+ btree = S2BT(session);
+
WT_RET(__wt_scr_alloc(session, 0, &current));
/*
@@ -880,6 +897,16 @@ __inmem_row_int(WT_SESSION_IMPL *session, WT_PAGE *page, size_t *sizep)
}
WT_REF_SET_STATE(ref, WT_REF_DELETED);
+ /*
+ * If the tree is already dirty and so will be written, mark the page dirty. (We want to
+ * free the deleted pages, but if the handle is read-only or if the application never
+ * modifies the tree, we're not able to do so.)
+ */
+ if (btree->modified) {
+ WT_ERR(__wt_page_modify_init(session, page));
+ __wt_page_only_modify_set(session, page);
+ }
+
ref->addr = unpack.cell;
++refp;
break;
diff --git a/src/third_party/wiredtiger/src/btree/bt_sync.c b/src/third_party/wiredtiger/src/btree/bt_sync.c
index 656525335d7..abb1ee86a52 100644
--- a/src/third_party/wiredtiger/src/btree/bt_sync.c
+++ b/src/third_party/wiredtiger/src/btree/bt_sync.c
@@ -136,20 +136,22 @@ __sync_delete_obsolete_ref(WT_SESSION_IMPL *session, WT_REF *ref)
/* Ignore root pages as they can never be deleted. */
if (__wt_ref_is_root(ref)) {
- __wt_verbose(session, WT_VERB_CHECKPOINT_CLEANUP, "%p: skipping root page", (void *)ref);
+ __wt_verbose_debug2(
+ session, WT_VERB_CHECKPOINT_CLEANUP, "%p: skipping root page", (void *)ref);
return (0);
}
/* Ignore internal pages, these are taken care of during reconciliation. */
if (F_ISSET(ref, WT_REF_FLAG_INTERNAL)) {
- __wt_verbose(session, WT_VERB_CHECKPOINT_CLEANUP,
+ __wt_verbose_debug2(session, WT_VERB_CHECKPOINT_CLEANUP,
"%p: skipping internal page with parent: %p", (void *)ref, (void *)ref->home);
return (0);
}
/* Fast-check, ignore deleted pages. */
if (ref->state == WT_REF_DELETED) {
- __wt_verbose(session, WT_VERB_CHECKPOINT_CLEANUP, "%p: skipping deleted page", (void *)ref);
+ __wt_verbose_debug2(
+ session, WT_VERB_CHECKPOINT_CLEANUP, "%p: skipping deleted page", (void *)ref);
return (0);
}
@@ -191,7 +193,7 @@ __sync_delete_obsolete_ref(WT_SESSION_IMPL *session, WT_REF *ref)
} else
WT_REF_UNLOCK(ref, previous_state);
- __wt_verbose(session, WT_VERB_CHECKPOINT_CLEANUP,
+ __wt_verbose_debug2(session, WT_VERB_CHECKPOINT_CLEANUP,
"%p on-disk page obsolete check: %s"
"obsolete, stop time point %s",
(void *)ref, obsolete ? "" : "not ",
@@ -206,7 +208,7 @@ __sync_delete_obsolete_ref(WT_SESSION_IMPL *session, WT_REF *ref)
* they might have split or been deleted while we were locking the WT_REF.
*/
if (previous_state != WT_REF_MEM) {
- __wt_verbose(session, WT_VERB_CHECKPOINT_CLEANUP, "%p: skipping page", (void *)ref);
+ __wt_verbose_debug2(session, WT_VERB_CHECKPOINT_CLEANUP, "%p: skipping page", (void *)ref);
return (0);
}
@@ -289,7 +291,7 @@ __sync_delete_obsolete_ref(WT_SESSION_IMPL *session, WT_REF *ref)
WT_STAT_CONN_DATA_INCR(session, cc_pages_evict);
}
- __wt_verbose(session, WT_VERB_CHECKPOINT_CLEANUP,
+ __wt_verbose_debug2(session, WT_VERB_CHECKPOINT_CLEANUP,
"%p in-memory page obsolete check: %s %s"
"obsolete, stop time point %s",
(void *)ref, tag, obsolete ? "" : "not ",
@@ -313,7 +315,7 @@ __sync_ref_int_obsolete_cleanup(WT_SESSION_IMPL *session, WT_REF *parent)
WT_REF *ref;
uint32_t slot;
- __wt_verbose(session, WT_VERB_CHECKPOINT_CLEANUP,
+ __wt_verbose_debug2(session, WT_VERB_CHECKPOINT_CLEANUP,
"%p: traversing the internal page %p for obsolete child pages", (void *)parent,
(void *)parent->page);
@@ -387,7 +389,8 @@ __sync_page_skip(
* timestamp.
*/
if (addr.type == WT_ADDR_LEAF_NO || addr.ta.newest_stop_durable_ts == WT_TS_NONE) {
- __wt_verbose(session, WT_VERB_CHECKPOINT_CLEANUP, "%p: page walk skipped", (void *)ref);
+ __wt_verbose_debug2(
+ session, WT_VERB_CHECKPOINT_CLEANUP, "%p: page walk skipped", (void *)ref);
WT_STAT_CONN_DATA_INCR(session, cc_pages_walk_skipped);
*skipp = true;
}