From da4c026f4a3f3812612856fcf06e14f12b20824c Mon Sep 17 00:00:00 2001 From: Pritha Srivastava Date: Tue, 6 Dec 2016 14:48:20 +0530 Subject: [PATCH] rgw: Searching for error codes and dumping output based on protocol flags. The previous commit uses dynamic allocation to search for s3/ swift specific error codes and dump the results. In order to avoid dynamic allocation, we are making use of protocol flags to achieve the above. Signed-off-by: Pritha Srivastava --- src/rgw/librgw.cc | 6 +- src/rgw/rgw_common.cc | 95 ++++++++++++++------------ src/rgw/rgw_common.h | 19 +++--- src/rgw/rgw_log.cc | 12 ++-- src/rgw/rgw_log.h | 1 - src/rgw/rgw_op.cc | 10 --- src/rgw/rgw_op.h | 3 +- src/rgw/rgw_process.cc | 5 +- src/rgw/rgw_rest.cc | 94 ++++++++++---------------- src/rgw/rgw_rest.h | 18 ++--- src/rgw/rgw_rest_config.cc | 2 +- src/rgw/rgw_rest_log.cc | 20 +++--- src/rgw/rgw_rest_metadata.cc | 2 +- src/rgw/rgw_rest_opstate.cc | 2 +- src/rgw/rgw_rest_realm.cc | 8 +-- src/rgw/rgw_rest_replica_log.cc | 4 +- src/rgw/rgw_rest_s3.cc | 83 ++++++++++++----------- src/rgw/rgw_rest_swift.cc | 115 ++++++++++++++------------------ src/rgw/rgw_swift_auth.cc | 2 +- 19 files changed, 222 insertions(+), 279 deletions(-) diff --git a/src/rgw/librgw.cc b/src/rgw/librgw.cc index befceea3858d1..f7bb502fa0060 100644 --- a/src/rgw/librgw.cc +++ b/src/rgw/librgw.cc @@ -312,7 +312,7 @@ namespace rgw { (op ? op->name() : "unknown"), olog); } - int http_ret = s->err->http_ret; + int http_ret = s->err.http_ret; req->log_format(s, "http status=%d", http_ret); @@ -321,7 +321,7 @@ namespace rgw { << http_ret << " ======" << dendl; - return (ret < 0 ? ret : s->err->ret); + return (ret < 0 ? ret : s->err.ret); } /* process_request */ int RGWLibProcess::start_request(RGWLibContinuedReq* req) @@ -414,7 +414,7 @@ namespace rgw { req->exec_start(); done: - return (ret < 0 ? ret : s->err->ret); + return (ret < 0 ? ret : s->err.ret); } int RGWLibProcess::finish_request(RGWLibContinuedReq* req) diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index 71e4248780232..8f8791528f3a0 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -11,6 +11,7 @@ #include "json_spirit/json_spirit.h" #include "common/ceph_json.h" +#include "rgw_op.h" #include "rgw_common.h" #include "rgw_acl.h" #include "rgw_string.h" @@ -149,7 +150,7 @@ void rgw_perf_stop(CephContext *cct) using namespace ceph::crypto; rgw_err:: -rgw_err(req_state *s) : s(*s) +rgw_err() { clear(); } @@ -248,7 +249,7 @@ void req_info::rebuild_from(req_info& src) req_state::req_state(CephContext* _cct, RGWEnv* e, RGWUserInfo* u) - : cct(_cct), cio(NULL), op(OP_UNKNOWN), err(0), user(u), has_acl_header(false), + : cct(_cct), cio(NULL), op(OP_UNKNOWN), user(u), has_acl_header(false), info(_cct, e) { enable_ops_log = e->conf.enable_ops_log; @@ -284,11 +285,22 @@ req_state::req_state(CephContext* _cct, RGWEnv* e, RGWUserInfo* u) req_state::~req_state() { delete formatter; - delete err; delete bucket_acl; delete object_acl; } +bool search_err(rgw_http_errors& errs, int err_no, bool is_website_redirect, int& http_ret, string& code) +{ + auto r = errs.find(err_no); + if (r != errs.end()) { + if (! is_website_redirect) + http_ret = r->second.first; + code = r->second.second; + return true; + } + return false; +} + void set_req_state_err(struct rgw_err& err, /* out */ int err_no, /* in */ const int prot_flags) /* in */ @@ -297,10 +309,18 @@ void set_req_state_err(struct rgw_err& err, /* out */ err_no = -err_no; err.ret = -err_no; - err.is_website_redirect |= (prot_flags & RGW_REST_WEBSITE) + bool is_website_redirect = false; + + if (prot_flags & RGW_REST_SWIFT) { + if (search_err(rgw_http_swift_errors, err_no, is_website_redirect, err.http_ret, err.s3_code)) + return; + } + + //Default to searching in s3 errors + is_website_redirect |= (prot_flags & RGW_REST_WEBSITE) && err_no == ERR_WEBSITE_REDIRECT && err.is_clear(); - if (err.set_rgw_err(err_no)) - return; + if (search_err(rgw_http_s3_errors, err_no, is_website_redirect, err.http_ret, err.s3_code)) + return; dout(0) << "WARNING: set_req_state_err err_no=" << err_no << " resorting to 500" << dendl; @@ -308,16 +328,36 @@ void set_req_state_err(struct rgw_err& err, /* out */ err.s3_code = "UnknownError"; } -void req_state::set_req_state_err(int err_no) +void set_req_state_err(struct req_state* s, int err_no, const string& err_msg) +{ + if (s) { + set_req_state_err(s, err_no); + s->err.message = err_msg; + } +} + +void set_req_state_err(struct req_state* s, int err_no) { - if (!err) err = new rgw_err(this); - ::set_req_state_err(*err, err_no, prot_flags); + if (s) { + set_req_state_err(s->err, err_no, s->prot_flags); + } } -void req_state::set_req_state_err(int err_no, const string &err_msg) +void dump(struct req_state* s) { - set_req_state_err(err_no); - err->message = err_msg; + if (s->format != RGW_FORMAT_HTML) + s->formatter->open_object_section("Error"); + if (!s->err.s3_code.empty()) + s->formatter->dump_string("Code", s->err.s3_code); + if (!s->err.message.empty()) + s->formatter->dump_string("Message", s->err.message); + if (!s->bucket_name.empty()) // TODO: connect to expose_bucket + s->formatter->dump_string("BucketName", s->bucket_name); + if (!s->trans_id.empty()) // TODO: connect to expose_bucket or another toggle + s->formatter->dump_string("RequestId", s->trans_id); + s->formatter->dump_string("HostId", s->host_id); + if (s->format != RGW_FORMAT_HTML) + s->formatter->close_section(); } struct str_len { @@ -395,37 +435,6 @@ std::ostream& operator<<(std::ostream& oss, const rgw_err &err) return oss; } -void rgw_err::dump() const -{ - if (s.format != RGW_FORMAT_HTML) - s.formatter->open_object_section("Error"); - if (!s3_code.empty()) - s.formatter->dump_string("Code", s3_code); - if (!message.empty()) - s.formatter->dump_string("Message", message); - if (!s.bucket_name.empty()) // TODO: connect to expose_bucket - s.formatter->dump_string("BucketName", s.bucket_name); - if (!s.trans_id.empty()) // TODO: connect to expose_bucket or another toggle - s.formatter->dump_string("RequestId", s.trans_id); - s.formatter->dump_string("HostId", s.host_id); - if (s.format != RGW_FORMAT_HTML) - s.formatter->close_section(); -} - -bool rgw_err::set_rgw_err(int err_no) -{ - rgw_http_errors::const_iterator r; - - r = rgw_http_s3_errors.find(err_no); - if (r != rgw_http_s3_errors.end()) { - if (!is_website_redirect) - http_ret = r->second.first; - s3_code = r->second.second; - return true; - } - return false; -} - string rgw_string_unquote(const string& s) { if (s[0] != '"' || s.size() < 2) diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index 37e25a0840cf0..63854015c8728 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -264,23 +264,20 @@ enum RGWObjCategory { /** Store error returns for output at a different point in the program */ struct rgw_err { - rgw_err(req_state *s); - virtual ~rgw_err() { }; + rgw_err(); void clear(); bool is_clear() const; bool is_err() const; friend std::ostream& operator<<(std::ostream& oss, const rgw_err &err); - virtual void dump() const; - virtual bool set_rgw_err(int); - req_state &s; - bool is_website_redirect; int http_ret; int ret; std::string s3_code; std::string message; }; + + /* Helper class used for RGWHTTPArgs parsing */ class NameVal { @@ -1705,7 +1702,7 @@ struct req_state { const char *length; int64_t content_length; map generic_attrs; - rgw_err *err; + rgw_err err; bool expect_cont; bool header_ended; uint64_t obj_size; @@ -1810,11 +1807,13 @@ struct req_state { req_state(CephContext* _cct, RGWEnv* e, RGWUserInfo* u); ~req_state(); - void set_req_state_err(int err_no); - void set_req_state_err(int err_no, const string &err_msg); - bool is_err() const { return err && err->is_err(); } + bool is_err() const { return err.is_err(); } }; + +void set_req_state_err(struct req_state*, int); +void set_req_state_err(struct req_state*, int, const string&); void set_req_state_err(struct rgw_err&, int, const int); +void dump(struct req_state*); /** Store basic data on bucket */ struct RGWBucketEnt { diff --git a/src/rgw/rgw_log.cc b/src/rgw/rgw_log.cc index 6fc90372b6e75..51dbd1bbe93ba 100644 --- a/src/rgw/rgw_log.cc +++ b/src/rgw/rgw_log.cc @@ -203,8 +203,8 @@ static void log_usage(struct req_state *s, const string& op_name) user = s->user->user_id; } - bool error = s->err->is_err(); - if (error && s->err->http_ret == 404) { + bool error = s->err.is_err(); + if (error && s->err.http_ret == 404) { bucket_name = "-"; /* bucket not found, use the invalid '-' as bucket name */ } @@ -316,7 +316,7 @@ int rgw_log_op(RGWRados *store, RGWREST* const rest, struct req_state *s, ldout(s->cct, 5) << "nothing to log for operation" << dendl; return -EINVAL; } - if (s->err->ret == -ERR_NO_SUCH_BUCKET) { + if (s->err.ret == -ERR_NO_SUCH_BUCKET) { if (!s->cct->_conf->rgw_log_nonexistent_bucket) { ldout(s->cct, 5) << "bucket " << s->bucket << " doesn't exist, not logging" << dendl; return 0; @@ -374,14 +374,14 @@ int rgw_log_op(RGWRados *store, RGWREST* const rest, struct req_state *s, entry.total_time = ceph_clock_now() - s->time; entry.bytes_sent = bytes_sent; entry.bytes_received = bytes_received; - if (s->err->http_ret) { + if (s->err.http_ret) { char buf[16]; - snprintf(buf, sizeof(buf), "%d", s->err->http_ret); + snprintf(buf, sizeof(buf), "%d", s->err.http_ret); entry.http_status = buf; } else entry.http_status = "200"; // default - entry.error_code = s->err->s3_code; + entry.error_code = s->err.s3_code; entry.bucket_id = bucket_id; bufferlist bl; diff --git a/src/rgw/rgw_log.h b/src/rgw/rgw_log.h index 5e612b7ca22da..25e99e096dee3 100644 --- a/src/rgw/rgw_log.h +++ b/src/rgw/rgw_log.h @@ -3,7 +3,6 @@ #ifndef CEPH_RGW_LOG_H #define CEPH_RGW_LOG_H - #include #include "rgw_common.h" #include "include/utime.h" diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 7278283ddb180..fbff621200a85 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -254,7 +254,6 @@ static int modify_obj_attr(RGWRados *store, struct req_state *s, rgw_obj& obj, c RGWRados::Object::Read read_op(&op_target); read_op.params.attrs = &attrs; - read_op.params.perr = &s->err; int r = read_op.prepare(); if (r < 0) { @@ -793,15 +792,6 @@ bool RGWOp::generate_cors_headers(string& origin, string& method, string& header return true; } -/** - * Return a callable that can invoke dump_access_control(). - */ - -boost::function RGWOp::dump_access_control_f() -{ - return boost::bind(dump_access_control, s, this); -} - int RGWGetObj::read_user_manifest_part(rgw_bucket& bucket, const rgw_bucket_dir_entry& ent, RGWAccessControlPolicy * const bucket_policy, diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index 827ae1c6c1acb..fe0cd6fdae9b6 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -94,6 +94,7 @@ public: virtual int authorize() = 0; virtual int postauth_init() = 0; virtual int error_handler(int err_no, std::string* error_content); + virtual void dump(const string& code, const string& message) const {} }; @@ -173,8 +174,6 @@ public: virtual uint32_t op_mask() { return 0; } virtual int error_handler(int err_no, string *error_content); - - boost::function dump_access_control_f(); }; class RGWGetObj : public RGWOp { diff --git a/src/rgw/rgw_process.cc b/src/rgw/rgw_process.cc index 333ee1ef3fdac..6fbf2fdb594f0 100644 --- a/src/rgw/rgw_process.cc +++ b/src/rgw/rgw_process.cc @@ -151,7 +151,6 @@ int process_request(RGWRados* const store, auth_registry, frontend_prefix, client_io, &mgr, &init_error); - if (!s->err) s->err = new rgw_err(s); if (init_error != 0) { abort_early(s, NULL, init_error, NULL); goto done; @@ -217,7 +216,7 @@ done: rgw_log_op(store, rest, s, (op ? op->name() : "unknown"), olog); } - int http_ret = s->err->http_ret; + int http_ret = s->err.http_ret; int op_ret = 0; if (op) { op_ret = op->get_ret(); @@ -236,5 +235,5 @@ done: << " ======" << dendl; - return (ret < 0 ? ret : s->err->ret); + return (ret < 0 ? ret : s->err.ret); } /* process_request */ diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc index 6063212436f9e..140d434e737a3 100644 --- a/src/rgw/rgw_rest.cc +++ b/src/rgw/rgw_rest.cc @@ -19,7 +19,6 @@ #include "rgw_rest_s3.h" #include "rgw_swift_auth.h" #include "rgw_cors_s3.h" -// #include "rgw_lib.h" // XXX mdw is this necessary? #include "rgw_client_io.h" #include "rgw_resolve.h" @@ -223,8 +222,10 @@ string camelcase_dash_http_attr(const string& orig) static set hostnames_set; static set hostnames_s3website_set; -void rgw_rest_init(CephContext *cct) +void rgw_rest_init(CephContext *cct, RGWRados *store, RGWZoneGroup& zone_group) { + store->init_host_id(); + for (const auto& rgw2http : base_rgw_to_http_attrs) { rgw_to_http_attrs[rgw2http.rgw_attr] = rgw2http.http_attr; } @@ -254,12 +255,6 @@ void rgw_rest_init(CephContext *cct) } hostnames_set.insert(cct->_conf->rgw_dns_name); -} - -void rgw_rest_init(CephContext *cct, RGWRados *store, RGWZoneGroup& zone_group) -{ - store->init_host_id(); - rgw_rest_init(cct); hostnames_set.insert(zone_group.hostnames.begin(), zone_group.hostnames.end()); hostnames_set.erase(""); // filter out empty hostnames ldout(cct, 20) << "RGW hostnames: " << hostnames_set << dendl; @@ -373,7 +368,7 @@ void dump_errno(const struct rgw_err &err, string& out) { void dump_errno(struct req_state *s) { - dump_status(s, s->err->http_ret, http_status_names[s->err->http_ret]); + dump_status(s, s->err.http_ret, http_status_names[s->err.http_ret]); } void dump_errno(struct req_state *s, int http_ret) @@ -662,9 +657,9 @@ void dump_trans_id(req_state *s) } } -void end_header(struct req_state* s, boost::function dump_more, - const char *content_type, const int64_t proposed_content_length, - bool force_content_type, bool force_no_error) +void end_header(struct req_state* s, RGWOp* op, const char *content_type, + const int64_t proposed_content_length, bool force_content_type, + bool force_no_error) { string ctype; @@ -676,8 +671,8 @@ void end_header(struct req_state* s, boost::function dump_more, dump_header(s, "x-amz-request-charged", "requester"); } - if (dump_more) { - dump_more(); + if (op) { + dump_access_control(s, op); } if (s->prot_flags & RGW_REST_SWIFT && !content_type) { @@ -708,7 +703,7 @@ void end_header(struct req_state* s, boost::function dump_more, } if (!force_no_error && s->is_err()) { dump_start(s); - s->err->dump(); + dump(s); dump_content_length(s, s->formatter->get_len()); } else { if (proposed_content_length == CHUNKED_TRANSFER_ENCODING) { @@ -733,38 +728,43 @@ void end_header(struct req_state* s, boost::function dump_more, rgw_flush_formatter_and_reset(s, s->formatter); } -void end_header(struct req_state* s, RGWOp* op, const char *content_type, - const int64_t proposed_content_length, bool force_content_type, - bool force_no_error) -{ - boost::function dump_more; - - if (op) dump_more = op->dump_access_control_f(); - end_header(s, dump_more, content_type, - proposed_content_length, force_content_type, force_no_error); -} - -void abort_early(struct req_state *s, boost::function dump_more, - string& error_content, int err_no) +void abort_early(struct req_state *s, RGWOp* op, int err_no, + RGWHandler* handler) { + string error_content(""); if (!s->formatter) { s->formatter = new JSONFormatter; s->format = RGW_FORMAT_JSON; } + // op->error_handler is responsible for calling it's handler error_handler + if (op != NULL) { + int new_err_no; + new_err_no = op->error_handler(err_no, &error_content); + ldout(s->cct, 20) << "op->ERRORHANDLER: err_no=" << err_no + << " new_err_no=" << new_err_no << dendl; + err_no = new_err_no; + } else if (handler != NULL) { + int new_err_no; + new_err_no = handler->error_handler(err_no, &error_content); + ldout(s->cct, 20) << "handler->ERRORHANDLER: err_no=" << err_no + << " new_err_no=" << new_err_no << dendl; + err_no = new_err_no; + } + // If the error handler(s) above dealt with it completely, they should have // returned 0. If non-zero, we need to continue here. if (err_no) { // Watch out, we might have a custom error state already set! - if (!s->err->http_ret || s->err->http_ret == 200) { - s->set_req_state_err(err_no); + if (!s->err.http_ret || s->err.http_ret == 200) { + set_req_state_err(s, err_no); } dump_errno(s); dump_bucket_from_state(s); if (err_no == -ERR_PERMANENT_REDIRECT || err_no == -ERR_WEBSITE_REDIRECT) { string dest_uri; if (!s->redirect.empty()) { - dest_uri = s->redirect; + dest_uri = s->redirect; } else if (!s->zonegroup_endpoint.empty()) { dest_uri = s->zonegroup_endpoint; /* @@ -793,39 +793,15 @@ void abort_early(struct req_state *s, boost::function dump_more, * x-amz-error-message: The specified key does not exist. * x-amz-error-detail-Key: foo */ - end_header(s, dump_more, NULL, error_content.size(), false, true); + end_header(s, op, NULL, error_content.size(), false, true); RESTFUL_IO(s)->send_body(error_content.c_str(), error_content.size()); } else { - end_header(s, dump_more); + end_header(s, op); } } perfcounter->inc(l_rgw_failed_req); } -void abort_early(struct req_state *s, RGWOp* op, int err_no, - RGWHandler* handler) -{ - string error_content(""); - boost::function dump_more; - - // op->error_handler is responsible for calling it's handler error_handler - if (op != NULL) { - int new_err_no; - new_err_no = op->error_handler(err_no, &error_content); - ldout(s->cct, 20) << "op->ERRORHANDLER: err_no=" << err_no - << " new_err_no=" << new_err_no << dendl; - err_no = new_err_no; - } else if (handler != NULL) { - int new_err_no; - new_err_no = handler->error_handler(err_no, &error_content); - ldout(s->cct, 20) << "handler->ERRORHANDLER: err_no=" << err_no - << " new_err_no=" << new_err_no << dendl; - err_no = new_err_no; - } - if (op) dump_more = op->dump_access_control_f(); - abort_early(s, dump_more, error_content, err_no); -} - void dump_continue(struct req_state * const s) { try { @@ -1105,7 +1081,7 @@ int RESTArgs::get_bool(struct req_state *s, const string& name, bool def_val, bo void RGWRESTFlusher::do_start(int ret) { - s->set_req_state_err(ret); /* no going back from here */ + set_req_state_err(s, ret); /* no going back from here */ dump_errno(s); dump_start(s); end_header(s, op); @@ -1799,7 +1775,7 @@ int RGWDeleteMultiObj_ObjStore::get_params() void RGWRESTOp::send_response() { if (!flusher.did_start()) { - s->set_req_state_err(http_ret); + set_req_state_err(s, http_ret); dump_errno(s); end_header(s, this); } diff --git a/src/rgw/rgw_rest.h b/src/rgw/rgw_rest.h index 0a9f0b9db7a90..41597a2d476b1 100644 --- a/src/rgw/rgw_rest.h +++ b/src/rgw/rgw_rest.h @@ -20,7 +20,6 @@ extern std::map rgw_to_http_attrs; extern string camelcase_dash_http_attr(const string& orig); extern string lowercase_dash_http_attr(const string& orig); -extern void rgw_rest_init(CephContext *cct); extern void rgw_rest_init(CephContext *cct, RGWRados *store, RGWZoneGroup& zone_group); extern void rgw_flush_formatter_and_reset(struct req_state *s, @@ -131,16 +130,16 @@ public: class RGWRESTFlusher : public RGWFormatterFlusher { struct req_state *s; - boost::function op; + RGWOp *op; protected: void do_flush() override; void do_start(int ret) override; public: - RGWRESTFlusher(struct req_state *_s, boost::function _op) : + RGWRESTFlusher(struct req_state *_s, RGWOp *_op) : RGWFormatterFlusher(_s->formatter), s(_s), op(_op) {} RGWRESTFlusher() : RGWFormatterFlusher(NULL), s(NULL), op(NULL) {} - void init(struct req_state *_s, boost::function _op) { + void init(struct req_state *_s, RGWOp *_op) { s = _s; op = _op; set_formatter(s->formatter); @@ -463,7 +462,7 @@ public: void init(RGWRados *store, struct req_state *s, RGWHandler *dialect_handler) override { RGWOp::init(store, s, dialect_handler); - flusher.init(s, dump_access_control_f()); + flusher.init(s, this); } void send_response() override; virtual int check_caps(RGWUserCaps& caps) @@ -638,13 +637,6 @@ extern void end_header(struct req_state *s, NO_CONTENT_LENGTH, bool force_content_type = false, bool force_no_error = false); -extern void end_header(struct req_state *s, - boost::function dump_more, - const char *content_type = nullptr, - const int64_t proposed_content_length = - NO_CONTENT_LENGTH, - bool force_content_type = false, - bool force_no_error = false); extern void dump_start(struct req_state *s); extern void list_all_buckets_start(struct req_state *s); extern void dump_owner(struct req_state *s, const rgw_user& id, string& name, @@ -708,8 +700,6 @@ extern void dump_time_header(struct req_state *s, const char *name, real_time t) extern void dump_last_modified(struct req_state *s, real_time t); extern void abort_early(struct req_state* s, RGWOp* op, int err, RGWHandler* handler); -extern void abort_early(struct req_state* s, boost::function dump_more, - string& error_content, int err); extern void dump_range(struct req_state* s, uint64_t ofs, uint64_t end, uint64_t total_size); extern void dump_continue(struct req_state *s); diff --git a/src/rgw/rgw_rest_config.cc b/src/rgw/rgw_rest_config.cc index 4a4cb3901f7f9..3770cec15dede 100644 --- a/src/rgw/rgw_rest_config.cc +++ b/src/rgw/rgw_rest_config.cc @@ -33,7 +33,7 @@ void RGWOp_ZoneGroupMap_Get::execute() { } void RGWOp_ZoneGroupMap_Get::send_response() { - s->set_req_state_err(http_ret); + set_req_state_err(s, http_ret); dump_errno(s); end_header(s); diff --git a/src/rgw/rgw_rest_log.cc b/src/rgw/rgw_rest_log.cc index 2e933c2ddc094..9220917c99a63 100644 --- a/src/rgw/rgw_rest_log.cc +++ b/src/rgw/rgw_rest_log.cc @@ -109,7 +109,7 @@ void RGWOp_MDLog_List::execute() { } void RGWOp_MDLog_List::send_response() { - s->set_req_state_err(http_ret); + set_req_state_err(s, http_ret); dump_errno(s); end_header(s); @@ -140,7 +140,7 @@ void RGWOp_MDLog_Info::execute() { } void RGWOp_MDLog_Info::send_response() { - s->set_req_state_err(http_ret); + set_req_state_err(s, http_ret); dump_errno(s); end_header(s); @@ -182,7 +182,7 @@ void RGWOp_MDLog_ShardInfo::execute() { } void RGWOp_MDLog_ShardInfo::send_response() { - s->set_req_state_err(http_ret); + set_req_state_err(s, http_ret); dump_errno(s); end_header(s); @@ -435,7 +435,7 @@ void RGWOp_BILog_List::send_response() { if (sent_header) return; - s->set_req_state_err(http_ret); + set_req_state_err(s, http_ret); dump_errno(s); end_header(s); @@ -505,7 +505,7 @@ void RGWOp_BILog_Info::execute() { } void RGWOp_BILog_Info::send_response() { - s->set_req_state_err(http_ret); + set_req_state_err(s, http_ret); dump_errno(s); end_header(s); @@ -621,7 +621,7 @@ void RGWOp_DATALog_List::execute() { } void RGWOp_DATALog_List::send_response() { - s->set_req_state_err(http_ret); + set_req_state_err(s, http_ret); dump_errno(s); end_header(s); @@ -656,7 +656,7 @@ void RGWOp_DATALog_Info::execute() { } void RGWOp_DATALog_Info::send_response() { - s->set_req_state_err(http_ret); + set_req_state_err(s, http_ret); dump_errno(s); end_header(s); @@ -681,7 +681,7 @@ void RGWOp_DATALog_ShardInfo::execute() { } void RGWOp_DATALog_ShardInfo::send_response() { - s->set_req_state_err(http_ret); + set_req_state_err(s, http_ret); dump_errno(s); end_header(s); @@ -869,7 +869,7 @@ void RGWOp_MDLog_Status::execute() void RGWOp_MDLog_Status::send_response() { - s->set_req_state_err(http_ret); + set_req_state_err(s, http_ret); dump_errno(s); end_header(s); @@ -908,7 +908,7 @@ void RGWOp_DATALog_Status::execute() void RGWOp_DATALog_Status::send_response() { - s->set_req_state_err(http_ret); + set_req_state_err(s, http_ret); dump_errno(s); end_header(s); diff --git a/src/rgw/rgw_rest_metadata.cc b/src/rgw/rgw_rest_metadata.cc index 792f49ab64d19..272e304f17ebf 100644 --- a/src/rgw/rgw_rest_metadata.cc +++ b/src/rgw/rgw_rest_metadata.cc @@ -201,7 +201,7 @@ void RGWOp_Metadata_Put::send_response() { int http_return_code = http_ret; if ((http_ret == STATUS_NO_APPLY) || (http_ret == STATUS_APPLIED)) http_return_code = STATUS_NO_CONTENT; - s->set_req_state_err(http_return_code); + set_req_state_err(s, http_return_code); dump_errno(s); stringstream ver_stream; ver_stream << "ver:" << ondisk_version.ver diff --git a/src/rgw/rgw_rest_opstate.cc b/src/rgw/rgw_rest_opstate.cc index af07980333325..af9c024e13f7b 100644 --- a/src/rgw/rgw_rest_opstate.cc +++ b/src/rgw/rgw_rest_opstate.cc @@ -75,7 +75,7 @@ void RGWOp_Opstate_List::send_response() { if (sent_header) return; - s->set_req_state_err(http_ret); + set_req_state_err(s, http_ret); dump_errno(s); end_header(s); diff --git a/src/rgw/rgw_rest_realm.cc b/src/rgw/rgw_rest_realm.cc index 3dde7803cbd97..0f5abcdfe0538 100644 --- a/src/rgw/rgw_rest_realm.cc +++ b/src/rgw/rgw_rest_realm.cc @@ -26,13 +26,13 @@ class RGWOp_Period_Base : public RGWRESTOp { // reply with the period object on success void RGWOp_Period_Base::send_response() { - s->set_req_state_err(http_ret, error_stream.str()); + set_req_state_err(s, http_ret, error_stream.str()); dump_errno(s); if (http_ret < 0) { - if (!s->err->message.empty()) { + if (!s->err.message.empty()) { ldout(s->cct, 4) << "Request failed with " << http_ret - << ": " << s->err->message << dendl; + << ": " << s->err.message << dendl; } end_header(s); return; @@ -263,7 +263,7 @@ void RGWOp_Realm_Get::execute() void RGWOp_Realm_Get::send_response() { - s->set_req_state_err(http_ret); + set_req_state_err(s, http_ret); dump_errno(s); if (http_ret < 0) { diff --git a/src/rgw/rgw_rest_replica_log.cc b/src/rgw/rgw_rest_replica_log.cc index dd40c34286a23..919815f572366 100644 --- a/src/rgw/rgw_rest_replica_log.cc +++ b/src/rgw/rgw_rest_replica_log.cc @@ -108,7 +108,7 @@ void RGWOp_OBJLog_GetBounds::execute() { } void RGWOp_OBJLog_GetBounds::send_response() { - s->set_req_state_err(http_ret); + set_req_state_err(s, http_ret); dump_errno(s); end_header(s); @@ -230,7 +230,7 @@ void RGWOp_BILog_GetBounds::execute() { } void RGWOp_BILog_GetBounds::send_response() { - s->set_req_state_err(http_ret); + set_req_state_err(s, http_ret); dump_errno(s); end_header(s); diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 9c7ac61b0c922..a45521b597ab0 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -99,10 +99,10 @@ int RGWGetObj_ObjStore_S3Website::send_response_data(bufferlist& bl, off_t bl_of if (iter != attrs.end()) { bufferlist &bl = iter->second; s->redirect = string(bl.c_str(), bl.length()); - s->err->http_ret = 301; + s->err.http_ret = 301; ldout(s->cct, 20) << __CEPH_ASSERT_FUNCTION << " redirecting per x-amz-website-redirect-location=" << s->redirect << dendl; op_ret = -ERR_WEBSITE_REDIRECT; - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); dump_content_length(s, 0); dump_redirect(s, s->redirect); @@ -168,11 +168,11 @@ int RGWGetObj_ObjStore_S3::send_response_data(bufferlist& bl, off_t bl_ofs, goto send_data; if (custom_http_ret) { - s->set_req_state_err(0); + set_req_state_err(s, 0); dump_errno(s, custom_http_ret); } else { - s->set_req_state_err((partial_content && !op_ret) ? STATUS_PARTIAL_CONTENT - : op_ret); + set_req_state_err(s, (partial_content && !op_ret) ? STATUS_PARTIAL_CONTENT + : op_ret); dump_errno(s); } @@ -340,7 +340,7 @@ int RGWGetObj_ObjStore_S3::get_decrypt_filter(std::unique_ptr *fil void RGWListBuckets_ObjStore_S3::send_response_begin(bool has_buckets) { if (op_ret) - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); dump_start(s); end_header(s, NULL, "application/xml"); @@ -406,7 +406,7 @@ static void dump_usage_categories_info(Formatter *formatter, const rgw_usage_log void RGWGetUsage_ObjStore_S3::send_response() { if (op_ret < 0) - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this, "application/xml"); @@ -618,7 +618,7 @@ void RGWListBucket_ObjStore_S3::send_versioned_response() void RGWListBucket_ObjStore_S3::send_response() { if (op_ret < 0) - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this, "application/xml"); @@ -816,7 +816,7 @@ int RGWSetBucketVersioning_ObjStore_S3::get_params() void RGWSetBucketVersioning_ObjStore_S3::send_response() { if (op_ret) - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s); } @@ -867,7 +867,7 @@ int RGWSetBucketWebsite_ObjStore_S3::get_params() void RGWSetBucketWebsite_ObjStore_S3::send_response() { if (op_ret < 0) - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s); } @@ -877,7 +877,7 @@ void RGWDeleteBucketWebsite_ObjStore_S3::send_response() if (op_ret == 0) { op_ret = STATUS_NO_CONTENT; } - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s); } @@ -885,7 +885,7 @@ void RGWDeleteBucketWebsite_ObjStore_S3::send_response() void RGWGetBucketWebsite_ObjStore_S3::send_response() { if (op_ret) - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this, "application/xml"); dump_start(s); @@ -914,7 +914,7 @@ void RGWStatBucket_ObjStore_S3::send_response() dump_bucket_metadata(s, bucket); } - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this); @@ -1054,7 +1054,7 @@ void RGWCreateBucket_ObjStore_S3::send_response() if (op_ret == -ERR_BUCKET_EXISTS) op_ret = 0; if (op_ret) - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s); @@ -1079,7 +1079,7 @@ void RGWDeleteBucket_ObjStore_S3::send_response() if (!r) r = STATUS_NO_CONTENT; - s->set_req_state_err(r); + set_req_state_err(s, r); dump_errno(s); end_header(s, this); @@ -1359,13 +1359,13 @@ static int get_success_retcode(int code) void RGWPutObj_ObjStore_S3::send_response() { if (op_ret) { - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); } else { if (s->cct->_conf->rgw_s3_success_create_obj_status) { op_ret = get_success_retcode( s->cct->_conf->rgw_s3_success_create_obj_status); - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); } if (!copy_source) { dump_errno(s); @@ -1405,7 +1405,6 @@ static inline int get_obj_attrs(RGWRados *store, struct req_state *s, rgw_obj& o RGWRados::Object::Read read_op(&op_target); read_op.params.attrs = &attrs; - read_op.params.perr = &s->err; return read_op.prepare(); } @@ -1887,8 +1886,8 @@ done: s->formatter->dump_string("Key", s->object.name); s->formatter->close_section(); } - s->err->message = err_msg; - s->set_req_state_err(op_ret); + s->err.message = err_msg; + set_req_state_err(s, op_ret); dump_errno(s); if (op_ret >= 0) { dump_content_length(s, s->formatter->get_len()); @@ -1947,7 +1946,7 @@ void RGWDeleteObj_ObjStore_S3::send_response() if (!r) r = STATUS_NO_CONTENT; - s->set_req_state_err(r); + set_req_state_err(s, r); dump_errno(s); if (!version_id.empty()) { dump_header(s, "x-amz-version-id", version_id); @@ -2036,7 +2035,7 @@ void RGWCopyObj_ObjStore_S3::send_partial_response(off_t ofs) { if (! sent_header) { if (op_ret) - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this, "application/xml"); @@ -2072,7 +2071,7 @@ void RGWCopyObj_ObjStore_S3::send_response() void RGWGetACLs_ObjStore_S3::send_response() { if (op_ret) - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this, "application/xml"); dump_start(s); @@ -2118,7 +2117,7 @@ int RGWPutACLs_ObjStore_S3::get_policy_from_state(RGWRados *store, void RGWPutACLs_ObjStore_S3::send_response() { if (op_ret) - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this, "application/xml"); dump_start(s); @@ -2148,9 +2147,9 @@ void RGWGetLC_ObjStore_S3::send_response() { if (op_ret) { if (op_ret == -ENOENT) { - s->set_req_state_err(ERR_NO_SUCH_LC); + set_req_state_err(s, ERR_NO_SUCH_LC); } else { - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); } } dump_errno(s); @@ -2167,7 +2166,7 @@ void RGWGetLC_ObjStore_S3::send_response() void RGWPutLC_ObjStore_S3::send_response() { if (op_ret) - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this, "application/xml"); dump_start(s); @@ -2178,7 +2177,7 @@ void RGWDeleteLC_ObjStore_S3::send_response() if (op_ret == 0) op_ret = STATUS_NO_CONTENT; if (op_ret) { - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); } dump_errno(s); end_header(s, this, "application/xml"); @@ -2189,9 +2188,9 @@ void RGWGetCORS_ObjStore_S3::send_response() { if (op_ret) { if (op_ret == -ENOENT) - s->set_req_state_err(ERR_NOT_FOUND); + set_req_state_err(s, ERR_NOT_FOUND); else - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); } dump_errno(s); end_header(s, NULL, "application/xml"); @@ -2259,7 +2258,7 @@ int RGWPutCORS_ObjStore_S3::get_params() void RGWPutCORS_ObjStore_S3::send_response() { if (op_ret) - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, NULL, "application/xml"); dump_start(s); @@ -2271,7 +2270,7 @@ void RGWDeleteCORS_ObjStore_S3::send_response() if (!r || r == -ENOENT) r = STATUS_NO_CONTENT; - s->set_req_state_err(r); + set_req_state_err(s, r); dump_errno(s); end_header(s, NULL); } @@ -2286,7 +2285,7 @@ void RGWOptionsCORS_ObjStore_S3::send_response() if (op_ret == -ENOENT) op_ret = -EACCES; if (op_ret < 0) { - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, NULL); return; @@ -2381,7 +2380,7 @@ done: void RGWSetRequestPayment_ObjStore_S3::send_response() { if (op_ret) - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s); } @@ -2401,7 +2400,7 @@ int RGWInitMultipart_ObjStore_S3::get_params() void RGWInitMultipart_ObjStore_S3::send_response() { if (op_ret) - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); for (auto &it : crypt_http_responses) dump_header(s, it.first, it.second); @@ -2445,7 +2444,7 @@ int RGWCompleteMultipart_ObjStore_S3::get_params() void RGWCompleteMultipart_ObjStore_S3::send_response() { if (op_ret) - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this, "application/xml"); if (op_ret == 0) { @@ -2480,7 +2479,7 @@ void RGWAbortMultipart_ObjStore_S3::send_response() if (!r) r = STATUS_NO_CONTENT; - s->set_req_state_err(r); + set_req_state_err(s, r); dump_errno(s); end_header(s, this); } @@ -2488,7 +2487,7 @@ void RGWAbortMultipart_ObjStore_S3::send_response() void RGWListMultipart_ObjStore_S3::send_response() { if (op_ret) - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this, "application/xml"); @@ -2538,7 +2537,7 @@ void RGWListMultipart_ObjStore_S3::send_response() void RGWListBucketMultiparts_ObjStore_S3::send_response() { if (op_ret < 0) - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this, "application/xml"); @@ -2616,7 +2615,7 @@ void RGWDeleteMultiObj_ObjStore_S3::send_status() { if (! status_dumped) { if (op_ret < 0) - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); status_dumped = true; } @@ -3867,7 +3866,7 @@ int RGWHandler_REST_S3Website::retarget(RGWOp* op, RGWOp** new_op) { &redirect_code); // APply a custom HTTP response code if (redirect_code > 0) - s->err->http_ret = redirect_code; // Apply a custom HTTP response code + s->err.http_ret = redirect_code; // Apply a custom HTTP response code ldout(s->cct, 10) << "retarget redirect code=" << redirect_code << " proto+host:" << protocol << "://" << hostname << " -> " << s->redirect << dendl; @@ -3990,7 +3989,7 @@ int RGWHandler_REST_S3Website::error_handler(int err_no, &redirect_code); // Apply a custom HTTP response code if (redirect_code > 0) - s->err->http_ret = redirect_code; // Apply a custom HTTP response code + s->err.http_ret = redirect_code; // Apply a custom HTTP response code ldout(s->cct, 10) << "error handler redirect code=" << redirect_code << " proto+host:" << protocol << "://" << hostname << " -> " << s->redirect << dendl; diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index f05ced9e28228..6cca4f2efc297 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -33,22 +33,6 @@ #define dout_context g_ceph_context #define dout_subsys ceph_subsys_rgw -struct swift_err : public rgw_err { - swift_err(struct req_state *s) : rgw_err(s) {}; - - virtual bool set_rgw_err(int err_no) { - rgw_http_errors::const_iterator r; - - r = rgw_http_swift_errors.find(err_no); - if (r != rgw_http_swift_errors.end()) { - http_ret = r->second.first; - s3_code = r->second.second; - return true; - } - return rgw_err::set_rgw_err(err_no); - } -}; - int RGWListBuckets_ObjStore_SWIFT::get_params() { prefix = s->info.args.get("prefix"); @@ -156,10 +140,10 @@ static void dump_account_metadata(struct req_state * const s, void RGWListBuckets_ObjStore_SWIFT::send_response_begin(bool has_buckets) { if (op_ret) { - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); } else if (!has_buckets && s->format == RGW_FORMAT_PLAIN) { op_ret = STATUS_NO_CONTENT; - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); } if (! s->cct->_conf->rgw_swift_enforce_content_length) { @@ -376,7 +360,7 @@ next: op_ret = 0; } - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this, NULL, content_len); if (op_ret < 0) { @@ -493,7 +477,7 @@ void RGWStatAccount_ObjStore_SWIFT::send_response() static_cast(*s->user_acl)); } - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, NULL, NULL, 0, true); @@ -509,7 +493,7 @@ void RGWStatBucket_ObjStore_SWIFT::send_response() s->bucket_info.website_conf); } - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this, NULL, 0, true); @@ -668,7 +652,7 @@ void RGWCreateBucket_ObjStore_SWIFT::send_response() op_ret = STATUS_CREATED; else if (op_ret == -ERR_BUCKET_EXISTS) op_ret = STATUS_ACCEPTED; - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); /* Propose ending HTTP header with 0 Content-Length header. */ end_header(s, NULL, NULL, 0); @@ -681,7 +665,7 @@ void RGWDeleteBucket_ObjStore_SWIFT::send_response() if (!r) r = STATUS_NO_CONTENT; - s->set_req_state_err(r); + set_req_state_err(s, r); dump_errno(s); end_header(s, this, NULL, 0); rgw_flush_formatter_and_reset(s, s->formatter); @@ -854,7 +838,7 @@ void RGWPutObj_ObjStore_SWIFT::send_response() } dump_last_modified(s, mtime); - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this); rgw_flush_formatter_and_reset(s, s->formatter); @@ -911,7 +895,7 @@ void RGWPutMetadataAccount_ObjStore_SWIFT::send_response() if (! op_ret) { op_ret = STATUS_NO_CONTENT; } - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this); rgw_flush_formatter_and_reset(s, s->formatter); @@ -941,7 +925,7 @@ void RGWPutMetadataBucket_ObjStore_SWIFT::send_response() if (!op_ret && (op_ret != -EINVAL)) { op_ret = STATUS_NO_CONTENT; } - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this); rgw_flush_formatter_and_reset(s, s->formatter); @@ -971,7 +955,7 @@ void RGWPutMetadataObject_ObjStore_SWIFT::send_response() if (! op_ret) { op_ret = STATUS_ACCEPTED; } - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); if (!s->is_err()) { dump_content_length(s, 0); } @@ -983,9 +967,10 @@ void RGWPutMetadataObject_ObjStore_SWIFT::send_response() static void bulkdelete_respond(const unsigned num_deleted, const unsigned int num_unfound, const std::list& failures, - struct req_state *s) /* out */ + const int prot_flags, /* in */ + ceph::Formatter& formatter) /* out */ { - s->formatter->open_object_section("delete"); + formatter.open_object_section("delete"); string resp_status; string resp_body; @@ -997,9 +982,8 @@ static void bulkdelete_respond(const unsigned num_deleted, reason = fail_desc.err; } } - - swift_err err(s); - err.set_rgw_err(reason); + rgw_err err; + set_req_state_err(err, reason, prot_flags); dump_errno(err, resp_status); } else if (0 == num_deleted && 0 == num_unfound) { /* 400 Bad Request */ @@ -1010,29 +994,29 @@ static void bulkdelete_respond(const unsigned num_deleted, dump_errno(200, resp_status); } - encode_json("Number Deleted", num_deleted, s->formatter); - encode_json("Number Not Found", num_unfound, s->formatter); - encode_json("Response Body", resp_body, s->formatter); - encode_json("Response Status", resp_status, s->formatter); + encode_json("Number Deleted", num_deleted, &formatter); + encode_json("Number Not Found", num_unfound, &formatter); + encode_json("Response Body", resp_body, &formatter); + encode_json("Response Status", resp_status, &formatter); - s->formatter->open_array_section("Errors"); + formatter.open_array_section("Errors"); for (const auto fail_desc : failures) { - s->formatter->open_array_section("object"); + formatter.open_array_section("object"); stringstream ss_name; ss_name << fail_desc.path; - encode_json("Name", ss_name.str(), s->formatter); + encode_json("Name", ss_name.str(), &formatter); - swift_err err(s); - err.set_rgw_err(fail_desc.err); + rgw_err err; + set_req_state_err(err, fail_desc.err, prot_flags); string status; dump_errno(err, status); - encode_json("Status", status, s->formatter); - s->formatter->close_section(); + encode_json("Status", status, &formatter); + formatter.close_section(); } - s->formatter->close_section(); + formatter.close_section(); - s->formatter->close_section(); + formatter.close_section(); } int RGWDeleteObj_ObjStore_SWIFT::verify_permission() @@ -1067,7 +1051,7 @@ void RGWDeleteObj_ObjStore_SWIFT::send_response() r = STATUS_NO_CONTENT; } - s->set_req_state_err(r); + set_req_state_err(s, r); dump_errno(s); if (multipart_delete) { @@ -1078,9 +1062,10 @@ void RGWDeleteObj_ObjStore_SWIFT::send_response() bulkdelete_respond(deleter->get_num_deleted(), deleter->get_num_unfound(), deleter->get_failures(), - s); + s->prot_flags, + *s->formatter); } else if (-ENOENT == op_ret) { - bulkdelete_respond(0, 1, {}, s); + bulkdelete_respond(0, 1, {}, s->prot_flags, *s->formatter); } else { RGWBulkDelete::acct_path_t path; path.bucket_name = s->bucket_name; @@ -1090,7 +1075,7 @@ void RGWDeleteObj_ObjStore_SWIFT::send_response() fail_desc.err = op_ret; fail_desc.path = path; - bulkdelete_respond(0, 0, { fail_desc }, s); + bulkdelete_respond(0, 0, { fail_desc }, s->prot_flags, *s->formatter); } } else { end_header(s, this); @@ -1204,7 +1189,7 @@ void RGWCopyObj_ObjStore_SWIFT::send_partial_response(off_t ofs) if (! sent_header) { if (! op_ret) op_ret = STATUS_CREATED; - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this); @@ -1241,7 +1226,7 @@ void RGWCopyObj_ObjStore_SWIFT::send_response() string content_type; if (! op_ret) op_ret = STATUS_CREATED; - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); dump_etag(s, etag); dump_last_modified(s, mtime); @@ -1303,10 +1288,10 @@ int RGWGetObj_ObjStore_SWIFT::send_response_data(bufferlist& bl, } if (custom_http_ret) { - s->set_req_state_err(0); + set_req_state_err(s, 0); dump_errno(s, custom_http_ret); } else { - s->set_req_state_err((partial_content && !op_ret) ? STATUS_PARTIAL_CONTENT + set_req_state_err(s, (partial_content && !op_ret) ? STATUS_PARTIAL_CONTENT : op_ret); dump_errno(s); @@ -1373,7 +1358,7 @@ void RGWOptionsCORS_ObjStore_SWIFT::send_response() if (op_ret == -ENOENT) op_ret = -EACCES; if (op_ret < 0) { - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, NULL); return; @@ -1440,7 +1425,7 @@ int RGWBulkDelete_ObjStore_SWIFT::get_data( void RGWBulkDelete_ObjStore_SWIFT::send_response() { - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this /* RGWOp */, nullptr /* contype */, CHUNKED_TRANSFER_ENCODING); @@ -1448,7 +1433,8 @@ void RGWBulkDelete_ObjStore_SWIFT::send_response() bulkdelete_respond(deleter->get_num_deleted(), deleter->get_num_unfound(), deleter->get_failures(), - s); + s->prot_flags, + *s->formatter); rgw_flush_formatter_and_reset(s, s->formatter); } @@ -1584,7 +1570,7 @@ void RGWBulkUploadOp_ObjStore_SWIFT::send_response() void RGWGetCrossDomainPolicy_ObjStore_SWIFT::send_response() { - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this, "application/xml"); @@ -1602,7 +1588,7 @@ void RGWGetCrossDomainPolicy_ObjStore_SWIFT::send_response() void RGWGetHealthCheck_ObjStore_SWIFT::send_response() { - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this, "application/xml"); @@ -1660,7 +1646,7 @@ void RGWInfo_ObjStore_SWIFT::send_response() if (op_ret < 0) { op_ret = STATUS_NO_CONTENT; } - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this); rgw_flush_formatter_and_reset(s, s->formatter); @@ -2086,9 +2072,8 @@ int RGWSwiftWebsiteHandler::error_handler(const int err_no, const auto& ws_conf = s->bucket_info.website_conf; if (can_be_website_req() && ! ws_conf.error_doc.empty()) { - struct rgw_err err(s); - set_req_state_err(err, err_no, s->prot_flags); - return serve_errordoc(err.http_ret, ws_conf.error_doc); + set_req_state_err(s, err_no); + return serve_errordoc(s->err.http_ret, ws_conf.error_doc); } /* Let's go to the default, no-op handler. */ @@ -2144,7 +2129,7 @@ RGWOp* RGWSwiftWebsiteHandler::get_ws_redirect_op() } void send_response() override { - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); dump_content_length(s, 0); dump_redirect(s, location); @@ -2189,7 +2174,7 @@ RGWOp* RGWSwiftWebsiteHandler::get_ws_listing_op() void send_response() override { /* Generate the header now. */ - s->set_req_state_err(op_ret); + set_req_state_err(s, op_ret); dump_errno(s); dump_container_metadata(s, bucket, bucket_quota, s->bucket_info.website_conf); @@ -2625,8 +2610,6 @@ int RGWHandler_REST_SWIFT::init_from_header(struct req_state* const s, string req; string first; - assert(!s->err); - s->err = new swift_err(s); s->prot_flags |= RGW_REST_SWIFT; char reqbuf[frontend_prefix.length() + s->decoded_uri.length() + 1]; diff --git a/src/rgw/rgw_swift_auth.cc b/src/rgw/rgw_swift_auth.cc index 4365385d8e5a3..cc26db4fcce50 100644 --- a/src/rgw/rgw_swift_auth.cc +++ b/src/rgw/rgw_swift_auth.cc @@ -627,7 +627,7 @@ void RGW_SWIFT_Auth_Get::execute() ret = STATUS_NO_CONTENT; done: - s->set_req_state_err(ret); + set_req_state_err(s, ret); dump_errno(s); end_header(s); } -- 2.47.3