From: Guo-Fu Tseng Date: Wed, 15 Feb 2017 05:59:10 +0000 (+0800) Subject: osd: Preserve OSDOp information for historic ops X-Git-Tag: v12.1.1~187^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cc6a9c8fc9b9ddec0a336208323660f9cd2f097f;p=ceph.git 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 --- diff --git a/src/messages/MOSDOp.h b/src/messages/MOSDOp.h index b6b87f131de1..69d12a7a9df4 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 fbebf058d2b5..80cf7e3d401f 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 1cea9a6ba360..a48f4c864e3d 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);