From: Chunmei Liu Date: Wed, 23 Mar 2022 05:21:24 +0000 (-0700) Subject: crimson: keep string alive during string_view lifetime X-Git-Tag: v18.0.0~1202^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e0d18b796478195962cb4e901b9026af27cd7e35;p=ceph.git crimson: keep string alive during string_view lifetime Signed-off-by: Chunmei Liu --- diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index 8c7b235b34fe..fe12d2af9a58 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -735,7 +735,7 @@ static PG::interruptible_future pgls_filter( if (const auto xattr = filter.get_xattr(); !xattr.empty()) { logger().debug("pgls_filter: filter is interested in xattr={} for obj={}", xattr, sobj); - return backend.getxattr(sobj, xattr).safe_then_interruptible( + return backend.getxattr(sobj, std::move(xattr)).safe_then_interruptible( [&filter, sobj] (ceph::bufferlist val) { logger().debug("pgls_filter: got xvalue for obj={}", sobj); diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 76c19c11bbcd..29f09b69e843 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -867,7 +867,7 @@ PGBackend::get_attr_ierrorator::future<> PGBackend::getxattr( name = "_" + aname; } logger().debug("getxattr on obj={} for attr={}", os.oi.soid, name); - return getxattr(os.oi.soid, name).safe_then_interruptible( + return getxattr(os.oi.soid, std::move(name)).safe_then_interruptible( [&delta_stats, &osd_op] (ceph::bufferlist&& val) { osd_op.outdata = std::move(val); osd_op.op.xattr.value_len = osd_op.outdata.length(); @@ -889,6 +889,19 @@ PGBackend::getxattr( return store->get_attr(coll, ghobject_t{soid}, key); } +PGBackend::get_attr_ierrorator::future +PGBackend::getxattr( + const hobject_t& soid, + std::string&& key) const +{ + if (__builtin_expect(stopping, false)) { + throw crimson::common::system_shutdown_exception(); + } + return seastar::do_with(key, [this, &soid](auto &key) { + return store->get_attr(coll, ghobject_t{soid}, key); + }); +} + PGBackend::get_attr_ierrorator::future<> PGBackend::get_xattrs( const ObjectState& os, OSDOp& osd_op, @@ -966,7 +979,7 @@ PGBackend::cmp_xattr_ierrorator::future<> PGBackend::cmp_xattr( bp.copy(osd_op.op.xattr.name_len, name); logger().debug("cmpxattr on obj={} for attr={}", os.oi.soid, name); - return getxattr(os.oi.soid, name).safe_then_interruptible( + return getxattr(os.oi.soid, std::move(name)).safe_then_interruptible( [&delta_stats, &osd_op] (auto &&xattr) { int result = 0; auto bp = osd_op.indata.cbegin(); diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index 80a1392fbf2f..563638ff06dc 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -211,6 +211,9 @@ public: get_attr_ierrorator::future getxattr( const hobject_t& soid, std::string_view key) const; + get_attr_ierrorator::future getxattr( + const hobject_t& soid, + std::string&& key) const; get_attr_ierrorator::future<> get_xattrs( const ObjectState& os, OSDOp& osd_op,