Skip to content

Commit

Permalink
Merge pull request #6902 from XinzeChi/wip-pg_stat_t-encoding
Browse files Browse the repository at this point in the history
osd: utime_t, eversion_t, osd_stat_sum_t encoding optimization

Reviewed-by: Sage Weil <sage@redhat.com>
  • Loading branch information
liewegas committed Dec 18, 2015
2 parents 471164d + 8ad665d commit 2dbb19d
Show file tree
Hide file tree
Showing 3 changed files with 197 additions and 106 deletions.
22 changes: 21 additions & 1 deletion src/include/utime.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@
// --------
// utime_t

/* WARNING: If add member in utime_t, please make sure the encode/decode funtion
* work well. For little-endian machine, we should make sure there is no padding
* in 32-bit machine and 64-bit machine.
* You should also modify the padding_check function.
*/
class utime_t {
public:
struct {
Expand Down Expand Up @@ -95,14 +100,29 @@ class utime_t {
tv.tv_sec = v->tv_sec;
tv.tv_nsec = v->tv_usec*1000;
}

void padding_check() {
static_assert(
sizeof(utime_t) ==
sizeof(tv.tv_sec) +
sizeof(tv.tv_nsec)
,
"utime_t have padding");
}
void encode(bufferlist &bl) const {
#if defined(CEPH_LITTLE_ENDIAN)
bl.append((char *)(this), sizeof(__u32) + sizeof(__u32));
#else
::encode(tv.tv_sec, bl);
::encode(tv.tv_nsec, bl);
#endif
}
void decode(bufferlist::iterator &p) {
#if defined(CEPH_LITTLE_ENDIAN)
p.copy(sizeof(__u32) + sizeof(__u32), (char *)(this));
#else
::decode(tv.tv_sec, p);
::decode(tv.tv_nsec, p);
#endif
}

void encode_timeval(struct ceph_timespec *t) const {
Expand Down
203 changes: 108 additions & 95 deletions src/osd/osd_types.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1814,6 +1814,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 @@ -1848,108 +1851,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

0 comments on commit 2dbb19d

Please sign in to comment.