}
}
+static string escape_str(const string& s)
+{
+ int len = escape_json_attr_len(s.c_str(), s.size());
+ char escaped[len];
+ escape_json_attr(s.c_str(), s.size(), escaped);
+ return string(escaped);
+}
+
/*
* list index key structure:
*
* <obj name>\0[v<ver>\0i<instance id>]
*/
-static void decode_list_index_key(const string& index_key, cls_rgw_obj_key *key, uint64_t *ver)
+static int decode_list_index_key(const string& index_key, cls_rgw_obj_key *key, uint64_t *ver)
{
size_t len = strlen(index_key.c_str());
if (len == index_key.size()) {
key->name = index_key;
- return;
+ return 0;
}
list<string> vals;
split_key(index_key, vals);
- assert(!vals.empty());
+ if (vals.empty()) {
+ CLS_LOG(0, "ERROR: %s(): bad index_key (%s): split_key() returned empty vals", __func__, escape_str(index_key).c_str());
+ return -EIO;
+ }
list<string>::iterator iter = vals.begin();
key->name = *iter;
++iter;
- assert(iter != vals.end());
+ if (iter == vals.end()) {
+ CLS_LOG(0, "ERROR: %s(): bad index_key (%s): no vals", __func__, escape_str(index_key).c_str());
+ return -EIO;
+ }
for (; iter != vals.end(); ++iter) {
string& val = *iter;
string err;
const char *s = val.c_str() + 1;
*ver = strict_strtoll(s, 10, &err);
- assert(err.empty());
+ if (!err.empty()) {
+ CLS_LOG(0, "ERROR: %s(): bad index_key (%s): could not parse val (v=%s)", __func__, escape_str(index_key).c_str(), s);
+ return -EIO;
+ }
}
}
+
+ return 0;
}
static int read_bucket_header(cls_method_context_t hctx, struct rgw_bucket_dir_header *header)
cls_rgw_obj_key key;
uint64_t ver;
- decode_list_index_key(kiter->first, &key, &ver);
start_key = kiter->first;
CLS_LOG(20, "start_key=%s len=%zu", start_key.c_str(), start_key.size());
+ int ret = decode_list_index_key(kiter->first, &key, &ver);
+ if (ret < 0) {
+ CLS_LOG(0, "ERROR: failed to decode list index key (%s)\n", escape_str(kiter->first).c_str());
+ continue;
+ }
+
if (!entry.is_valid()) {
CLS_LOG(20, "entry %s[%s] is not valid\n", key.name.c_str(), key.instance.c_str());
continue;
dest.total_size += s.second.total_size;
dest.total_size_rounded += s.second.total_size_rounded;
dest.num_entries += s.second.num_entries;
+ dest.actual_size += s.second.actual_size;
}
}
log.push_back(log_entry);
}
-static string escape_str(const string& s)
-{
- int len = escape_json_attr_len(s.c_str(), s.size());
- char escaped[len];
- escape_json_attr(s.c_str(), s.size(), escaped);
- return string(escaped);
-}
-
static int write_obj_instance_entry(cls_method_context_t hctx, struct rgw_bucket_dir_entry& instance_entry, const string& instance_idx)
{
CLS_LOG(20, "write_entry() instance=%s idx=%s flags=%d", escape_str(instance_entry.key.instance).c_str(), instance_idx.c_str(), instance_entry.flags);
get_time_key(now, &now_str);
prepend_index_prefix(now_str, GC_OBJ_TIME_INDEX, &end_key);
- CLS_LOG(0, "gc_iterate_entries end_key=%s\n", end_key.c_str());
+ CLS_LOG(10, "gc_iterate_entries end_key=%s\n", end_key.c_str());
}
string filter;