Skip to content

Commit 5d19907

Browse files
committed
Tries to fix an ASAN warning on exit
1 parent 6818e25 commit 5d19907

File tree

4 files changed

+23
-8
lines changed

4 files changed

+23
-8
lines changed

src/iocore/cache/P_CacheDir.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,8 @@ struct Directory {
277277
StripteHeaderFooter *footer{};
278278
int segments{};
279279
off_t buckets{};
280+
size_t raw_dir_size{0}; // size of raw_dir allocation (for freeing hugepages)
281+
bool raw_dir_huge{false}; // true if raw_dir was allocated with hugepages
280282

281283
/* Total number of dir entries.
282284
*/

src/iocore/cache/Stripe.cc

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,16 +154,33 @@ Stripe::_init_directory(std::size_t directory_size, int header_size, int footer_
154154
directory_size, (long long)this->len, percent(directory_size, this->len));
155155
if (ats_hugepage_enabled()) {
156156
this->directory.raw_dir = static_cast<char *>(ats_alloc_hugepage(directory_size));
157+
if (this->directory.raw_dir != nullptr) {
158+
this->directory.raw_dir_huge = true;
159+
}
157160
}
158161
if (nullptr == this->directory.raw_dir) {
159-
this->directory.raw_dir = static_cast<char *>(ats_memalign(ats_pagesize(), directory_size));
162+
this->directory.raw_dir = static_cast<char *>(ats_memalign(ats_pagesize(), directory_size));
163+
this->directory.raw_dir_huge = false;
160164
}
161-
this->directory.dir = reinterpret_cast<Dir *>(this->directory.raw_dir + header_size);
162-
this->directory.header = reinterpret_cast<StripteHeaderFooter *>(this->directory.raw_dir);
165+
this->directory.raw_dir_size = directory_size;
166+
this->directory.dir = reinterpret_cast<Dir *>(this->directory.raw_dir + header_size);
167+
this->directory.header = reinterpret_cast<StripteHeaderFooter *>(this->directory.raw_dir);
163168
std::size_t const footer_offset{directory_size - static_cast<std::size_t>(footer_size)};
164169
this->directory.footer = reinterpret_cast<StripteHeaderFooter *>(this->directory.raw_dir + footer_offset);
165170
}
166171

172+
Stripe::~Stripe()
173+
{
174+
if (this->directory.raw_dir != nullptr) {
175+
if (this->directory.raw_dir_huge) {
176+
ats_free_hugepage(this->directory.raw_dir, this->directory.raw_dir_size);
177+
} else {
178+
ats_free(this->directory.raw_dir);
179+
}
180+
this->directory.raw_dir = nullptr;
181+
}
182+
}
183+
167184
int
168185
Stripe::dir_check()
169186
{

src/iocore/cache/Stripe.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ class Stripe
9797
* @see START_POS
9898
*/
9999
Stripe(CacheDisk *disk, off_t blocks, off_t dir_skip, int avg_obj_size = -1, int fragment_size = -1);
100+
virtual ~Stripe();
100101

101102
int dir_check();
102103

src/iocore/cache/unit_tests/test_Stripe.cc

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,6 @@ TEST_CASE("The behavior of StripeSM::add_writer.")
191191
CHECK(true == result);
192192
}
193193
}
194-
195-
ats_free(stripe.directory.raw_dir);
196194
}
197195

198196
// This test case demonstrates how to set up a StripeSM and make
@@ -301,8 +299,6 @@ TEST_CASE("aggWrite behavior with f.evacuator unset")
301299

302300
cache_config_enable_checksum = false;
303301
}
304-
305-
ats_free(stripe.directory.raw_dir);
306302
}
307303

308304
// When f.evacuator is set, vc.buf must contain a Doc object including headers
@@ -400,5 +396,4 @@ TEST_CASE("aggWrite behavior with f.evacuator set")
400396
}
401397

402398
delete[] source;
403-
ats_free(stripe.directory.raw_dir);
404399
}

0 commit comments

Comments
 (0)