]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.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)
committerNathan Cutler <ncutler@suse.com>
Wed, 29 Mar 2017 04:05:42 +0000 (06:05 +0200)
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>
(cherry picked from commit 2cd60ee9712291b906123aca1704288b18a9742b)

src/rgw/rgw_file.h

index bf8d0db599cc7818ac1a9bd68b8332c373cdeda4..4a66eb2f633304a5d8ed4fc251bc591435dc80d0 100644 (file)
@@ -1099,11 +1099,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;
   }
@@ -1204,10 +1200,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;