From: zhang Shaowen Date: Tue, 8 Oct 2019 06:15:56 +0000 (+0800) Subject: rgw: add abort multipart date and rule-id header to init multipart upload response. X-Git-Tag: v15.2.5~49^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=77e4dc98ae0a08794725dd2961a8c38c76e11488;p=ceph.git rgw: add abort multipart date and rule-id header to init multipart upload response. Signed-off-by: zhang Shaowen (cherry picked from commit 4bb2a0164be3dd69e28972bcb39f0892a4360bba) --- diff --git a/src/rgw/rgw_lc.cc b/src/rgw/rgw_lc.cc index dea19cbe33a..5706059d323 100644 --- a/src/rgw/rgw_lc.cc +++ b/src/rgw/rgw_lc.cc @@ -1955,4 +1955,71 @@ std::string s3_expiration_header( } /* rgwlc_s3_expiration_header */ +bool s3_multipart_abort_header( + DoutPrefixProvider* dpp, + const rgw_obj_key& obj_key, + const ceph::real_time& mtime, + const std::map& bucket_attrs, + ceph::real_time& abort_date, + std::string& rule_id) +{ + CephContext* cct = dpp->get_cct(); + RGWLifecycleConfiguration config(cct); + + const auto& aiter = bucket_attrs.find(RGW_ATTR_LC); + if (aiter == bucket_attrs.end()) + return false; + + bufferlist::const_iterator iter{&aiter->second}; + try { + config.decode(iter); + } catch (const buffer::error& e) { + ldpp_dout(dpp, 0) << __func__ + << "() decode life cycle config failed" + << dendl; + return false; + } /* catch */ + + boost::optional abort_date_tmp; + boost::optional rule_id_tmp; + const auto& rule_map = config.get_rule_map(); + for (const auto& ri : rule_map) { + const auto& rule = ri.second; + auto& id = rule.get_id(); + auto& filter = rule.get_filter(); + auto& prefix = filter.has_prefix()?filter.get_prefix():rule.get_prefix(); + auto& mp_expiration = rule.get_mp_expiration(); + if (!rule.is_enabled()) { + continue; + } + if(!prefix.empty() && !boost::starts_with(obj_key.name, prefix)) { + continue; + } + + boost::optional rule_abort_date; + const LCExpiration& rule_abort_multipart =mp_expiration; + if (rule_abort_multipart.has_days()) { + rule_abort_date = boost::optional( + mtime + make_timespan(rule_abort_multipart.get_days()*24*60*60)); + } + + // update earliest abort date + if (rule_abort_date) { + if ((! abort_date_tmp) || + (*abort_date_tmp > *rule_abort_date)) { + abort_date_tmp = + boost::optional(rule_abort_date); + rule_id_tmp = boost::optional(id); + } + } + } + if (abort_date_tmp && rule_id_tmp) { + abort_date = *abort_date_tmp; + rule_id = *rule_id_tmp; + return true; + } else { + return false; + } +} + } /* namespace rgw::lc */ diff --git a/src/rgw/rgw_lc.h b/src/rgw/rgw_lc.h index 57f02a63e81..e6a9b473053 100644 --- a/src/rgw/rgw_lc.h +++ b/src/rgw/rgw_lc.h @@ -533,6 +533,14 @@ std::string s3_expiration_header( const ceph::real_time& mtime, const std::map& bucket_attrs); +bool s3_multipart_abort_header( + DoutPrefixProvider* dpp, + const rgw_obj_key& obj_key, + const ceph::real_time& mtime, + const std::map& bucket_attrs, + ceph::real_time& abort_date, + std::string& rule_id); + } // namespace rgw::lc #endif diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index f1cac382144..c810a45dc38 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -5973,6 +5973,7 @@ void RGWInitMultipart::execute() obj_op.meta.owner = s->owner.get_id(); obj_op.meta.category = RGWObjCategory::MultiMeta; obj_op.meta.flags = PUT_OBJ_CREATE_EXCL; + obj_op.meta.mtime = &mtime; multipart_upload_info upload_info; upload_info.dest_placement = s->dest_placement; diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index dc554a37b71..494e6c1611a 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -1717,6 +1717,7 @@ class RGWInitMultipart : public RGWOp { protected: string upload_id; RGWAccessControlPolicy policy; + ceph::real_time mtime; public: RGWInitMultipart() {} diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 0de040968c7..c7bad174a1a 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -106,6 +106,14 @@ static inline std::string get_s3_expiration_header( s, s->object, s->tagset, mtime, s->bucket_attrs); } +static inline bool get_s3_multipart_abort_header( + struct req_state* s, const ceph::real_time& mtime, + ceph::real_time& date, std::string& rule_id) +{ + return rgw::lc::s3_multipart_abort_header( + s, s->object, mtime, s->bucket_attrs, date, rule_id); +} + struct response_attr_param { const char *param; const char *http_attr; @@ -3685,6 +3693,13 @@ void RGWInitMultipart_ObjStore_S3::send_response() dump_errno(s); for (auto &it : crypt_http_responses) dump_header(s, it.first, it.second); + ceph::real_time abort_date; + string rule_id; + bool exist_multipart_abort = get_s3_multipart_abort_header(s, mtime, abort_date, rule_id); + if (exist_multipart_abort) { + dump_time_header(s, "x-amz-abort-date", abort_date); + dump_header_if_nonempty(s, "x-amz-abort-rule-id", rule_id); + } end_header(s, this, "application/xml"); if (op_ret == 0) { dump_start(s);