From cc6a9c8fc9b9ddec0a336208323660f9cd2f097f Mon Sep 17 00:00:00 2001 From: Guo-Fu Tseng Date: Wed, 15 Feb 2017 13:59:10 +0800 Subject: [PATCH] osd: Preserve OSDOp information for historic ops clear_buffers() actually clears all OSDOp informations, so that we can only see empty ops with `dump_historic_ops`. This commit keeps the op information, and only minimal buffers for printing op information. Signed-off-by: Guo-Fu Tseng --- src/messages/MOSDOp.h | 2 +- src/osd/osd_types.cc | 30 ++++++++++++++++++++++++++++++ src/osd/osd_types.h | 7 +++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/messages/MOSDOp.h b/src/messages/MOSDOp.h index b6b87f131de..69d12a7a9df 100755 --- a/src/messages/MOSDOp.h +++ b/src/messages/MOSDOp.h @@ -559,7 +559,7 @@ struct ceph_osd_request_head { } void clear_buffers() override { - ops.clear(); + OSDOp::clear_data(ops); } const char *get_type_name() const override { return "osd_op"; } diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index fbebf058d2b..80cf7e3d401 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -5878,3 +5878,33 @@ ostream& operator<<(ostream& out, const store_statfs_t &s) << ")"; return out; } + +void OSDOp::clear_data(vector& ops) +{ + for (unsigned i = 0; i < ops.size(); i++) { + OSDOp& op = ops[i]; + op.outdata.clear(); + if (ceph_osd_op_type_attr(op.op.op) && + op.op.xattr.name_len && + op.indata.length() >= op.op.xattr.name_len) { + bufferptr bp(op.op.xattr.name_len); + bufferlist bl; + bl.append(bp); + bl.copy_in(0, op.op.xattr.name_len, op.indata); + op.indata.claim(bl); + } else if (ceph_osd_op_type_exec(op.op.op) && + op.op.cls.class_len && + op.indata.length() > + (op.op.cls.class_len + op.op.cls.method_len)) { + __u8 len = op.op.cls.class_len + op.op.cls.method_len; + bufferptr bp(len); + bufferlist bl; + bl.append(bp); + bl.copy_in(0, len, op.indata); + op.indata.claim(bl); + } else { + op.indata.clear(); + } + } +} + diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 1cea9a6ba36..a48f4c864e3 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -4777,6 +4777,13 @@ struct OSDOp { * @param out [out] combined data buffer */ static void merge_osd_op_vector_out_data(vector& ops, bufferlist& out); + + /** + * Clear data as much as possible, leave minimal data for historical op dump + * + * @param ops [in] vector of OSDOps + */ + static void clear_data(vector& ops); }; ostream& operator<<(ostream& out, const OSDOp& op); -- 2.47.3