#include "rgw_client_io.h"
#include "common/errno.h"
+#define LOG_CLASS_LIST_MAX_ENTRIES (1000)
#define dout_subsys ceph_subsys_rgw
static int parse_date_str(string& in, utime_t& out) {
void RGWOp_MDLog_List::execute() {
string shard = s->info.args.get("id");
-
+ string max_entries_str = s->info.args.get("max-entries");
string st = s->info.args.get("start-time"),
et = s->info.args.get("end-time"),
+ marker = s->info.args.get("marker"),
err;
utime_t ut_st,
ut_et;
void *handle;
- int shard_id;
+ unsigned shard_id, max_entries = 0;
- shard_id = strict_strtol(shard.c_str(), 10, &err);
+ shard_id = (unsigned)strict_strtol(shard.c_str(), 10, &err);
if (!err.empty()) {
dout(5) << "Error parsing shard_id " << shard << dendl;
http_ret = -EINVAL;
return;
}
+ if (!max_entries_str.empty()) {
+ max_entries = (unsigned)strict_strtol(max_entries_str.c_str(), 10, &err);
+ if (!err.empty()) {
+ dout(5) << "Error parsing max-entries " << max_entries_str << dendl;
+ http_ret = -EINVAL;
+ return;
+ }
+ } else
+ max_entries = LOG_CLASS_LIST_MAX_ENTRIES;
+
RGWMetadataLog *meta_log = store->meta_mgr->get_log();
- meta_log->init_list_entries(shard_id, ut_st, ut_et, &handle);
+ meta_log->init_list_entries(shard_id, ut_st, ut_et, marker, &handle);
bool truncated;
+ do {
+ http_ret = meta_log->list_entries(handle, max_entries, entries, &truncated);
+ if (http_ret < 0)
+ break;
- http_ret = meta_log->list_entries(handle, 1000, entries, &truncated);
+ if (!max_entries_str.empty())
+ max_entries -= entries.size();
+ } while (truncated && (max_entries > 0));
}
void RGWOp_MDLog_List::send_response() {
err;
utime_t ut_st,
ut_et;
- int shard_id;
+ unsigned shard_id;
http_ret = 0;
- shard_id = strict_strtol(shard.c_str(), 10, &err);
+ shard_id = (unsigned)strict_strtol(shard.c_str(), 10, &err);
if (!err.empty()) {
dout(5) << "Error parsing shard_id " << shard << dendl;
http_ret = -EINVAL;
void RGWOp_MDLog_Lock::execute() {
string shard_id_str, duration_str, lock_id;
- int shard_id;
+ unsigned shard_id;
http_ret = 0;
}
string err;
- shard_id = strict_strtol(shard_id_str.c_str(), 10, &err);
+ shard_id = (unsigned)strict_strtol(shard_id_str.c_str(), 10, &err);
if (!err.empty()) {
dout(5) << "Error parsing shard_id param " << shard_id_str << dendl;
http_ret = -EINVAL;
}
RGWMetadataLog *meta_log = store->meta_mgr->get_log();
- int dur;
- dur = strict_strtol(duration_str.c_str(), 10, &err);
+ unsigned dur;
+ dur = (unsigned)strict_strtol(duration_str.c_str(), 10, &err);
if (!err.empty() || dur <= 0) {
dout(5) << "invalid length param " << duration_str << dendl;
http_ret = -EINVAL;
void RGWOp_MDLog_Unlock::execute() {
string shard_id_str, lock_id;
- int shard_id;
+ unsigned shard_id;
http_ret = 0;
}
string err;
- shard_id = strict_strtol(shard_id_str.c_str(), 10, &err);
+ shard_id = (unsigned)strict_strtol(shard_id_str.c_str(), 10, &err);
if (!err.empty()) {
dout(5) << "Error parsing shard_id param " << shard_id_str << dendl;
http_ret = -EINVAL;
marker = s->info.args.get("marker"),
max_entries_str = s->info.args.get("max-entries");
RGWBucketInfo bucket_info;
- int max_entries;
+ unsigned max_entries;
if (bucket_name.empty()) {
dout(5) << "ERROR: bucket not specified" << dendl;
}
bool truncated;
- int count = 0;
+ unsigned count = 0;
string err;
- max_entries = strict_strtol(max_entries_str.c_str(), 10, &err);
+ max_entries = (unsigned)strict_strtol(max_entries_str.c_str(), 10, &err);
if (!err.empty())
- max_entries = 1000;
+ max_entries = LOG_CLASS_LIST_MAX_ENTRIES;
send_response();
do {
string st = s->info.args.get("start-time"),
et = s->info.args.get("end-time"),
+ max_entries_str = s->info.args.get("max-entries"),
+ marker = s->info.args.get("marker"),
err;
utime_t ut_st,
ut_et;
- int shard_id;
+ unsigned shard_id, max_entries = 0;
- shard_id = strict_strtol(shard.c_str(), 10, &err);
+ shard_id = (unsigned)strict_strtol(shard.c_str(), 10, &err);
if (!err.empty()) {
dout(5) << "Error parsing shard_id " << shard << dendl;
http_ret = -EINVAL;
return;
}
- string marker;
- bool truncated;
-#define DATALOG_LIST_MAX_ENTRIES 1000
+ if (!max_entries_str.empty()) {
+ max_entries = (unsigned)strict_strtol(max_entries_str.c_str(), 10, &err);
+ if (!err.empty()) {
+ dout(5) << "Error parsing max-entries " << max_entries_str << dendl;
+ http_ret = -EINVAL;
+ return;
+ }
+ } else
+ max_entries = LOG_CLASS_LIST_MAX_ENTRIES;
- http_ret = store->data_log->list_entries(shard_id, ut_st, ut_et,
- DATALOG_LIST_MAX_ENTRIES, entries, marker, &truncated);
+ bool truncated;
+ do {
+ http_ret = store->data_log->list_entries(shard_id, ut_st, ut_et,
+ max_entries, entries, marker, &truncated);
+ if (http_ret < 0)
+ break;
+
+ if (!max_entries_str.empty())
+ max_entries -= entries.size();
+ } while (truncated && (max_entries > 0));
}
void RGWOp_DATALog_List::send_response() {
void RGWOp_DATALog_Lock::execute() {
string shard_id_str, duration_str, lock_id;
- int shard_id;
+ unsigned shard_id;
http_ret = 0;
}
string err;
- shard_id = strict_strtol(shard_id_str.c_str(), 10, &err);
+ shard_id = (unsigned)strict_strtol(shard_id_str.c_str(), 10, &err);
if (!err.empty()) {
dout(5) << "Error parsing shard_id param " << shard_id_str << dendl;
http_ret = -EINVAL;
return;
}
- int dur;
- dur = strict_strtol(duration_str.c_str(), 10, &err);
+ unsigned dur;
+ dur = (unsigned)strict_strtol(duration_str.c_str(), 10, &err);
if (!err.empty() || dur <= 0) {
dout(5) << "invalid length param " << duration_str << dendl;
http_ret = -EINVAL;
void RGWOp_DATALog_Unlock::execute() {
string shard_id_str, lock_id;
- int shard_id;
+ unsigned shard_id;
http_ret = 0;
}
string err;
- shard_id = strict_strtol(shard_id_str.c_str(), 10, &err);
+ shard_id = (unsigned)strict_strtol(shard_id_str.c_str(), 10, &err);
if (!err.empty()) {
dout(5) << "Error parsing shard_id param " << shard_id_str << dendl;
http_ret = -EINVAL;
err;
utime_t ut_st,
ut_et;
- int shard_id;
+ unsigned shard_id;
http_ret = 0;
- shard_id = strict_strtol(shard.c_str(), 10, &err);
+ shard_id = (unsigned)strict_strtol(shard.c_str(), 10, &err);
if (!err.empty()) {
dout(5) << "Error parsing shard_id " << shard << dendl;
http_ret = -EINVAL;
EXPECT_EQ((*it).key.compare(TEST_BUCKET_NAME), 0);
}
+ ss.str("");
+ ss << "/admin/log?type=data&id=" << shard_id << "&start-time=" << start_time
+ << "&max-entries=1";
+ rest_req = ss.str();
+ g_test->send_request(string("GET"), rest_req);
+ EXPECT_EQ(200U, g_test->get_resp_code());
+ entries.clear();
+ get_datalog_list(entries);
+ EXPECT_EQ(1U, entries.size());
+
ss.str("");
ss << "/admin/log?type=data&id=" << shard_id << "&start-time=" << start_time
<< "&end-time=" << end_time;
EXPECT_EQ(get_log_list(entries), 0);
EXPECT_EQ(entries.size(), 14U);
+ ss.str("");
+ ss << "/admin/log?type=metadata&id=" << shard_id << "&start-time=" << start_time
+ << "&max-entries=" << 1;
+ rest_req = ss.str();
+ g_test->send_request(string("GET"), rest_req);
+ EXPECT_EQ(200U, g_test->get_resp_code());
+ entries.clear();
+ EXPECT_EQ(get_log_list(entries), 0);
+ EXPECT_EQ(entries.size(), 1U);
+
+ ss.str("");
+ ss << "/admin/log?type=metadata&id=" << shard_id << "&start-time=" << start_time
+ << "&max-entries=" << 6;
+ rest_req = ss.str();
+ g_test->send_request(string("GET"), rest_req);
+ EXPECT_EQ(200U, g_test->get_resp_code());
+ entries.clear();
+ EXPECT_EQ(get_log_list(entries), 0);
+ EXPECT_EQ(entries.size(), 6U);
ASSERT_EQ(0, caps_rm(cname, perm));
ss.str("");