From 295ce538ea49155ca57faa88872b9e897fb63114 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Fri, 9 Aug 2019 14:19:51 +0200 Subject: [PATCH] osd: don't carry PGLSFilter between multiple ops in MOSDOp. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently result of executing multiple PG listing operations in single MOSDOp – if PGLSFilter is being used – depends on the order in the sequence. To exemplify: [ CEPH_OSD_OP_PGNLS, CEPH_OSD_OP_PGNLS_FILTER ] may bring different result for CEPH_OSD_OP_PGNLS than [ CEPH_OSD_OP_PGNLS_FILTER, CEPH_OSD_OP_PGNLS ]. This happens because ..._PGNLS_FILTER sets up PGLSFilter which is used also by plain ..._PGNLS. The commit changes that. After the filter is set-up separately for each interested operation in MOSDOp. Signed-off-by: Radoslaw Zarzynski --- src/osd/PrimaryLogPG.cc | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index dff327da93a..95bb66194a2 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -1033,13 +1033,13 @@ void PrimaryLogPG::do_pg_op(OpRequestRef op) int result = 0; string cname, mname; - PGLSFilter *filter = NULL; snapid_t snapid = m->get_snapid(); vector ops = m->ops; for (vector::iterator p = ops.begin(); p != ops.end(); ++p) { + std::unique_ptr filter; OSDOp& osd_op = *p; auto bp = p->indata.cbegin(); switch (p->op.op) { @@ -1053,11 +1053,11 @@ void PrimaryLogPG::do_pg_op(OpRequestRef op) result = -EINVAL; break; } - if (filter) { - delete filter; - filter = NULL; + { + PGLSFilter* tmp_filter; + result = get_pgls_filter(bp, &tmp_filter); + filter.reset(tmp_filter); } - result = get_pgls_filter(bp, &filter); if (result < 0) break; @@ -1223,11 +1223,12 @@ void PrimaryLogPG::do_pg_op(OpRequestRef op) result = -EINVAL; break; } - if (filter) { - delete filter; - filter = NULL; + + { + PGLSFilter* tmp_filter; + result = get_pgls_filter(bp, &tmp_filter); + filter.reset(tmp_filter); } - result = get_pgls_filter(bp, &filter); if (result < 0) break; @@ -1392,7 +1393,6 @@ void PrimaryLogPG::do_pg_op(OpRequestRef op) } if (is_unreadable_object(oid)) { wait_for_unreadable_object(oid, op); - delete filter; return; } result = osd->store->read(ch, ghobject_t(oid), 0, 0, osd_op.outdata); @@ -1421,7 +1421,6 @@ void PrimaryLogPG::do_pg_op(OpRequestRef op) reply->set_result(result); reply->set_reply_versions(info.last_update, info.last_user_version); osd->send_message_osd_client(reply, m->get_connection()); - delete filter; } int PrimaryLogPG::do_scrub_ls(MOSDOp *m, OSDOp *osd_op)