From: Xinze Chi Date: Mon, 14 Dec 2015 16:29:15 +0000 (+0800) Subject: osd: object_stat_sum_t encoding optimization X-Git-Tag: v10.0.3~206^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8ad665d69df81a78ba2e95b55817006c8427adb0;p=ceph.git osd: object_stat_sum_t encoding optimization Signed-off-by: Xinze Chi --- diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index de808571fd3..aefee677e2c 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -1790,6 +1790,9 @@ void object_stat_sum_t::dump(Formatter *f) const void object_stat_sum_t::encode(bufferlist& bl) const { ENCODE_START(15, 3, bl); +#if defined(CEPH_LITTLE_ENDIAN) + bl.append((char *)(&num_bytes), sizeof(object_stat_sum_t)); +#else ::encode(num_bytes, bl); ::encode(num_objects, bl); ::encode(num_object_clones, bl); @@ -1824,108 +1827,118 @@ void object_stat_sum_t::encode(bufferlist& bl) const ::encode(num_evict_mode_full, bl); ::encode(num_objects_pinned, bl); ::encode(num_objects_missing, bl); +#endif ENCODE_FINISH(bl); } void object_stat_sum_t::decode(bufferlist::iterator& bl) { + bool decode_finish = false; DECODE_START_LEGACY_COMPAT_LEN(14, 3, 3, bl); - ::decode(num_bytes, bl); - if (struct_v < 3) { - uint64_t num_kb; - ::decode(num_kb, bl); - } - ::decode(num_objects, bl); - ::decode(num_object_clones, bl); - ::decode(num_object_copies, bl); - ::decode(num_objects_missing_on_primary, bl); - ::decode(num_objects_degraded, bl); - if (struct_v >= 2) - ::decode(num_objects_unfound, bl); - ::decode(num_rd, bl); - ::decode(num_rd_kb, bl); - ::decode(num_wr, bl); - ::decode(num_wr_kb, bl); - if (struct_v >= 4) - ::decode(num_scrub_errors, bl); - else - num_scrub_errors = 0; - if (struct_v >= 5) { - ::decode(num_objects_recovered, bl); - ::decode(num_bytes_recovered, bl); - ::decode(num_keys_recovered, bl); - } else { - num_objects_recovered = 0; - num_bytes_recovered = 0; - num_keys_recovered = 0; - } - if (struct_v >= 6) { - ::decode(num_shallow_scrub_errors, bl); - ::decode(num_deep_scrub_errors, bl); - } else { - num_shallow_scrub_errors = 0; - num_deep_scrub_errors = 0; - } - if (struct_v >= 7) { - ::decode(num_objects_dirty, bl); - ::decode(num_whiteouts, bl); - } else { - num_objects_dirty = 0; - num_whiteouts = 0; - } - if (struct_v >= 8) { - ::decode(num_objects_omap, bl); - } else { - num_objects_omap = 0; - } - if (struct_v >= 9) { - ::decode(num_objects_hit_set_archive, bl); - } else { - num_objects_hit_set_archive = 0; - } - if (struct_v >= 10) { - ::decode(num_objects_misplaced, bl); - } else { - num_objects_misplaced = 0; - } - if (struct_v >= 11) { - ::decode(num_bytes_hit_set_archive, bl); - } else { - num_bytes_hit_set_archive = 0; - } - if (struct_v >= 12) { - ::decode(num_flush, bl); - ::decode(num_flush_kb, bl); - ::decode(num_evict, bl); - ::decode(num_evict_kb, bl); - ::decode(num_promote, bl); - } else { - num_flush = 0; - num_flush_kb = 0; - num_evict = 0; - num_evict_kb = 0; - num_promote = 0; - } - if (struct_v >= 13) { - ::decode(num_flush_mode_high, bl); - ::decode(num_flush_mode_low, bl); - ::decode(num_evict_mode_some, bl); - ::decode(num_evict_mode_full, bl); - } else { - num_flush_mode_high = 0; - num_flush_mode_low = 0; - num_evict_mode_some = 0; - num_evict_mode_full = 0; - } - if (struct_v >= 14) { - ::decode(num_objects_pinned, bl); - } else { - num_objects_pinned = 0; - } +#if defined(CEPH_LITTLE_ENDIAN) if (struct_v >= 15) { - ::decode(num_objects_missing, bl); - } else { - num_objects_missing = 0; + bl.copy(sizeof(object_stat_sum_t), (char*)(&num_bytes)); + decode_finish = true; + } +#endif + if (!decode_finish) { + ::decode(num_bytes, bl); + if (struct_v < 3) { + uint64_t num_kb; + ::decode(num_kb, bl); + } + ::decode(num_objects, bl); + ::decode(num_object_clones, bl); + ::decode(num_object_copies, bl); + ::decode(num_objects_missing_on_primary, bl); + ::decode(num_objects_degraded, bl); + if (struct_v >= 2) + ::decode(num_objects_unfound, bl); + ::decode(num_rd, bl); + ::decode(num_rd_kb, bl); + ::decode(num_wr, bl); + ::decode(num_wr_kb, bl); + if (struct_v >= 4) + ::decode(num_scrub_errors, bl); + else + num_scrub_errors = 0; + if (struct_v >= 5) { + ::decode(num_objects_recovered, bl); + ::decode(num_bytes_recovered, bl); + ::decode(num_keys_recovered, bl); + } else { + num_objects_recovered = 0; + num_bytes_recovered = 0; + num_keys_recovered = 0; + } + if (struct_v >= 6) { + ::decode(num_shallow_scrub_errors, bl); + ::decode(num_deep_scrub_errors, bl); + } else { + num_shallow_scrub_errors = 0; + num_deep_scrub_errors = 0; + } + if (struct_v >= 7) { + ::decode(num_objects_dirty, bl); + ::decode(num_whiteouts, bl); + } else { + num_objects_dirty = 0; + num_whiteouts = 0; + } + if (struct_v >= 8) { + ::decode(num_objects_omap, bl); + } else { + num_objects_omap = 0; + } + if (struct_v >= 9) { + ::decode(num_objects_hit_set_archive, bl); + } else { + num_objects_hit_set_archive = 0; + } + if (struct_v >= 10) { + ::decode(num_objects_misplaced, bl); + } else { + num_objects_misplaced = 0; + } + if (struct_v >= 11) { + ::decode(num_bytes_hit_set_archive, bl); + } else { + num_bytes_hit_set_archive = 0; + } + if (struct_v >= 12) { + ::decode(num_flush, bl); + ::decode(num_flush_kb, bl); + ::decode(num_evict, bl); + ::decode(num_evict_kb, bl); + ::decode(num_promote, bl); + } else { + num_flush = 0; + num_flush_kb = 0; + num_evict = 0; + num_evict_kb = 0; + num_promote = 0; + } + if (struct_v >= 13) { + ::decode(num_flush_mode_high, bl); + ::decode(num_flush_mode_low, bl); + ::decode(num_evict_mode_some, bl); + ::decode(num_evict_mode_full, bl); + } else { + num_flush_mode_high = 0; + num_flush_mode_low = 0; + num_evict_mode_some = 0; + num_evict_mode_full = 0; + } + if (struct_v >= 14) { + ::decode(num_objects_pinned, bl); + } else { + num_objects_pinned = 0; + } + if (struct_v >= 15) { + ::decode(num_objects_missing, bl); + } else { + num_objects_missing = 0; + } } DECODE_FINISH(bl); } diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index c8c9a422278..9352e83ce5e 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -1447,6 +1447,11 @@ ostream& operator<<(ostream& out, const pg_pool_t& p); * a summation of object stats * * This is just a container for object stats; we don't know what for. + * + * If you add members in object_stat_sum_t, you should make sure there are + * not padding among these members. + * You should also modify the padding_check function. + */ struct object_stat_sum_t { /************************************************************************** @@ -1458,24 +1463,23 @@ struct object_stat_sum_t { int64_t num_object_clones; int64_t num_object_copies; // num_objects * num_replicas int64_t num_objects_missing_on_primary; - int64_t num_objects_missing; int64_t num_objects_degraded; - int64_t num_objects_misplaced; int64_t num_objects_unfound; int64_t num_rd; int64_t num_rd_kb; int64_t num_wr; int64_t num_wr_kb; int64_t num_scrub_errors; // total deep and shallow scrub errors - int64_t num_shallow_scrub_errors; - int64_t num_deep_scrub_errors; int64_t num_objects_recovered; int64_t num_bytes_recovered; int64_t num_keys_recovered; + int64_t num_shallow_scrub_errors; + int64_t num_deep_scrub_errors; int64_t num_objects_dirty; int64_t num_whiteouts; int64_t num_objects_omap; int64_t num_objects_hit_set_archive; + int64_t num_objects_misplaced; int64_t num_bytes_hit_set_archive; int64_t num_flush; int64_t num_flush_kb; @@ -1487,24 +1491,25 @@ struct object_stat_sum_t { int32_t num_evict_mode_some; // 1 when in evict some mode, otherwise 0 int32_t num_evict_mode_full; // 1 when in evict full mode, otherwise 0 int64_t num_objects_pinned; + int64_t num_objects_missing; object_stat_sum_t() : num_bytes(0), num_objects(0), num_object_clones(0), num_object_copies(0), - num_objects_missing_on_primary(0), num_objects_missing(0), - num_objects_degraded(0), - num_objects_misplaced(0), + num_objects_missing_on_primary(0), num_objects_degraded(0), num_objects_unfound(0), num_rd(0), num_rd_kb(0), num_wr(0), num_wr_kb(0), - num_scrub_errors(0), num_shallow_scrub_errors(0), - num_deep_scrub_errors(0), + num_scrub_errors(0), num_objects_recovered(0), num_bytes_recovered(0), num_keys_recovered(0), + num_shallow_scrub_errors(0), + num_deep_scrub_errors(0), num_objects_dirty(0), num_whiteouts(0), num_objects_omap(0), num_objects_hit_set_archive(0), + num_objects_misplaced(0), num_bytes_hit_set_archive(0), num_flush(0), num_flush_kb(0), @@ -1513,7 +1518,8 @@ struct object_stat_sum_t { num_promote(0), num_flush_mode_high(0), num_flush_mode_low(0), num_evict_mode_some(0), num_evict_mode_full(0), - num_objects_pinned(0) + num_objects_pinned(0), + num_objects_missing(0) {} void floor(int64_t f) { @@ -1618,6 +1624,46 @@ struct object_stat_sum_t { void sub(const object_stat_sum_t& o); void dump(Formatter *f) const; + void padding_check() { + static_assert( + sizeof(object_stat_sum_t) == + sizeof(num_bytes) + + sizeof(num_objects) + + sizeof(num_object_clones) + + sizeof(num_object_copies) + + sizeof(num_objects_missing_on_primary) + + sizeof(num_objects_degraded) + + sizeof(num_objects_unfound) + + sizeof(num_rd) + + sizeof(num_rd_kb) + + sizeof(num_wr) + + sizeof(num_wr_kb) + + sizeof(num_scrub_errors) + + sizeof(num_objects_recovered) + + sizeof(num_bytes_recovered) + + sizeof(num_keys_recovered) + + sizeof(num_shallow_scrub_errors) + + sizeof(num_deep_scrub_errors) + + sizeof(num_objects_dirty) + + sizeof(num_whiteouts) + + sizeof(num_objects_omap) + + sizeof(num_objects_hit_set_archive) + + sizeof(num_objects_misplaced) + + sizeof(num_bytes_hit_set_archive) + + sizeof(num_flush) + + sizeof(num_flush_kb) + + sizeof(num_evict) + + sizeof(num_evict_kb) + + sizeof(num_promote) + + sizeof(num_flush_mode_high) + + sizeof(num_flush_mode_low) + + sizeof(num_evict_mode_some) + + sizeof(num_evict_mode_full) + + sizeof(num_objects_pinned) + + sizeof(num_objects_missing) + , + "object_stat_sum_t have padding"); + } void encode(bufferlist& bl) const; void decode(bufferlist::iterator& bl); static void generate_test_instances(list& o);