]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
messages/MOSDPing: initialize MOSDPing padding 15714/head
authorSage Weil <sage@redhat.com>
Fri, 16 Jun 2017 02:18:08 +0000 (22:18 -0400)
committerSage Weil <sage@redhat.com>
Fri, 16 Jun 2017 02:18:08 +0000 (22:18 -0400)
This memory must be initialized or else valgrind will be very unhappy.

Avoid the cost of zeroing (or even allocating) the buffer for normal
padding values by (re)using a static zero buffer.

Fixes: http://tracker.ceph.com/issues/20323
Signed-off-by: Sage Weil <sage@redhat.com>
src/messages/MOSDPing.h

index 7a8bf2f986f01c0f7b1d8949e63cf4a0b903d13d..22d24d6aae7a0b9b5be7c4b10f011265a40f4477 100644 (file)
@@ -99,10 +99,22 @@ public:
     ::encode(op, payload);
     ::encode(peer_stat, payload);
     ::encode(stamp, payload);
-    bufferptr size_bp(MAX(min_message_size - payload.length(), 0));
-    bufferlist size_bl;;
-    size_bl.push_back(size_bp);
-    ::encode(size_bl, payload);
+
+    bufferlist pad;
+    size_t s = MAX(min_message_size - payload.length(), 0);
+    // this should be big enough for normal min_message padding sizes. since
+    // we are targetting jumbo ethernet frames around 9000 bytes, 16k should
+    // be more than sufficient!  the compiler will statically zero this so
+    // that at runtime we are only adding a bufferptr reference to it.
+    static char zeros[16384] = {};
+    while (s > sizeof(zeros)) {
+      pad.append(buffer::create_static(sizeof(zeros), zeros));
+      s -= sizeof(zeros);
+    }
+    if (s) {
+      pad.append(buffer::create_static(s, zeros));
+    }
+    ::encode(pad, payload);
   }
 
   const char *get_type_name() const override { return "osd_ping"; }