This is an automated email from the ASF dual-hosted git repository.
apitrou pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/master by this push:
new 29143259ec ARROW-17800: [C++] Fix failures in jemalloc stats tests
(#14194)
29143259ec is described below
commit 29143259ecc63a9436482f65a6e5e0757329be73
Author: Antoine Pitrou <[email protected]>
AuthorDate: Wed Sep 21 22:07:09 2022 +0200
ARROW-17800: [C++] Fix failures in jemalloc stats tests (#14194)
- Provide compatibility for 32-bit platforms
- Avoid memory leak in tests
- Make checks less strict
Authored-by: Antoine Pitrou <[email protected]>
Signed-off-by: Antoine Pitrou <[email protected]>
---
cpp/src/arrow/memory_pool_jemalloc.cc | 28 +++++++++++++++++++++-------
cpp/src/arrow/memory_pool_test.cc | 23 ++++++++++++++---------
2 files changed, 35 insertions(+), 16 deletions(-)
diff --git a/cpp/src/arrow/memory_pool_jemalloc.cc
b/cpp/src/arrow/memory_pool_jemalloc.cc
index 03d2b28ee3..c7d73c8491 100644
--- a/cpp/src/arrow/memory_pool_jemalloc.cc
+++ b/cpp/src/arrow/memory_pool_jemalloc.cc
@@ -155,9 +155,8 @@ Status jemalloc_set_decay_ms(int ms) {
#undef RETURN_IF_JEMALLOC_ERROR
Result<int64_t> jemalloc_get_stat(const char* name) {
- size_t sz = sizeof(uint64_t);
+ size_t sz;
int err;
- uint64_t value;
// Update the statistics cached by mallctl.
if (std::strcmp(name, "stats.allocated") == 0 ||
@@ -167,16 +166,31 @@ Result<int64_t> jemalloc_get_stat(const char* name) {
std::strcmp(name, "stats.mapped") == 0 ||
std::strcmp(name, "stats.retained") == 0) {
uint64_t epoch;
+ sz = sizeof(epoch);
mallctl("epoch", &epoch, &sz, &epoch, sz);
}
- err = mallctl(name, &value, &sz, nullptr, 0);
-
- if (err) {
- return arrow::internal::IOErrorFromErrno(err, "Failed retrieving ", &name);
+ // Depending on the stat being queried and on the platform, we could need
+ // to pass a uint32_t or uint64_t pointer. Try both.
+ {
+ uint64_t value = 0;
+ sz = sizeof(value);
+ err = mallctl(name, &value, &sz, nullptr, 0);
+ if (!err) {
+ return value;
+ }
+ }
+ // EINVAL means the given value length (`sz`) was incorrect.
+ if (err == EINVAL) {
+ uint32_t value = 0;
+ sz = sizeof(value);
+ err = mallctl(name, &value, &sz, nullptr, 0);
+ if (!err) {
+ return value;
+ }
}
- return value;
+ return arrow::internal::IOErrorFromErrno(err, "Failed retrieving ", &name);
}
Status jemalloc_peak_reset() {
diff --git a/cpp/src/arrow/memory_pool_test.cc
b/cpp/src/arrow/memory_pool_test.cc
index 5ac14a44b9..61e0abf3e6 100644
--- a/cpp/src/arrow/memory_pool_test.cc
+++ b/cpp/src/arrow/memory_pool_test.cc
@@ -180,6 +180,7 @@ TEST(Jemalloc, GetAllocationStats) {
metadata0, resident0, mapped0, retained0;
int64_t thread_allocated, thread_deallocated, thread_peak_read,
thread_allocated0,
thread_deallocated0, thread_peak_read0;
+
MemoryPool* pool = nullptr;
ABORT_NOT_OK(jemalloc_memory_pool(&pool));
ASSERT_EQ("jemalloc", pool->backend_name());
@@ -211,14 +212,15 @@ TEST(Jemalloc, GetAllocationStats) {
ASSERT_OK_AND_ASSIGN(thread_allocated,
jemalloc_get_stat("thread.allocated"));
ASSERT_OK_AND_ASSIGN(thread_deallocated,
jemalloc_get_stat("thread.deallocated"));
ASSERT_OK_AND_ASSIGN(thread_peak_read,
jemalloc_get_stat("thread.peak.read"));
+ pool->Free(data, 1023);
// Check allocated stats pre-allocation
- ASSERT_NEAR(allocated0, 120000, 100000);
- ASSERT_NEAR(active0, 75000, 70000);
- ASSERT_NEAR(metadata0, 3000000, 1000000);
- ASSERT_NEAR(resident0, 3000000, 1000000);
- ASSERT_NEAR(mapped0, 6500000, 1000000);
- ASSERT_NEAR(retained0, 1500000, 2000000);
+ ASSERT_GT(allocated0, 0);
+ ASSERT_GT(active0, 0);
+ ASSERT_GT(metadata0, 0);
+ ASSERT_GT(resident0, 0);
+ ASSERT_GT(mapped0, 0);
+ ASSERT_GE(retained0, 0);
// Check allocated stats change due to allocation
ASSERT_NEAR(allocated - allocated0, 70000, 50000);
@@ -233,13 +235,16 @@ TEST(Jemalloc, GetAllocationStats) {
ASSERT_EQ(thread_deallocated - thread_deallocated0, 1280);
// Resetting thread peak read metric
- ASSERT_OK(pool->Allocate(12560, &data));
+ ASSERT_OK(pool->Allocate(100000, &data));
ASSERT_OK_AND_ASSIGN(thread_peak_read,
jemalloc_get_stat("thread.peak.read"));
- ASSERT_NEAR(thread_peak_read, 15616, 1000);
+ ASSERT_NEAR(thread_peak_read, 100000, 50000);
+ pool->Free(data, 100000);
ASSERT_OK(jemalloc_peak_reset());
+
ASSERT_OK(pool->Allocate(1256, &data));
ASSERT_OK_AND_ASSIGN(thread_peak_read,
jemalloc_get_stat("thread.peak.read"));
- ASSERT_NEAR(thread_peak_read, 1280, 100);
+ ASSERT_NEAR(thread_peak_read, 1256, 100);
+ pool->Free(data, 1256);
// Print statistics to stderr
ASSERT_OK(jemalloc_stats_print("J"));