summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/src/include/btree.i
diff options
context:
space:
mode:
Diffstat (limited to 'src/third_party/wiredtiger/src/include/btree.i')
-rw-r--r--src/third_party/wiredtiger/src/include/btree.i122
1 files changed, 102 insertions, 20 deletions
diff --git a/src/third_party/wiredtiger/src/include/btree.i b/src/third_party/wiredtiger/src/include/btree.i
index 87a6c66dba2..8c5d63aa911 100644
--- a/src/third_party/wiredtiger/src/include/btree.i
+++ b/src/third_party/wiredtiger/src/include/btree.i
@@ -179,6 +179,22 @@ __wt_btree_dirty_leaf_inuse(WT_SESSION_IMPL *session)
}
/*
+ * __wt_btree_bytes_updates --
+ * Return the number of bytes in use by dirty leaf pages.
+ */
+static inline uint64_t
+__wt_btree_bytes_updates(WT_SESSION_IMPL *session)
+{
+ WT_BTREE *btree;
+ WT_CACHE *cache;
+
+ btree = S2BT(session);
+ cache = S2C(session)->cache;
+
+ return (__wt_cache_bytes_plus_overhead(cache, btree->bytes_updates));
+}
+
+/*
* __wt_cache_page_inmem_incr --
* Increment a page's memory footprint in the cache.
*/
@@ -201,20 +217,29 @@ __wt_cache_page_inmem_incr(WT_SESSION_IMPL *session, WT_PAGE *page, size_t size)
*/
(void)__wt_atomic_add64(&cache->bytes_inmem, size);
(void)__wt_atomic_add64(&btree->bytes_inmem, size);
+ if (WT_PAGE_IS_INTERNAL(page)) {
+ (void)__wt_atomic_add64(&cache->bytes_internal, size);
+ (void)__wt_atomic_add64(&btree->bytes_internal, size);
+ }
(void)__wt_atomic_addsize(&page->memory_footprint, size);
- if (__wt_page_is_modified(page)) {
- if (WT_PAGE_IS_INTERNAL(page)) {
- (void)__wt_atomic_add64(&cache->bytes_dirty_intl, size);
- (void)__wt_atomic_add64(&btree->bytes_dirty_intl, size);
- } else if (!btree->lsm_primary) {
- (void)__wt_atomic_add64(&cache->bytes_dirty_leaf, size);
- (void)__wt_atomic_add64(&btree->bytes_dirty_leaf, size);
+
+ if (page->modify != NULL) {
+ if (!WT_PAGE_IS_INTERNAL(page) && !btree->lsm_primary) {
+ (void)__wt_atomic_add64(&cache->bytes_updates, size);
+ (void)__wt_atomic_add64(&btree->bytes_updates, size);
+ (void)__wt_atomic_addsize(&page->modify->bytes_updates, size);
+ }
+ if (__wt_page_is_modified(page)) {
+ if (WT_PAGE_IS_INTERNAL(page)) {
+ (void)__wt_atomic_add64(&cache->bytes_dirty_intl, size);
+ (void)__wt_atomic_add64(&btree->bytes_dirty_intl, size);
+ } else if (!btree->lsm_primary) {
+ (void)__wt_atomic_add64(&cache->bytes_dirty_leaf, size);
+ (void)__wt_atomic_add64(&btree->bytes_dirty_leaf, size);
+ }
+ (void)__wt_atomic_addsize(&page->modify->bytes_dirty, size);
}
- (void)__wt_atomic_addsize(&page->modify->bytes_dirty, size);
}
- /* Track internal size in cache. */
- if (WT_PAGE_IS_INTERNAL(page))
- (void)__wt_atomic_add64(&cache->bytes_internal, size);
}
/*
@@ -327,14 +352,48 @@ __wt_cache_page_byte_dirty_decr(WT_SESSION_IMPL *session, WT_PAGE *page, size_t
}
/*
+ * __wt_cache_page_byte_updates_decr --
+ * Decrement the page's update byte count, guarding from underflow.
+ */
+static inline void
+__wt_cache_page_byte_updates_decr(WT_SESSION_IMPL *session, WT_PAGE *page, size_t size)
+{
+ WT_BTREE *btree;
+ WT_CACHE *cache;
+ size_t decr, orig;
+ int i;
+
+ btree = S2BT(session);
+ cache = S2C(session)->cache;
+ decr = 0; /* [-Wconditional-uninitialized] */
+
+ WT_ASSERT(session, !WT_PAGE_IS_INTERNAL(page) && !btree->lsm_primary && page->modify != NULL);
+
+ /* See above for why this can race. */
+ for (i = 0; i < 5; ++i) {
+ WT_ORDERED_READ(orig, page->modify->bytes_updates);
+ decr = WT_MIN(size, orig);
+ if (__wt_atomic_cassize(&page->modify->bytes_updates, orig, orig - decr))
+ break;
+ }
+
+ if (i == 5)
+ return;
+
+ __wt_cache_decr_check_uint64(session, &btree->bytes_updates, decr, "WT_BTREE.bytes_updates");
+ __wt_cache_decr_check_uint64(session, &cache->bytes_updates, decr, "WT_CACHE.bytes_updates");
+}
+/*
* __wt_cache_page_inmem_decr --
* Decrement a page's memory footprint in the cache.
*/
static inline void
__wt_cache_page_inmem_decr(WT_SESSION_IMPL *session, WT_PAGE *page, size_t size)
{
+ WT_BTREE *btree;
WT_CACHE *cache;
+ btree = S2BT(session);
cache = S2C(session)->cache;
WT_ASSERT(session, size < WT_EXABYTE);
@@ -344,15 +403,19 @@ __wt_cache_page_inmem_decr(WT_SESSION_IMPL *session, WT_PAGE *page, size_t size)
* threads that are trying to increase the sizes concurrently.
*/
__wt_cache_decr_check_size(session, &page->memory_footprint, size, "WT_PAGE.memory_footprint");
- __wt_cache_decr_check_uint64(
- session, &S2BT(session)->bytes_inmem, size, "WT_BTREE.bytes_inmem");
+ __wt_cache_decr_check_uint64(session, &btree->bytes_inmem, size, "WT_BTREE.bytes_inmem");
__wt_cache_decr_check_uint64(session, &cache->bytes_inmem, size, "WT_CACHE.bytes_inmem");
+ if (page->modify != NULL && !WT_PAGE_IS_INTERNAL(page) && !btree->lsm_primary)
+ __wt_cache_page_byte_updates_decr(session, page, size);
if (__wt_page_is_modified(page))
__wt_cache_page_byte_dirty_decr(session, page, size);
/* Track internal size in cache. */
- if (WT_PAGE_IS_INTERNAL(page))
+ if (WT_PAGE_IS_INTERNAL(page)) {
+ __wt_cache_decr_check_uint64(
+ session, &btree->bytes_internal, size, "WT_BTREE.bytes_internal");
__wt_cache_decr_check_uint64(
session, &cache->bytes_internal, size, "WT_CACHE.bytes_internal");
+ }
}
/*
@@ -381,11 +444,11 @@ __wt_cache_dirty_incr(WT_SESSION_IMPL *session, WT_PAGE *page)
(void)__wt_atomic_add64(&cache->bytes_dirty_intl, size);
(void)__wt_atomic_add64(&btree->bytes_dirty_intl, size);
} else {
- (void)__wt_atomic_add64(&cache->pages_dirty_leaf, 1);
if (!btree->lsm_primary) {
(void)__wt_atomic_add64(&cache->bytes_dirty_leaf, size);
(void)__wt_atomic_add64(&btree->bytes_dirty_leaf, size);
}
+ (void)__wt_atomic_add64(&cache->pages_dirty_leaf, 1);
}
(void)__wt_atomic_add64(&cache->bytes_dirty_total, size);
(void)__wt_atomic_add64(&btree->bytes_dirty_total, size);
@@ -420,13 +483,18 @@ __wt_cache_dirty_decr(WT_SESSION_IMPL *session, WT_PAGE *page)
* Decrement a page image's size to the cache.
*/
static inline void
-__wt_cache_page_image_decr(WT_SESSION_IMPL *session, uint32_t size)
+__wt_cache_page_image_decr(WT_SESSION_IMPL *session, WT_PAGE *page)
{
WT_CACHE *cache;
cache = S2C(session)->cache;
- __wt_cache_decr_check_uint64(session, &cache->bytes_image, size, "WT_CACHE.image_inmem");
+ if (WT_PAGE_IS_INTERNAL(page))
+ __wt_cache_decr_check_uint64(
+ session, &cache->bytes_image_intl, page->dsk->mem_size, "WT_CACHE.bytes_image");
+ else
+ __wt_cache_decr_check_uint64(
+ session, &cache->bytes_image_leaf, page->dsk->mem_size, "WT_CACHE.bytes_image");
}
/*
@@ -434,12 +502,15 @@ __wt_cache_page_image_decr(WT_SESSION_IMPL *session, uint32_t size)
* Increment a page image's size to the cache.
*/
static inline void
-__wt_cache_page_image_incr(WT_SESSION_IMPL *session, uint32_t size)
+__wt_cache_page_image_incr(WT_SESSION_IMPL *session, WT_PAGE *page)
{
WT_CACHE *cache;
cache = S2C(session)->cache;
- (void)__wt_atomic_add64(&cache->bytes_image, size);
+ if (WT_PAGE_IS_INTERNAL(page))
+ (void)__wt_atomic_add64(&cache->bytes_image_intl, page->dsk->mem_size);
+ else
+ (void)__wt_atomic_add64(&cache->bytes_image_leaf, page->dsk->mem_size);
}
/*
@@ -464,9 +535,12 @@ __wt_cache_page_evict(WT_SESSION_IMPL *session, WT_PAGE *page)
session, &cache->bytes_inmem, page->memory_footprint, "WT_CACHE.bytes_inmem");
/* Update the bytes_internal value to reflect the eviction */
- if (WT_PAGE_IS_INTERNAL(page))
+ if (WT_PAGE_IS_INTERNAL(page)) {
+ __wt_cache_decr_check_uint64(
+ session, &btree->bytes_internal, page->memory_footprint, "WT_BTREE.bytes_internal");
__wt_cache_decr_check_uint64(
session, &cache->bytes_internal, page->memory_footprint, "WT_CACHE.bytes_internal");
+ }
/* Update the cache's dirty-byte count. */
if (modify != NULL && modify->bytes_dirty != 0) {
@@ -483,6 +557,14 @@ __wt_cache_page_evict(WT_SESSION_IMPL *session, WT_PAGE *page)
}
}
+ /* Update the cache's updates-byte count. */
+ if (modify != NULL) {
+ __wt_cache_decr_check_uint64(
+ session, &btree->bytes_updates, modify->bytes_updates, "WT_BTREE.bytes_updates");
+ __wt_cache_decr_check_uint64(
+ session, &cache->bytes_updates, modify->bytes_updates, "WT_CACHE.bytes_updates");
+ }
+
/* Update bytes and pages evicted. */
(void)__wt_atomic_add64(&cache->bytes_evict, page->memory_footprint);
(void)__wt_atomic_addv64(&cache->pages_evicted, 1);