return 0;
}
+static int decode_olh_info(CephContext* cct, const bufferlist& bl, RGWOLHInfo *olh)
+{
+ try {
+ auto biter = bl.cbegin();
+ decode(*olh, biter);
+ return 0;
+ } catch (buffer::error& err) {
+ ldout(cct, 0) << "ERROR: failed to decode olh info" << dendl;
+ return -EIO;
+ }
+}
+
int RGWRados::apply_olh_log(RGWObjectCtx& obj_ctx, RGWObjState& state, const RGWBucketInfo& bucket_info, const rgw_obj& obj,
bufferlist& olh_tag, map<uint64_t, vector<rgw_bucket_olh_log_entry> >& log,
uint64_t *plast_ver, rgw_zone_set* zones_trace)
int RGWRados::get_olh(const RGWBucketInfo& bucket_info, const rgw_obj& obj, RGWOLHInfo *olh)
{
- map<string, bufferlist> unfiltered_attrset;
+ map<string, bufferlist> attrset;
ObjectReadOperation op;
- op.getxattrs(&unfiltered_attrset, NULL);
+ op.getxattrs(&attrset, NULL);
- bufferlist outbl;
int r = obj_operate(bucket_info, obj, &op);
-
if (r < 0) {
return r;
}
- map<string, bufferlist> attrset;
- rgw_filter_attrset(unfiltered_attrset, RGW_ATTR_OLH_PREFIX, &attrset);
-
- map<string, bufferlist>::iterator iter = attrset.find(RGW_ATTR_OLH_INFO);
+ auto iter = attrset.find(RGW_ATTR_OLH_INFO);
if (iter == attrset.end()) { /* not an olh */
return -EINVAL;
}
- try {
- auto biter = iter->second.cbegin();
- decode(*olh, biter);
- } catch (buffer::error& err) {
- ldout(cct, 0) << "ERROR: failed to decode olh info" << dendl;
- return -EIO;
- }
-
- return 0;
+ return decode_olh_info(cct, iter->second, olh);
}
void RGWRados::check_pending_olh_entries(map<string, bufferlist>& pending_entries,
}
}
- map<string, bufferlist>::iterator iter = state->attrset.find(RGW_ATTR_OLH_INFO);
- ceph_assert(iter != state->attrset.end());
+ auto iter = state->attrset.find(RGW_ATTR_OLH_INFO);
+ if (iter == state->attrset.end()) {
+ return -EINVAL;
+ }
+
RGWOLHInfo olh;
- try {
- auto biter = iter->second.cbegin();
- decode(olh, biter);
- } catch (buffer::error& err) {
- ldout(cct, 0) << "ERROR: failed to decode olh info" << dendl;
- return -EIO;
+ int ret = decode_olh_info(cct, iter->second, &olh);
+ if (ret < 0) {
+ return ret;
}
if (olh.removed) {