From: Matt Benjamin Date: Thu, 29 Oct 2015 18:58:47 +0000 (-0400) Subject: librgw: improve rgw_write and add WRITE_READ_VERIFY X-Git-Tag: v10.1.0~382^2~177 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=540ce769ceaa860c8d4ff24f4fd2f5adc1ca2abc;p=ceph.git librgw: improve rgw_write and add WRITE_READ_VERIFY 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 --- diff --git a/src/include/rados/rgw_file.h b/src/include/rados/rgw_file.h index 27c67caaaed1..5689d7469cc8 100644 --- a/src/include/rados/rgw_file.h +++ b/src/include/rados/rgw_file.h @@ -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 */ diff --git a/src/rgw/rgw_file.cc b/src/rgw/rgw_file.cc index 89e84e8e982d..6136f7848bd3 100644 --- a/src/rgw/rgw_file.cc +++ b/src/rgw/rgw_file.cc @@ -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(rgw_fs->rgw); RGWLibFS *fs = static_cast(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; } diff --git a/src/rgw/rgw_file.h b/src/rgw/rgw_file.h index f2b5f5327077..02e62f54125b 100644 --- a/src/rgw/rgw_file.h +++ b/src/rgw/rgw_file.h @@ -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() {} diff --git a/src/test/librgw_file_gp.cc b/src/test/librgw_file_gp.cc index bc3d8058d758..4b9fa9b28cf6 100644 --- a/src/test/librgw_file_gp.cc +++ b/src/test/librgw_file_gp.cc @@ -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;