if (pkeys->empty())
return 0;
- map<string, bufferlist>::reverse_iterator last_element = pkeys->rbegin();
+ auto last_element = pkeys->rbegin();
if ((unsigned char)last_element->first[0] < BI_PREFIX_CHAR) {
/* nothing to see here, move along */
return 0;
}
- map<string, bufferlist>::iterator first_element = pkeys->begin();
+ auto first_element = pkeys->begin();
if ((unsigned char)first_element->first[0] > BI_PREFIX_CHAR) {
return 0;
}
/* let's rebuild the list, only keep entries we're interested in */
- map<string, bufferlist> old_keys;
- old_keys.swap(*pkeys);
+ auto comp = [](const pair<string, bufferlist>& l, const string &r) { return l.first < r; };
+ string new_start = {static_cast<char>(BI_PREFIX_CHAR + 1)};
- for (map<string, bufferlist>::iterator iter = old_keys.begin(); iter != old_keys.end(); ++iter) {
- if ((unsigned char)iter->first[0] != BI_PREFIX_CHAR) {
- (*pkeys)[iter->first] = iter->second;
- }
- }
+ auto lower = pkeys->lower_bound(string{static_cast<char>(BI_PREFIX_CHAR)});
+ auto upper = std::lower_bound(lower, pkeys->end(), new_start, comp);
+ pkeys->erase(lower, upper);
if (num_entries == (int)pkeys->size())
return 0;
map<string, bufferlist> new_keys;
- char c[] = { (char)(BI_PREFIX_CHAR + 1), 0 };
- string new_start = c;
/* now get some more keys */
ret = cls_cxx_map_get_vals(hctx, new_start, filter_prefix, num_entries - pkeys->size(), &new_keys, pmore);
if (ret < 0)
return ret;
- for (map<string, bufferlist>::iterator iter = new_keys.begin(); iter != new_keys.end(); ++iter) {
- (*pkeys)[iter->first] = iter->second;
- }
-
+ pkeys->insert(std::make_move_iterator(new_keys.begin()),
+ std::make_move_iterator(new_keys.end()));
return 0;
}
if (ret < 0 && ret != -ENOENT)
return -EINVAL;
+ if (ret == -ENOENT) {
+ continue;
+ }
+
if (cur_disk_bl.length()) {
bufferlist::iterator cur_disk_iter = cur_disk_bl.begin();
try {
}
break;
case CEPH_RGW_UPDATE:
- if (!cur_disk.exists) {
- // this update would only have been sent by the rgw client
- // if the rgw_bucket_dir_entry existed, however between that
- // check and now the entry has diappeared, so we were likely
- // in the midst of a delete op, and we will not recreate the
- // entry
- CLS_LOG(10,
- "CEPH_RGW_UPDATE not applied because rgw_bucket_dir_entry"
- " no longer exists\n");
- break;
- }
-
CLS_LOG(10, "CEPH_RGW_UPDATE name=%s instance=%s total_entries: %" PRId64 " -> %" PRId64 "\n",
cur_change.key.name.c_str(), cur_change.key.instance.c_str(), stats.num_entries, stats.num_entries + 1);
}
op_ret.is_truncated = (count >= max) || more;
- while (count >= max) {
+ while (count > max) {
op_ret.entries.pop_back();
count--;
}
CLS_LOG(10, "gc_iterate_entries key=%s\n", key.c_str());
- if (!end_key.empty() && key.compare(end_key) >= 0)
+ if (!end_key.empty() && key.compare(end_key) >= 0) {
+ if (truncated)
+ *truncated = false;
return 0;
+ }
if (!key_in_index(key, GC_OBJ_TIME_INDEX))
return 0;