]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: add abort multipart date and rule-id header to init multipart upload response.
authorzhang Shaowen <zhangshaowen@cmss.chinamobile.com>
Tue, 8 Oct 2019 06:15:56 +0000 (14:15 +0800)
committerzhangshaowen <zhangshaowen@cmss.chinamobile.com>
Wed, 6 May 2020 06:06:19 +0000 (14:06 +0800)
Signed-off-by: zhang Shaowen <zhangshaowen@cmss.chinamobile.com>
src/rgw/rgw_lc.cc
src/rgw/rgw_lc.h
src/rgw/rgw_op.cc
src/rgw/rgw_op.h
src/rgw/rgw_rest_s3.cc

index a38169655a433b21dfdaf63e49ed81edc9e1bc40..6662ae103175daf7e27caa5a76ee5eba4c578a65 100644 (file)
@@ -1691,4 +1691,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<std::string, buffer::list>& 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<ceph::real_time> abort_date_tmp;
+  boost::optional<std::string> 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<ceph::real_time> rule_abort_date;
+    const LCExpiration& rule_abort_multipart =mp_expiration;
+    if (rule_abort_multipart.has_days()) {
+      rule_abort_date = boost::optional<ceph::real_time>(
+              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<ceph::real_time>(rule_abort_date);
+        rule_id_tmp = boost::optional<std::string>(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 */
index 32de9581664cd143ebc98b224946a39f48d96ee7..b1db533132e5bb154e034c248e295c45bdacabc4 100644 (file)
@@ -522,6 +522,14 @@ std::string s3_expiration_header(
   const ceph::real_time& mtime,
   const std::map<std::string, buffer::list>& bucket_attrs);
 
+bool s3_multipart_abort_header(
+  DoutPrefixProvider* dpp,
+  const rgw_obj_key& obj_key,
+  const ceph::real_time& mtime,
+  const std::map<std::string, buffer::list>& bucket_attrs,
+  ceph::real_time& abort_date,
+  std::string& rule_id);
+
 } // namespace rgw::lc
 
 #endif
index fadba7c73dbe3a637a9c4740a664fd9d65c89849..34530912d2553092bedb259cf40b4a13b5d167c3 100644 (file)
@@ -5945,6 +5945,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;
index 906b26d236996a0d5e70a4a2bbd84e228182e244..1b88311d695f18465a7a2cb42b540f339c56074c 100644 (file)
@@ -1717,6 +1717,7 @@ class RGWInitMultipart : public RGWOp {
 protected:
   string upload_id;
   RGWAccessControlPolicy policy;
+  ceph::real_time mtime;
 
 public:
   RGWInitMultipart() {}
index 532d738b580755e2cb72c079e7241abe5eca2e68..5243038ca1528a164c2cf6924e78cd0d07685f02 100644 (file)
@@ -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;
@@ -3658,6 +3666,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);