From: John Spray Date: Fri, 17 Jul 2015 12:48:30 +0000 (+0100) Subject: osd: enable PGLS filters to see hobject_t X-Git-Tag: v9.1.0~400^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=60e903f3d5236da11acbaab985cc292298966add;p=ceph.git osd: enable PGLS filters to see hobject_t We will want this for CephFS, where the name's suffix (i.e. .00000000) is important to us. Signed-off-by: John Spray --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index dd760487c8ef..aa399a3bd0f1 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -504,7 +504,8 @@ void ReplicatedPG::wait_for_blocked_object(const hobject_t& soid, OpRequestRef o op->mark_delayed("waiting for blocked object"); } -bool PGLSParentFilter::filter(bufferlist& xattr_data, bufferlist& outdata) +bool PGLSParentFilter::filter(const hobject_t &obj, + bufferlist& xattr_data, bufferlist& outdata) { bufferlist::iterator iter = xattr_data.begin(); inode_backtrace_t bt; @@ -525,7 +526,8 @@ bool PGLSParentFilter::filter(bufferlist& xattr_data, bufferlist& outdata) return false; } -bool PGLSPlainFilter::filter(bufferlist& xattr_data, bufferlist& outdata) +bool PGLSPlainFilter::filter(const hobject_t &obj, + bufferlist& xattr_data, bufferlist& outdata) { if (val.size() != xattr_data.length()) return false; @@ -539,15 +541,19 @@ bool PGLSPlainFilter::filter(bufferlist& xattr_data, bufferlist& outdata) bool ReplicatedPG::pgls_filter(PGLSFilter *filter, hobject_t& sobj, bufferlist& outdata) { bufferlist bl; - int ret = pgbackend->objects_get_attr( - sobj, - filter->get_xattr(), - &bl); - dout(0) << "getattr (sobj=" << sobj << ", attr=" << filter->get_xattr() << ") returned " << ret << dendl; - if (ret < 0) - return false; - return filter->filter(bl, outdata); + // If filter has expressed an interest in an xattr, load it. + if (!filter->get_xattr().empty()) { + int ret = pgbackend->objects_get_attr( + sobj, + filter->get_xattr(), + &bl); + dout(0) << "getattr (sobj=" << sobj << ", attr=" << filter->get_xattr() << ") returned " << ret << dendl; + if (ret < 0) + return false; + } + + return filter->filter(sobj, bl, outdata); } int ReplicatedPG::get_pgls_filter(bufferlist::iterator& iter, PGLSFilter **pfilter) diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index 419aa7414230..b5e143455b57 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -63,7 +63,8 @@ protected: public: PGLSFilter(); virtual ~PGLSFilter(); - virtual bool filter(bufferlist& xattr_data, bufferlist& outdata) = 0; + virtual bool filter(const hobject_t &obj, bufferlist& xattr_data, + bufferlist& outdata) = 0; virtual string& get_xattr() { return xattr; } }; @@ -75,7 +76,8 @@ public: ::decode(val, params); } virtual ~PGLSPlainFilter() {} - virtual bool filter(bufferlist& xattr_data, bufferlist& outdata); + virtual bool filter(const hobject_t &obj, bufferlist& xattr_data, + bufferlist& outdata); }; class PGLSParentFilter : public PGLSFilter { @@ -87,7 +89,8 @@ public: generic_dout(0) << "parent_ino=" << parent_ino << dendl; } virtual ~PGLSParentFilter() {} - virtual bool filter(bufferlist& xattr_data, bufferlist& outdata); + virtual bool filter(const hobject_t &obj, bufferlist& xattr_data, + bufferlist& outdata); }; class ReplicatedPG : public PG, public PGBackend::Listener {