]>
git.proxmox.com Git - ceph.git/blob - ceph/src/test/librgw_file_aw.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2015 Red Hat, Inc.
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
23 #include "include/rados/librgw.h"
24 #include "include/rados/rgw_file.h"
26 #include "gtest/gtest.h"
27 #include "common/ceph_argparse.h"
28 #include "common/debug.h"
30 #define dout_context g_ceph_context
31 #define dout_subsys ceph_subsys_rgw
34 librgw_t rgw
= nullptr;
35 string
userid("testuser");
36 string
access_key("");
37 string
secret_key("");
38 struct rgw_fs
*fs
= nullptr;
40 uint32_t owner_uid
= 867;
41 uint32_t owner_gid
= 5309;
42 uint32_t create_mask
= RGW_SETATTR_UID
| RGW_SETATTR_GID
| RGW_SETATTR_MODE
;
44 bool do_create
= false;
45 bool do_delete
= false;
46 bool do_large
= false;
47 bool do_verify
= false;
48 bool do_hexdump
= false;
50 string bucket_name
= "sorrydave";
51 string object_name
= "jocaml";
53 struct rgw_file_handle
*bucket_fh
= nullptr;
54 struct rgw_file_handle
*object_fh
= nullptr;
56 typedef std::tuple
<string
,uint64_t, struct rgw_file_handle
*> fid_type
;
57 std::vector
<fid_type
> fids
;
59 std::uniform_int_distribution
<uint8_t> uint_dist
;
62 constexpr int iovcnt
= 4;
63 constexpr int page_size
= /* 65536 */ 4 * 1024*1024;
64 constexpr int seed
= 8675309;
74 std::vector
<ZPage
*> pages
;
77 explicit ZPageSet(int n
) {
79 iovs
= (struct iovec
*) calloc(n
, sizeof(struct iovec
));
80 for (int page_ix
= 0; page_ix
< n
; ++page_ix
) {
81 ZPage
* p
= new ZPage();
82 for (int data_ix
= 0; data_ix
< page_size
; ++data_ix
) {
83 p
->data
[data_ix
] = uint_dist(rng
);
85 p
->cksum
= XXH64(p
->data
, page_size
, seed
);
86 pages
.emplace_back(p
);
88 struct iovec
* iov
= &iovs
[page_ix
];
89 iov
->iov_base
= p
->data
;
90 iov
->iov_len
= page_size
;
94 int size() { return pages
.size(); }
96 struct iovec
* get_iovs() { return iovs
; }
98 bool operator==(const ZPageSet
& rhs
) {
100 for (int page_ix
= 0; page_ix
< n
; ++page_ix
) {
101 ZPage
* p1
= pages
[page_ix
];
102 ZPage
* p2
= rhs
.pages
[page_ix
];
103 if (p1
->cksum
!= p2
->cksum
)
109 bool operator==(const rgw_uio
* uio
) {
111 int vix
= 0, off
= 0;
112 rgw_vio
* vio
= &uio
->uio_vio
[vix
];
113 int vio_len
= vio
->vio_len
;
116 for (int ix
= 0; ix
< iovcnt
; ++ix
) {
117 ZPage
* p1
= pages
[ix
];
118 data
= static_cast<char*>(vio
->vio_base
) + off
;
119 cksum
= XXH64(data
, page_size
, seed
);
121 if (p1
->cksum
!= cksum
) {
122 int r
= memcmp(data
, p1
->data
, page_size
);
123 std::cout
<< "problem at ix " << ix
<< " r " << r
<< std::endl
;
128 if (off
>= vio_len
) {
129 vio
= &uio
->uio_vio
[++vix
];
130 vio_len
= vio
->vio_len
;
139 for (int page_ix
= 0; page_ix
< n
; ++page_ix
) {
140 ZPage
* p
= pages
[page_ix
];
141 p
->cksum
= XXH64(p
->data
, page_size
, seed
);
145 void reset_iovs() { // VOP_READ and VOP_WRITE update
147 for (int page_ix
= 0; page_ix
< n
; ++page_ix
) {
148 ZPage
* p
= pages
[page_ix
];
149 struct iovec
* iov
= &iovs
[page_ix
];
150 iov
->iov_base
= p
->data
;
151 iov
->iov_len
= page_size
;
156 for (unsigned int ix
= 0; ix
< pages
.size(); ++ix
)
162 ZPageSet zp_set1
{iovcnt
}; // random data
163 ZPageSet zp_set2
{iovcnt
}; // random data in 64K pages
172 int ret
= librgw_create(&rgw
, saved_args
.argc
, saved_args
.argv
);
174 ASSERT_NE(rgw
, nullptr);
177 TEST(LibRGW
, MOUNT
) {
178 int ret
= rgw_mount2(rgw
, userid
.c_str(), access_key
.c_str(),
179 secret_key
.c_str(), "/", &fs
, RGW_MOUNT_FLAG_NONE
);
181 ASSERT_NE(fs
, nullptr);
184 TEST(LibRGW
, CREATE_BUCKET
) {
187 struct rgw_file_handle
*fh
;
189 st
.st_uid
= owner_uid
;
190 st
.st_gid
= owner_gid
;
193 int ret
= rgw_mkdir(fs
, fs
->root_fh
, bucket_name
.c_str(), &st
, create_mask
,
194 &fh
, RGW_MKDIR_FLAG_NONE
);
199 TEST(LibRGW
, LOOKUP_BUCKET
) {
200 int ret
= rgw_lookup(fs
, fs
->root_fh
, bucket_name
.c_str(), &bucket_fh
,
201 nullptr, 0, RGW_LOOKUP_FLAG_NONE
);
205 TEST(LibRGW
, LOOKUP_OBJECT
) {
206 int ret
= rgw_lookup(fs
, bucket_fh
, object_name
.c_str(), &object_fh
,
207 nullptr, 0, RGW_LOOKUP_FLAG_CREATE
);
212 TEST(LibRGW
, OPEN1
) {
213 int ret
= rgw_open(fs
, object_fh
, 0 /* posix flags */, RGW_OPEN_FLAG_NONE
);
217 TEST(LibRGW
, PUT_OBJECT
) {
219 struct iovec
*iovs
= zp_set1
.get_iovs();
221 for (int ix
: {0, 1}) {
222 struct iovec
*iov
= &iovs
[ix
];
224 sprintf(static_cast<char*>(iov
->iov_base
), "::hi mom (%d)", ix
);
226 int ret
= rgw_write(fs
, object_fh
, offset
, iov
->iov_len
, &nbytes
,
227 iov
->iov_base
, RGW_WRITE_FLAG_NONE
);
228 offset
+= iov
->iov_len
;
230 ASSERT_EQ(nbytes
, iov
->iov_len
);
234 TEST(LibRGW
, CLOSE1
) {
235 int ret
= rgw_close(fs
, object_fh
, RGW_CLOSE_FLAG_NONE
);
239 TEST(LibRGW
, OPEN2
) {
240 int ret
= rgw_open(fs
, object_fh
, 0 /* posix flags */, RGW_OPEN_FLAG_NONE
);
244 TEST(LibRGW
, GET_OBJECT
) {
247 struct iovec
*iovs
= zp_set1
.get_iovs();
248 for (int ix
: {2 , 3}) {
249 struct iovec
*iov
= &iovs
[ix
];
250 int ret
= rgw_read(fs
, object_fh
, offset
, iovs
[ix
-2].iov_len
, &nread
,
251 iov
->iov_base
, RGW_READ_FLAG_NONE
);
252 iov
->iov_len
= nread
;
253 offset
+= iov
->iov_len
;
255 ASSERT_EQ(nread
, iovs
[ix
-2].iov_len
);
256 std::cout
<< "read: " << static_cast<char*>(iov
->iov_base
) << std::endl
;
260 TEST(LibRGW
, CLOSE2
) {
261 int ret
= rgw_close(fs
, object_fh
, RGW_CLOSE_FLAG_NONE
);
266 TEST (LibRGW
, LARGE1
) {
270 ret
= rgw_open(fs
, object_fh
, 0 /* posix flags */, RGW_OPEN_FLAG_NONE
);
274 struct iovec
*iovs
= zp_set1
.get_iovs();
277 for (int ix
= 0; ix
< iovcnt
; ++ix
) {
278 struct iovec
*iov
= &iovs
[ix
];
279 // write iov->iov_len
280 ret
= rgw_write(fs
, object_fh
, offset
, iov
->iov_len
, &nbytes
,
281 iov
->iov_base
, RGW_WRITE_FLAG_NONE
);
282 offset
+= iov
->iov_len
;
284 ASSERT_EQ(nbytes
, iov
->iov_len
);
287 ret
= rgw_close(fs
, object_fh
, RGW_CLOSE_FLAG_NONE
);
292 TEST (LibRGW
, LARGE2
) {
296 ret
= rgw_open(fs
, object_fh
, 0 /* posix flags */, RGW_OPEN_FLAG_NONE
);
301 struct iovec
*iovs2
= zp_set2
.get_iovs();
302 for (int ix
= 0; ix
< iovcnt
; ++ix
) {
303 struct iovec
*iov2
= &iovs2
[ix
];
304 ret
= rgw_read(fs
, object_fh
, offset2
, iov2
->iov_len
, &nread
,
305 iov2
->iov_base
, RGW_READ_FLAG_NONE
);
306 iov2
->iov_len
= nread
;
307 offset2
+= iov2
->iov_len
;
312 ASSERT_TRUE(zp_set1
== zp_set2
);
314 ret
= rgw_close(fs
, object_fh
, RGW_CLOSE_FLAG_NONE
);
320 TEST(LibRGW
, STAT_OBJECT
) {
322 int ret
= rgw_getattr(fs
, object_fh
, &st
, RGW_GETATTR_FLAG_NONE
);
324 dout(15) << "rgw_getattr on " << object_name
<< " size = "
325 << st
.st_size
<< dendl
;
328 TEST(LibRGW
, DELETE_OBJECT
) {
330 int ret
= rgw_unlink(fs
, bucket_fh
, object_name
.c_str(),
331 RGW_UNLINK_FLAG_NONE
);
336 TEST(LibRGW
, DELETE_BUCKET
) {
338 int ret
= rgw_unlink(fs
, fs
->root_fh
, bucket_name
.c_str(),
339 RGW_UNLINK_FLAG_NONE
);
344 TEST(LibRGW
, CLEANUP
) {
347 ret
= rgw_fh_rele(fs
, object_fh
, RGW_FH_RELE_FLAG_NONE
);
350 ret
= rgw_fh_rele(fs
, bucket_fh
, 0 /* flags */);
354 TEST(LibRGW
, UMOUNT
) {
358 int ret
= rgw_umount(fs
, RGW_UMOUNT_FLAG_NONE
);
362 TEST(LibRGW
, SHUTDOWN
) {
363 librgw_shutdown(rgw
);
366 int main(int argc
, char *argv
[])
370 vector
<const char*> args
;
372 argv_to_vec(argc
, const_cast<const char**>(argv
), args
);
375 v
= getenv("AWS_ACCESS_KEY_ID");
380 v
= getenv("AWS_SECRET_ACCESS_KEY");
385 for (auto arg_iter
= args
.begin(); arg_iter
!= args
.end();) {
386 if (ceph_argparse_witharg(args
, arg_iter
, &val
, "--access",
389 } else if (ceph_argparse_witharg(args
, arg_iter
, &val
, "--secret",
392 } else if (ceph_argparse_witharg(args
, arg_iter
, &val
, "--userid",
395 } else if (ceph_argparse_witharg(args
, arg_iter
, &val
, "--bn",
398 } else if (ceph_argparse_witharg(args
, arg_iter
, &val
, "--uid",
400 owner_uid
= std::stoi(val
);
401 } else if (ceph_argparse_witharg(args
, arg_iter
, &val
, "--gid",
403 owner_gid
= std::stoi(val
);
404 } else if (ceph_argparse_flag(args
, arg_iter
, "--verify",
407 } else if (ceph_argparse_flag(args
, arg_iter
, "--create",
410 } else if (ceph_argparse_flag(args
, arg_iter
, "--delete",
413 } else if (ceph_argparse_flag(args
, arg_iter
, "--large",
416 } else if (ceph_argparse_flag(args
, arg_iter
, "--hexdump",
424 /* don't accidentally run as anonymous */
425 if ((access_key
== "") ||
426 (secret_key
== "")) {
427 std::cout
<< argv
[0] << " no AWS credentials, exiting" << std::endl
;
431 saved_args
.argc
= argc
;
432 saved_args
.argv
= argv
;
434 ::testing::InitGoogleTest(&argc
, argv
);
435 return RUN_ALL_TESTS();