From a9d3f078cb6cdaf7f8778ba1a07d333548a9d1a2 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 14 Dec 2015 13:13:33 -0500 Subject: [PATCH] osd/osd_types: skip encoding newer object_info_t fields if they are unused This reduces the size of the encoded object_info_t in most cases, enough to get us under the 255 byte limit for a single inline xattr in XFS. Signed-off-by: Sage Weil --- src/osd/osd_types.cc | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 94ca0832313e..29f4fc4cc53a 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -4225,7 +4225,16 @@ void object_info_t::encode(bufferlist& bl) const ++i) { old_watchers.insert(make_pair(i->first.second, i->second)); } - ENCODE_START(15, 8, bl); + + // kludge to reduce xattr size for most rbd objects + int ev = 15; + if (!(flags & FLAG_OMAP_DIGEST) && + !(flags & FLAG_DATA_DIGEST) && + local_mtime == utime_t()) { + ev = 13; + } + + ENCODE_START(ev, 8, bl); ::encode(soid, bl); ::encode(myoloc, bl); //Retained for compatibility ::encode((__u32)0, bl); // was category, no longer used @@ -4250,9 +4259,13 @@ void object_info_t::encode(bufferlist& bl) const ::encode(watchers, bl); __u32 _flags = flags; ::encode(_flags, bl); - ::encode(local_mtime, bl); - ::encode(data_digest, bl); - ::encode(omap_digest, bl); + if (ev >= 14) { + ::encode(local_mtime, bl); + } + if (ev >= 15) { + ::encode(data_digest, bl); + ::encode(omap_digest, bl); + } ENCODE_FINISH(bl); } -- 2.47.3