diff options
Diffstat (limited to 'src/third_party/wiredtiger/src/btree')
-rw-r--r-- | src/third_party/wiredtiger/src/btree/bt_curnext.c | 10 | ||||
-rw-r--r-- | src/third_party/wiredtiger/src/btree/bt_curprev.c | 10 | ||||
-rw-r--r-- | src/third_party/wiredtiger/src/btree/bt_debug.c | 16 | ||||
-rw-r--r-- | src/third_party/wiredtiger/src/btree/bt_page.c | 27 | ||||
-rw-r--r-- | src/third_party/wiredtiger/src/btree/bt_sync.c | 19 |
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, ¤t)); /* @@ -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; } |