diff options
Diffstat (limited to 'src/third_party/wiredtiger/src/include/btree.i')
-rw-r--r-- | src/third_party/wiredtiger/src/include/btree.i | 122 |
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); |