(void) CLSRGWIssueBucketIndexClean(index_pool,
bucket_objs,
cct->_conf->rgw_bucket_index_max_aio)();
+ } else {
+ bucket_info.deleted = true;
+ map<string, bufferlist> attrs;
+ r = put_bucket_instance_info(bucket_info, false, real_time(), &attrs, dpp, y);
+ if (r < 0) {
+ ldpp_dout(dpp, 0) << "WARNING: put_bucket_info on bucket=" << bucket_info.bucket.name << " returned err=" << r << dendl;
+ }
}
return 0;
return 0;
}
+
public:
BucketTrimInstanceCR(rgw::sal::RadosStore* store, RGWHTTPManager *http,
BucketTrimObserver *observer,
<< cpp_strerror(retcode) << dendl;
return set_cr_error(retcode);
}
+
+ //remove bucket instance metadata
+ if (clean_info->first.layout.logs.front().layout.type == rgw::BucketLogType::Deleted) {
+ retcode = store->ctl()->bucket->remove_bucket_instance_info(bucket, clean_info->first, null_yield, dpp);
+ if (retcode < 0) {
+ ldpp_dout(dpp, 0) << "failed to remove instance bucket info: "
+ << cpp_strerror(retcode) << dendl;
+ return set_cr_error(retcode);
+ }
+ }
+
clean_info = std::nullopt;
}
} else {
if (totrim.layout.type != rgw::BucketLogType::InIndex) {
- ldpp_dout(dpp, 0) << "Unable to convert log of unknown type "
- << totrim.layout.type
- << " to rgw::bucket_index_layout_generation " << dendl;
- return set_cr_error(-EINVAL);
+ ldpp_dout(dpp, 0) << "Unable to convert log of unknown type "
+ << totrim.layout.type
+ << " to rgw::bucket_index_layout_generation " << dendl;
+ return set_cr_error(-EINVAL);
}
// To avoid hammering the OSD too hard, either trim old
// generations OR trim the current one.
{
switch (t) {
case BucketLogType::InIndex: return "InIndex";
+ case BucketLogType::Deleted: return "Deleted";
default: return "Unknown";
}
}
t = BucketLogType::InIndex;
return true;
}
+ if (boost::iequals(str, "Deleted")) {
+ t = BucketLogType::Deleted;
+ return true;
+ }
return false;
}
void encode_json_impl(const char *name, const BucketLogType& t, ceph::Formatter *f)
case BucketLogType::InIndex:
encode(l.in_index, bl);
break;
+ case BucketLogType::Deleted:
+ break;
}
ENCODE_FINISH(bl);
}
case BucketLogType::InIndex:
decode(l.in_index, bl);
break;
+ case BucketLogType::Deleted:
+ break;
}
DECODE_FINISH(bl);
}
void decode_json_obj(bucket_log_layout& l, JSONObj *obj)
{
JSONDecoder::decode_json("type", l.type, obj);
- JSONDecoder::decode_json("in_index", l.in_index, obj);
+ if (l.type == BucketLogType::InIndex) {
+ JSONDecoder::decode_json("in_index", l.in_index, obj);
+ }
}
// bucket_log_layout_generation
enum class BucketLogType : uint8_t {
// colocated with bucket index, so the log layout matches the index layout
InIndex,
+ Deleted
};
std::string_view to_string(const BucketLogType& t);
switch (log_type) {
case BucketLogType::InIndex:
return out << "InIndex";
+ case BucketLogType::Deleted:
+ return out << "Deleted";
default:
return out << "Unknown";
}
return [gen] (const bucket_log_layout_generation& l) { return l.gen == gen; };
}
+inline bucket_log_layout_generation log_layout_from_deleted_index(
+ uint64_t gen, const bucket_index_layout_generation& index)
+{
+ return {gen, {BucketLogType::Deleted, {index.gen, index.layout.normal}}};
+}
+
inline bucket_index_layout_generation log_to_index_layout(const bucket_log_layout_generation& log_layout)
{
ceph_assert(log_layout.layout.type == BucketLogType::InIndex);
encode_json("mdsearch_config", mdsearch_config, f);
encode_json("reshard_status", (int)reshard_status, f);
encode_json("new_bucket_instance_id", new_bucket_instance_id, f);
+ encode_json("deleted", deleted, f);
if (!empty_sync_policy()) {
encode_json("sync_policy", *sync_policy, f);
}
int rs;
JSONDecoder::decode_json("reshard_status", rs, obj);
reshard_status = (cls_rgw_reshard_status)rs;
+ JSONDecoder::decode_json("deleted", deleted, obj);
+
rgw_sync_policy_info sp;
JSONDecoder::decode_json("sync_policy", sp, obj);
if (!sp.empty()) {
bool has_instance_obj{false};
RGWObjVersionTracker objv_tracker; /* we don't need to serialize this, for runtime tracking */
RGWQuotaInfo quota;
+ bool deleted{false};
// layout of bucket index objects
rgw::BucketLayout layout;
int ret = find_handler(metadata_key, &handler, entry);
if (ret < 0) {
+ ldout(cct, 10) << "ERROR: " << __func__ << "(): find_handler returned: ret=" << ret << dendl;
return ret;
}
RGWMetadataObject *obj;
ret = handler->get(entry, &obj, y, dpp);
if (ret < 0) {
+ ldout(cct, 10) << "ERROR: " << __func__ << "(): handler->get() returned: ret=" << ret << dendl;
return ret;
}
RGWObjVersionTracker objv_tracker;