]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
test/osd: fix buffer alignment issue in unittest_ecbackend 66849/head
authorKefu Chai <k.chai@proxmox.com>
Fri, 9 Jan 2026 01:25:28 +0000 (09:25 +0800)
committerKefu Chai <k.chai@proxmox.com>
Fri, 9 Jan 2026 04:03:05 +0000 (12:03 +0800)
The create_buf() function in TestECBackend.cc had two issues that
caused test failures when running with ASan enabled:

1. Infinite loop potential: When std::rand() % 5 returned 0, len_to_add
   would be 0, causing an infinite loop if the buffer hadn't reached
   the target length yet.

2. Memory alignment issue: Using append_zero() doesn't guarantee that
   the resulting buffer's memory address is aligned to EC_ALIGN_SIZE
   (4096 bytes). The is_aligned() check verifies that all buffers in
   the bufferlist have their data pointers properly aligned, not just
   that the length is a multiple of the alignment size.

Fix by:
- Changing std::rand() % 5 to std::rand() % 5 + 1 to ensure we always
  allocate 1-5 pages worth of data, avoiding the infinite loop
- Replacing append_zero() with buffer::create_page_aligned() followed
  by memset() and append(), which ensures each buffer has its data
  pointer aligned to page boundaries (4096 bytes)

This ensures the test passes consistently with ASan enabled.

Signed-off-by: Kefu Chai <k.chai@proxmox.com>
src/test/osd/TestECBackend.cc

index 697f4a1a99512f357b2e6910bc26c739f206f3e8..76f9cc0aff696d033afec6f5872666fddf306216 100644 (file)
@@ -1286,9 +1286,12 @@ bufferlist create_buf(uint64_t len) {
   bufferlist bl;
 
   while (bl.length() < len) {
-    uint64_t pages = std::rand() % 5;
+    uint64_t pages = std::rand() % 5 + 1;  // 1-5 pages to avoid infinite loop
     uint64_t len_to_add = std::min(len - bl.length(), pages * EC_ALIGN_SIZE);
-    bl.append_zero(len_to_add);
+    // Create page-aligned buffer to ensure memory alignment
+    bufferptr ptr = buffer::create_page_aligned(len_to_add);
+    memset(ptr.c_str(), 0, len_to_add);
+    bl.append(ptr);
   }
   ceph_assert(bl.is_aligned(EC_ALIGN_SIZE));
   ceph_assert(len == bl.length());