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;
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;
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)
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; }
};
::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 {
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 {