]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: enable PGLS filters to see hobject_t
authorJohn Spray <john.spray@redhat.com>
Fri, 17 Jul 2015 12:48:30 +0000 (13:48 +0100)
committerJohn Spray <john.spray@redhat.com>
Wed, 5 Aug 2015 13:30:22 +0000 (14:30 +0100)
We will want this for CephFS, where the name's suffix
(i.e. .00000000) is important to us.

Signed-off-by: John Spray <john.spray@redhat.com>
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index dd760487c8ef9c503b9e250b7776166a0fdbd7b0..aa399a3bd0f1052f011081a1cc27e43ba93f688e 100644 (file)
@@ -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)
index 419aa7414230dca81fe517ec81d56d29e1a42a58..b5e143455b5703d5d47df74d4c0865f004cb33de 100644 (file)
@@ -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 {