Skip to content

Commit

Permalink
osd: object_stat_sum_t encoding optimization
Browse files Browse the repository at this point in the history
Signed-off-by: Xinze Chi <xinze@xsky.com>
  • Loading branch information
XinzeChi committed Dec 14, 2015
1 parent 3b08500 commit 8ad665d
Show file tree
Hide file tree
Showing 2 changed files with 164 additions and 105 deletions.
203 changes: 108 additions & 95 deletions src/osd/osd_types.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}
Expand Down
66 changes: 56 additions & 10 deletions src/osd/osd_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
/**************************************************************************
Expand All @@ -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;
Expand All @@ -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),
Expand All @@ -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) {
Expand Down Expand Up @@ -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<object_stat_sum_t*>& o);
Expand Down

0 comments on commit 8ad665d

Please sign in to comment.