]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librgw: improve rgw_write and add WRITE_READ_VERIFY
authorMatt Benjamin <mbenjamin@redhat.com>
Thu, 29 Oct 2015 18:58:47 +0000 (14:58 -0400)
committerMatt Benjamin <mbenjamin@redhat.com>
Fri, 12 Feb 2016 17:05:26 +0000 (12:05 -0500)
Update rgw_write to return bytes written as an OUT argument,
use and verify in PUT test.

A new WRITE_READ_VERIFY test writes 16 checksummed, 64K data pages
to the object when --bulk specified.  The returned write value is
checked, but pages not re-read (yet).

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

index 27c67caaaed125bff962d51a91229ed2c857a556..5689d7469cc88109c18fe4140f673fc71a9541e2 100644 (file)
@@ -204,7 +204,7 @@ int rgw_readv(struct rgw_fs *rgw_fs,
 */
 int rgw_write(struct rgw_fs *rgw_fs,
              struct rgw_file_handle *fh, uint64_t offset,
-             size_t length, void *buffer);
+             size_t length, size_t *bytes_written, void *buffer);
 
 /* XXX add release fn and UIO type */
 
index 89e84e8e982d01e4620a36df9f48ff3d5f8775e3..6136f7848bd3e65cc53e9dbf07a546472ac23fba 100644 (file)
@@ -347,7 +347,7 @@ int rgw_read(struct rgw_fs *rgw_fs,
 */
 int rgw_write(struct rgw_fs *rgw_fs,
              struct rgw_file_handle *fh, uint64_t offset,
-             size_t length, void *buffer)
+             size_t length, size_t *bytes_written, void *buffer)
 {
   CephContext* cct = static_cast<CephContext*>(rgw_fs->rgw);
   RGWLibFS *fs = static_cast<RGWLibFS*>(rgw_fs->fs_private);
@@ -364,8 +364,11 @@ int rgw_write(struct rgw_fs *rgw_fs,
   /* XXX */
   RGWPutObjRequest req(cct, fs->get_user(), rgw_fh->bucket_name(),
                      rgw_fh->object_name(), bl);
+
   int rc = librgw.get_fe()->execute_req(&req);
 
+  *bytes_written = (rc == 0) ? req.bytes_written : 0;
+
   return rc;
 }
 
index f2b5f53270778ae2a283eaf4139e016b599e1b9b..02e62f54125b0a4ddcd292c16c56f0febba3d652 100644 (file)
@@ -379,12 +379,13 @@ public:
   const std::string& bucket_name;
   const std::string& obj_name;
   buffer::list& bl; /* XXX */
+  size_t bytes_written;
 
   RGWPutObjRequest(CephContext* _cct, RGWUserInfo *_user,
                  const std::string& _bname, const std::string& _oname,
                  buffer::list& _bl)
     : RGWLibRequest(_cct, _user), bucket_name(_bname), obj_name(_oname),
-      bl(_bl) {
+      bl(_bl), bytes_written(0) {
     magic = 75;
     op = this;
   }
@@ -428,7 +429,9 @@ public:
   virtual int get_data(buffer::list& _bl) {
     /* XXX for now, use sharing semantics */
     _bl.claim(bl);
-    return _bl.length();
+    uint32_t len = _bl.length();
+    bytes_written += len;
+    return len;
   }
 
   virtual void send_response() {}
index bc3d8058d75843df3c92074af7c1a30d7c97de97..4b9fa9b28cf6aa9f56e9f4bfb7c2c97b0ee46d43 100644 (file)
@@ -39,6 +39,7 @@ namespace {
 
   bool do_pre_list = false;
   bool do_put = false;
+  bool do_bulk = false;
   bool do_get = false;
   bool do_delete = false;
 
@@ -116,7 +117,7 @@ namespace {
     }
 
     ~ZPageSet() {
-      for (int ix = 0; ix < pages.size(); ++ix)
+      for (unsigned int ix = 0; ix < pages.size(); ++ix)
        delete pages[ix];
       free(iovs);
     }
@@ -175,7 +176,7 @@ TEST(LibRGW, LIST_OBJECTS) {
 }
 
 TEST(LibRGW, LOOKUP_OBJECT) {
-  if (do_get || do_put) {
+  if (do_get || do_put || do_bulk) {
     int ret = rgw_lookup(fs, bucket_fh, object_name.c_str(), &object_fh,
                        0 /* flags */);
     ASSERT_EQ(ret, 0);
@@ -191,9 +192,12 @@ TEST(LibRGW, OBJ_OPEN) {
 
 TEST(LibRGW, PUT_OBJECT) {
   if (do_put) {
+    size_t nbytes;
     string data = "hi mom"; // fix this
-    int ret = rgw_write(fs, object_fh, 0, data.length(), (void*) data.c_str());
+    int ret = rgw_write(fs, object_fh, 0, data.length(), &nbytes,
+                       (void*) data.c_str());
     ASSERT_EQ(ret, 0);
+    ASSERT_EQ(nbytes, data.length());
   }
 }
 
@@ -210,6 +214,25 @@ TEST(LibRGW, GET_OBJECT) {
   }
 }
 
+TEST(LibRGW, WRITE_READ_VERIFY)
+{
+  if (do_bulk) {
+    const int iovcnt = 16;
+    ZPageSet zp_set1{iovcnt}; // 1M random data in 16 64K pages
+    struct iovec *iovs = zp_set1.get_iovs();
+
+    /* read after write POSIX-style */
+    size_t nbytes, off = 0;
+    for (int ix = 0; ix < 16; ++ix, off += 65536) {
+      struct iovec *iov = &iovs[ix];
+      int ret = rgw_write(fs, object_fh, off, 65536, &nbytes, iov->iov_base);
+      ASSERT_EQ(ret, 0);
+      ASSERT_EQ(nbytes, size_t(65536));
+    }
+    zp_set1.reset_iovs();
+  }
+}
+
 TEST(LibRGW, DELETE_OBJECT) {
   if (do_delete) {
     int ret = rgw_unlink(fs, bucket_fh, object_name.c_str());
@@ -276,6 +299,9 @@ int main(int argc, char *argv[])
     } else if (ceph_argparse_flag(args, arg_iter, "--put",
                                            (char*) nullptr)) {
       do_put = true;
+    } else if (ceph_argparse_flag(args, arg_iter, "--bulk",
+                                           (char*) nullptr)) {
+      do_bulk = true;
     } else if (ceph_argparse_flag(args, arg_iter, "--delete",
                                            (char*) nullptr)) {
       do_delete = true;