]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librgw: likely correct marker handling
authorMatt Benjamin <mbenjamin@redhat.com>
Thu, 7 Jan 2016 01:57:36 +0000 (20:57 -0500)
committerMatt Benjamin <mbenjamin@redhat.com>
Fri, 12 Feb 2016 17:07:34 +0000 (12:07 -0500)
New logic propagates is_truncated traveral-finished indicator up
from bucket and object list operations in all cases, and correctly
expands relative paths.

Unit test output looks promising.

Signed-off-by: Matt Benjamin <mbenjamin@redhat.com>
src/rgw/rgw_file.h
src/test/librgw_file_nfsns.cc

index 0f5fed0ebc5e582dcc9eb776038cf58aba49a029..dd1569f77ae8a6675e4aab1fcdafe6eb5a1170a1 100644 (file)
@@ -798,7 +798,14 @@ public:
                        void* _cb_arg, uint64_t* _offset)
     : RGWLibRequest(_cct, _user), rgw_fh(_rgw_fh), offset(_offset),
       cb_arg(_cb_arg), rcb(_rcb), ix(0) {
-    RGWListBuckets::marker = rgw_fh->find_marker(*offset);
+    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;
+    }
     magic = 71;
     op = this;
   }
@@ -882,8 +889,8 @@ public:
   read directory content (bucket objects)
 */
 
-class RGWReaddirRequest : public RGWLibRequest,
-                         public RGWListBucket /* RGWOp */
+  class RGWReaddirRequest : public RGWLibRequest,
+                           public RGWListBucket /* RGWOp */
 {
 public:
   RGWFileHandle* rgw_fh;
@@ -897,7 +904,15 @@ public:
                    void* _cb_arg, uint64_t* _offset)
     : RGWLibRequest(_cct, _user), rgw_fh(_rgw_fh), offset(_offset),
       cb_arg(_cb_arg), rcb(_rcb), ix(0) {
-    RGWListBucket::marker = {rgw_fh->find_marker(*offset), ""};
+    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;
+    }
+    std::cout << __func__ << " offset: " << *offset
+             <<  " marker: " << marker << std::endl;
     default_max = 1000; // XXX was being omitted
     magic = 72;
     op = this;
index f099deb74b846578164d808c71434554815f6bfc..4aada698ac2d40cf0c6f437d7dd6352ea13517ec 100644 (file)
@@ -214,7 +214,7 @@ TEST(LibRGW, ENUMERATE1) {
       case RGW_FS_TYPE_DIRECTORY:
        if (! elt.state.readdir) {
          // descending
-         uint64_t offset;
+         uint64_t offset = 0;
          bool eof; // XXX
          lsubdout(cct, rgw, 10)
            << "readdir in"
@@ -335,7 +335,7 @@ TEST(LibRGW, MARKER1_READDIR)
     using std::get;
 
     dirent_vec dvec;
-    uint64_t offset;
+    uint64_t offset = 0;
     bool eof = false;
 
     /* because RGWReaddirRequest::default_max is 1000 (XXX make