]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw_file: rgw_readdir can't list multi-segment dirs
authorMatt Benjamin <mbenjamin@redhat.com>
Mon, 20 Feb 2017 01:34:31 +0000 (20:34 -0500)
committerMatt Benjamin <mbenjamin@redhat.com>
Mon, 20 Feb 2017 01:44:08 +0000 (20:44 -0500)
This issue has one root cause in librgw, namely that the marker
argument to these requests was incorrectly formatted (though the
marker cache was working as intended).

Secondarily, for nfs-ganesha users, there is a compounding issue
that the RGW fsal was required by "temporary" convention to
populate the entire dirent cache for a directory on a single
readdir() invocation--the cache_inode/mdcache implementations
invariantly pass (before future 2.5 changesets, currently in
progress) a null pointer for the start cookie offset, intended
to convey this.

Fixes: http://tracker.ceph.com/issues/18991
Signed-off-by: Matt Benjamin <mbenjamin@redhat.com>
src/rgw/rgw_file.h

index 8716fad81b22f44a8ca10edc285d059c907f3b0b..e396c75f28d958081af3b35cea663aedb94c1443 100644 (file)
@@ -1125,11 +1125,7 @@ public:
       cb_arg(_cb_arg), rcb(_rcb), ix(0) {
     const std::string& sm = rgw_fh->find_marker(*offset);
     if (sm.size() > 0) {
-      RGWListBuckets::marker =
-       rgw_fh->relative_object_name();
-      if (marker.back() != '/')
-       marker += "/";
-      marker += sm;
+      marker = sm;
     }
     op = this;
   }
@@ -1230,10 +1226,7 @@ public:
       cb_arg(_cb_arg), rcb(_rcb), ix(0) {
     const std::string& sm{rgw_fh->find_marker(*offset)};
     if (sm.size() > 0) {
-      RGWListBucket::marker = {rgw_fh->relative_object_name(), ""};
-      if (marker.name.back() != '/')
-       marker.name += "/";
-      marker.name += sm;
+      marker = sm;
     }
     default_max = 1000; // XXX was being omitted
     op = this;