Merge pull request #69674 from sunyuechi/wip-bufferlist-asan

test/bufferlist: fix BenchDeref overrun and shrink benchmarks under ASan

Reviewed-by: Kefu Chai <k.chai@proxmox.com>
This commit is contained in:
Kefu Chai 2026-06-25 16:11:11 +08:00 committed by GitHub
commit 86c262941b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -47,6 +47,18 @@
#define MAX_TEST 1000000
#define FILENAME "bufferlist"
#ifndef __has_feature
#define __has_feature(x) 0
#endif
#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
static constexpr bool bench_under_asan = true;
#else
static constexpr bool bench_under_asan = false;
#endif
static constexpr size_t asan_bench_rounds(size_t full) {
return bench_under_asan ? (full < 2 ? full : 2) : full;
}
using namespace std;
static char cmd[128];
@ -140,12 +152,13 @@ void bench_buffer_alloc(int size, int num)
}
TEST(Buffer, BenchAlloc) {
bench_buffer_alloc(16384, 1000000);
bench_buffer_alloc(4096, 1000000);
bench_buffer_alloc(1024, 1000000);
bench_buffer_alloc(256, 1000000);
bench_buffer_alloc(32, 1000000);
bench_buffer_alloc(4, 1000000);
const int n = asan_bench_rounds(1000000);
bench_buffer_alloc(16384, n);
bench_buffer_alloc(4096, n);
bench_buffer_alloc(1024, n);
bench_buffer_alloc(256, n);
bench_buffer_alloc(32, n);
bench_buffer_alloc(4, n);
}
TEST(BufferRaw, ostream) {
@ -544,7 +557,7 @@ TEST(BufferPtr, copy_out_bench) {
for (int s=1; s<=8; s*=2) {
utime_t start = ceph_clock_now();
int buflen = 1048576;
int count = 1000;
int count = asan_bench_rounds(1000);
uint64_t v;
for (int i=0; i<count; ++i) {
bufferptr bp(buflen);
@ -583,7 +596,7 @@ TEST(BufferPtr, copy_in_bench) {
for (int s=1; s<=8; s*=2) {
utime_t start = ceph_clock_now();
int buflen = 1048576;
int count = 1000;
int count = asan_bench_rounds(1000);
for (int i=0; i<count; ++i) {
bufferptr bp(buflen);
for (int64_t j=0; j<buflen; j += s) {
@ -627,7 +640,7 @@ TEST(BufferPtr, append_bench) {
for (int s=4; s<=16384; s*=4) {
utime_t start = ceph_clock_now();
int buflen = 1048576;
int count = 4000;
int count = asan_bench_rounds(4000);
for (int i=0; i<count; ++i) {
bufferptr bp(buflen);
bp.set_length(0);
@ -823,7 +836,7 @@ static void bench_bufferlistiter_deref(const size_t step,
utime_t start = ceph_clock_now();
bufferlist::iterator iter = bl.begin();
while (iter != bl.end()) {
while (iter.get_remaining() >= step) {
iter += step;
}
utime_t end = ceph_clock_now();
@ -833,15 +846,15 @@ static void bench_bufferlistiter_deref(const size_t step,
}
TEST(BufferListIterator, BenchDeref) {
bench_bufferlistiter_deref(1, 1, 4096000);
bench_bufferlistiter_deref(1, 10, 409600);
bench_bufferlistiter_deref(1, 100, 40960);
bench_bufferlistiter_deref(1, 1000, 4096);
bench_bufferlistiter_deref(1, 1, asan_bench_rounds(4096000));
bench_bufferlistiter_deref(1, 10, asan_bench_rounds(409600));
bench_bufferlistiter_deref(1, 100, asan_bench_rounds(40960));
bench_bufferlistiter_deref(1, 1000, asan_bench_rounds(4096));
bench_bufferlistiter_deref(4, 1, 1024000);
bench_bufferlistiter_deref(4, 10, 102400);
bench_bufferlistiter_deref(4, 100, 10240);
bench_bufferlistiter_deref(4, 1000, 1024);
bench_bufferlistiter_deref(4, 1, asan_bench_rounds(1024000));
bench_bufferlistiter_deref(4, 10, asan_bench_rounds(102400));
bench_bufferlistiter_deref(4, 100, asan_bench_rounds(10240));
bench_bufferlistiter_deref(4, 1000, asan_bench_rounds(1024));
}
TEST(BufferListIterator, advance) {
@ -1356,17 +1369,18 @@ void bench_bufferlist_alloc(int size, int num, int per)
}
TEST(BufferList, BenchAlloc) {
bench_bufferlist_alloc(32768, 100000, 16);
bench_bufferlist_alloc(25000, 100000, 16);
bench_bufferlist_alloc(16384, 100000, 16);
bench_bufferlist_alloc(10000, 100000, 16);
bench_bufferlist_alloc(8192, 100000, 16);
bench_bufferlist_alloc(6000, 100000, 16);
bench_bufferlist_alloc(4096, 100000, 16);
bench_bufferlist_alloc(1024, 100000, 16);
bench_bufferlist_alloc(256, 100000, 16);
bench_bufferlist_alloc(32, 100000, 16);
bench_bufferlist_alloc(4, 100000, 16);
const int n = asan_bench_rounds(100000);
bench_bufferlist_alloc(32768, n, 16);
bench_bufferlist_alloc(25000, n, 16);
bench_bufferlist_alloc(16384, n, 16);
bench_bufferlist_alloc(10000, n, 16);
bench_bufferlist_alloc(8192, n, 16);
bench_bufferlist_alloc(6000, n, 16);
bench_bufferlist_alloc(4096, n, 16);
bench_bufferlist_alloc(1024, n, 16);
bench_bufferlist_alloc(256, n, 16);
bench_bufferlist_alloc(32, n, 16);
bench_bufferlist_alloc(4, n, 16);
}
/*
@ -1391,7 +1405,7 @@ TEST(BufferList, append_bench_with_size_hint) {
for (size_t step = 4; step <= 16384; step *= 4) {
const utime_t start = ceph_clock_now();
constexpr size_t rounds = 4000;
constexpr size_t rounds = asan_bench_rounds(4000);
for (size_t r = 0; r < rounds; ++r) {
ceph::bufferlist bl(std::size(src));
for (auto iter = std::begin(src);
@ -1408,7 +1422,7 @@ TEST(BufferList, append_bench_with_size_hint) {
TEST(BufferList, append_bench_with_size_hint2) {
std::array<char, 1048576> src = { 0, };
constexpr size_t rounds = 4000;
constexpr size_t rounds = asan_bench_rounds(4000);
constexpr int conc_bl = 400;
std::vector<ceph::bufferlist*> bls(conc_bl);
@ -1439,7 +1453,7 @@ TEST(BufferList, append_bench) {
std::array<char, 1048576> src = { 0, };
for (size_t step = 4; step <= 16384; step *= 4) {
const utime_t start = ceph_clock_now();
constexpr size_t rounds = 4000;
constexpr size_t rounds = asan_bench_rounds(4000);
for (size_t r = 0; r < rounds; ++r) {
ceph::bufferlist bl;
for (auto iter = std::begin(src);
@ -1456,7 +1470,7 @@ TEST(BufferList, append_bench) {
TEST(BufferList, append_bench2) {
std::array<char, 1048576> src = { 0, };
constexpr size_t rounds = 4000;
constexpr size_t rounds = asan_bench_rounds(4000);
constexpr int conc_bl = 400;
std::vector<ceph::bufferlist*> bls(conc_bl);
@ -1488,7 +1502,7 @@ TEST(BufferList, append_hole_bench) {
for (size_t step = 512; step <= 65536; step *= 2) {
const utime_t start = ceph_clock_now();
constexpr size_t rounds = 80000;
constexpr size_t rounds = asan_bench_rounds(80000);
for (size_t r = 0; r < rounds; ++r) {
ceph::bufferlist bl;
while (bl.length() < targeted_bl_size) {
@ -1503,7 +1517,7 @@ TEST(BufferList, append_hole_bench) {
TEST(BufferList, append_hole_bench2) {
constexpr size_t targeted_bl_size = 1048576;
constexpr size_t rounds = 80000;
constexpr size_t rounds = asan_bench_rounds(80000);
constexpr int conc_bl = 400;
std::vector<ceph::bufferlist*> bls(conc_bl);