*/
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);
/* 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;
}
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;
}
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() {}
bool do_pre_list = false;
bool do_put = false;
+ bool do_bulk = false;
bool do_get = false;
bool do_delete = false;
}
~ZPageSet() {
- for (int ix = 0; ix < pages.size(); ++ix)
+ for (unsigned int ix = 0; ix < pages.size(); ++ix)
delete pages[ix];
free(iovs);
}
}
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);
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());
}
}
}
}
+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());
} 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;