rgw_placement_rule *pdest_placement = &s->dest_placement;
if (multipart) {
- s->trace->SetAttribute(tracing::rgw::UPLOAD_ID, multipart_upload_id);
std::unique_ptr<rgw::sal::MultipartUpload> upload;
upload = s->bucket->get_multipart_upload(s->object->get_name(),
multipart_upload_id);
op_ret = upload->get_info(this, s->yield, s->obj_ctx, &pdest_placement);
+
+ s->trace->SetAttribute(tracing::rgw::UPLOAD_ID, multipart_upload_id);
+ multipart_trace = tracing::rgw::tracer.add_span(name(), upload->get_trace());
+
if (op_ret < 0) {
if (op_ret != -ENOENT) {
ldpp_dout(this, 0) << "ERROR: get_multipart_info returned " << op_ret << ": " << cpp_strerror(-op_ret) << dendl;
<< dendl;
return;
}
-
if ((! copy_source.empty()) && !copy_source_range) {
std::unique_ptr<rgw::sal::Bucket> bucket;
op_ret = store->get_bucket(nullptr, copy_source_bucket_info, &bucket);
} else {
lst = copy_source_range_lst;
}
-
fst = copy_source_range_fst;
// no filters by default
void RGWInitMultipart::execute(optional_yield y)
{
- bufferlist aclbl;
+ bufferlist aclbl, tracebl;
rgw::sal::Attrs attrs;
if (get_params(y) < 0)
if (rgw::sal::Object::empty(s->object.get()))
return;
+ if (multipart_trace) {
+ tracing::encode(multipart_trace->GetContext(), tracebl);
+ attrs[RGW_ATTR_TRACE] = tracebl;
+ }
+
policy.encode(aclbl);
attrs[RGW_ATTR_ACL] = aclbl;
upload_id = upload->get_upload_id();
}
s->trace->SetAttribute(tracing::rgw::UPLOAD_ID, upload_id);
+ multipart_trace->UpdateName(tracing::rgw::MULTIPART + upload_id);
}
upload = s->bucket->get_multipart_upload(s->object->get_name(), upload_id);
- s->trace->SetAttribute(tracing::rgw::UPLOAD_ID, upload_id);
-
RGWCompressionInfo cs_info;
bool compressed = false;
uint64_t accounted_size = 0;
<< " ret=" << op_ret << dendl;
return;
}
+ s->trace->SetAttribute(tracing::rgw::UPLOAD_ID, upload_id);
+ jspan_context trace_ctx(false, false);
+ extract_span_context(meta_obj->get_attrs(), trace_ctx);
+ multipart_trace = tracing::rgw::tracer.add_span(name(), trace_ctx);
+
// make reservation for notification if needed
std::unique_ptr<rgw::sal::Notification> res = store->get_notification(meta_obj.get(),
s, rgw::notify::ObjectCreatedCompleteMultipartUpload, &s->object->get_name());
op_ret = -EINVAL;
string upload_id;
upload_id = s->info.args.get("uploadId");
- rgw_obj meta_obj;
+ std::unique_ptr<rgw::sal::Object> meta_obj;
std::unique_ptr<rgw::sal::MultipartUpload> upload;
if (upload_id.empty() || rgw::sal::Object::empty(s->object.get()))
upload = s->bucket->get_multipart_upload(s->object->get_name(), upload_id);
RGWObjectCtx *obj_ctx = static_cast<RGWObjectCtx *>(s->obj_ctx);
+
+ meta_obj = upload->get_meta_obj();
+ meta_obj->set_in_extra_data(true);
+ op_ret = meta_obj->get_obj_attrs(obj_ctx, s->yield, this);
+ if (op_ret < 0) {
+ ldpp_dout(this, 0) << "ERROR: failed to get obj attrs, obj=" << meta_obj
+ << " ret=" << op_ret << dendl;
+ return;
+ }
+ jspan_context trace_ctx(false, false);
+ extract_span_context(meta_obj->get_attrs(), trace_ctx);
+ multipart_trace = tracing::rgw::tracer.add_span(name(), trace_ctx);
+
op_ret = upload->abort(this, s->cct, obj_ctx);
}
#include "cls/rgw/cls_rgw_client.h"
#include "rgw_public_access.h"
#include "rgw_bucket_encryption.h"
+#include "rgw_tracer.h"
#include "services/svc_sys_obj.h"
#include "services/svc_tier_rados.h"
std::string multipart_upload_id;
std::string multipart_part_str;
int multipart_part_num = 0;
+ jspan multipart_trace;
boost::optional<ceph::real_time> delete_at;
//append obj
std::string upload_id;
RGWAccessControlPolicy policy;
ceph::real_time mtime;
+ jspan multipart_trace;
public:
RGWInitMultipart() {}
void init(rgw::sal::Store* store, struct req_state *s, RGWHandler *h) override {
+ multipart_trace = tracing::rgw::tracer.start_trace(tracing::rgw::MULTIPART);
RGWOp::init(store, s, h);
policy.set_ctx(s->cct);
}
std::string version_id;
bufferlist data;
rgw::sal::MPSerializer* serializer;
+ jspan multipart_trace;
public:
RGWCompleteMultipart() : serializer(nullptr) {}
};
class RGWAbortMultipart : public RGWOp {
+protected:
+ jspan multipart_trace;
public:
RGWAbortMultipart() {}
#include "rgw_user.h"
#include "rgw_notify_event_type.h"
+#include "common/tracer.h"
class RGWGetDataCB;
struct RGWObjState;
protected:
Bucket* bucket;
std::map<uint32_t, std::unique_ptr<MultipartPart>> parts;
-
+ jspan_context trace_ctx{false, false};
public:
MultipartUpload(Bucket* _bucket) : bucket(_bucket) {}
virtual ~MultipartUpload() = default;
/** Get all the cached parts that make up this upload */
std::map<uint32_t, std::unique_ptr<MultipartPart>>& get_parts() { return parts; }
+ /** Get the trace context of this upload */
+ const jspan_context& get_trace() { return trace_ctx; }
+
/** Get the Object that represents this upload */
virtual std::unique_ptr<rgw::sal::Object> get_meta_obj() = 0;
#pragma once
#include "common/tracer.h"
+#include "rgw_common.h"
+
namespace tracing {
namespace rgw {
const auto UPLOAD_ID = "upload_id";
const auto TYPE = "type";
const auto REQUEST = "request";
+const auto MULTIPART = "multipart_upload ";
#ifdef HAVE_JAEGER
extern thread_local tracing::Tracer tracer;
} // namespace rgw
} // namespace tracing
+static inline void extract_span_context(const rgw::sal::Attrs& attr, jspan_context& span_ctx) {
+ auto trace_iter = attr.find(RGW_ATTR_TRACE);
+ if (trace_iter != attr.end()) {
+ try {
+ auto trace_bl_iter = trace_iter->second.cbegin();
+ tracing::decode(span_ctx, trace_bl_iter);
+ } catch (buffer::error& err) {}
+ }
+}