diff --git a/src/iocore/cache/Stripe.cc b/src/iocore/cache/Stripe.cc index 825efe4c531..18518571fed 100644 --- a/src/iocore/cache/Stripe.cc +++ b/src/iocore/cache/Stripe.cc @@ -32,6 +32,7 @@ #include "tscore/ink_memory.h" #include +#include #include using CacheHTTPInfo = HTTPInfo; @@ -97,6 +98,18 @@ Stripe::Stripe(CacheDisk *disk, off_t blocks, off_t dir_skip, int avg_obj_size, this->_init_directory(this->dirlen(), this->headerlen(), DIRECTORY_FOOTER_SIZE); } +Stripe::~Stripe() +{ + if (this->directory.raw_dir != nullptr) { + if (this->_dir_uses_hugepages) { + ats_free_hugepage(this->directory.raw_dir, this->dirlen()); + } else { + ats_free(this->directory.raw_dir); + } + this->directory.raw_dir = nullptr; + } +} + void Stripe::_init_hash_text(CacheDisk const *disk, off_t blocks, off_t dir_skip) { @@ -154,6 +167,9 @@ Stripe::_init_directory(std::size_t directory_size, int header_size, int footer_ directory_size, (long long)this->len, percent(directory_size, this->len)); if (ats_hugepage_enabled()) { this->directory.raw_dir = static_cast(ats_alloc_hugepage(directory_size)); + if (this->directory.raw_dir != nullptr) { + this->_dir_uses_hugepages = true; + } } if (nullptr == this->directory.raw_dir) { this->directory.raw_dir = static_cast(ats_memalign(ats_pagesize(), directory_size)); diff --git a/src/iocore/cache/Stripe.h b/src/iocore/cache/Stripe.h index 7cf6f02482b..2a1465964a9 100644 --- a/src/iocore/cache/Stripe.h +++ b/src/iocore/cache/Stripe.h @@ -96,6 +96,8 @@ class Stripe */ Stripe(CacheDisk *disk, off_t blocks, off_t dir_skip, int avg_obj_size = -1, int fragment_size = -1); + ~Stripe(); + int dir_check(); uint32_t round_to_approx_size(uint32_t l) const; @@ -150,6 +152,8 @@ class Stripe bool flush_aggregate_write_buffer(int fd); private: + bool _dir_uses_hugepages{false}; + void _init_hash_text(CacheDisk const *disk, off_t blocks, off_t dir_skip); void _init_data(off_t store_block_size, int avg_obj_size = -1); void _init_data_internal(int avg_obj_size = -1); // Defaults to cache_config_min_average_object_size;