diff options
author | Greg Farnum <greg@inktank.com> | 2013-07-25 16:03:54 -0700 |
---|---|---|
committer | Greg Farnum <greg@inktank.com> | 2013-07-25 16:03:54 -0700 |
commit | 81b62b5c7192f30f8a3b355cc7cc270cb7e6af92 (patch) | |
tree | 8468f063eb0e1bbc0f225d3a49110b01451947f1 | |
parent | 8ffc4ca914a18bc62da699923196818adc1944bb (diff) | |
download | ceph-81b62b5c7192f30f8a3b355cc7cc270cb7e6af92.tar.gz |
rgw: return the update status on sync requests
Add new STATUS_APPLIED, then specify the RGWX_UPDATE_STATUS header
based on that return code when doing metadata puts.
Add a send_response() function to RGWOp_Metadata_Put in order to
support sending back our new headers. Move the translation from
STATUS_NO_APPLY from set_req_state_err() to this function, so we
can turn different sync results into failures if necessary elsewhere.
Signed-off-by: Greg Farnum <greg@inktank.com>
-rw-r--r-- | src/rgw/rgw_bucket.cc | 2 | ||||
-rw-r--r-- | src/rgw/rgw_common.h | 1 | ||||
-rw-r--r-- | src/rgw/rgw_http_errors.h | 1 | ||||
-rw-r--r-- | src/rgw/rgw_rest_metadata.cc | 16 | ||||
-rw-r--r-- | src/rgw/rgw_rest_metadata.h | 2 | ||||
-rw-r--r-- | src/rgw/rgw_user.cc | 2 |
6 files changed, 20 insertions, 4 deletions
diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 13a778e2db4..b3379977e9d 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -1590,7 +1590,7 @@ public: if (ret < 0) return ret; - return 0; + return STATUS_APPLIED; } struct list_keys_info { diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index 2638bc119b0..3db557066b6 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -100,6 +100,7 @@ using ceph::crypto::MD5; #define STATUS_PARTIAL_CONTENT 1903 #define STATUS_REDIRECT 1904 #define STATUS_NO_APPLY 1905 +#define STATUS_APPLIED 1906 #define ERR_INVALID_BUCKET_NAME 2000 #define ERR_INVALID_OBJECT_NAME 2001 diff --git a/src/rgw/rgw_http_errors.h b/src/rgw/rgw_http_errors.h index e48fb9a72c3..1eb4e12e695 100644 --- a/src/rgw/rgw_http_errors.h +++ b/src/rgw/rgw_http_errors.h @@ -15,7 +15,6 @@ const static struct rgw_http_errors RGW_HTTP_ERRORS[] = { { STATUS_ACCEPTED, 202, "Accepted" }, { STATUS_NO_CONTENT, 204, "NoContent" }, { STATUS_PARTIAL_CONTENT, 206, "" }, - { STATUS_NO_APPLY, 204, "NoContent" }, { ERR_PERMANENT_REDIRECT, 301, "PermanentRedirect" }, { STATUS_REDIRECT, 303, "" }, { ERR_NOT_MODIFIED, 304, "NotModified" }, diff --git a/src/rgw/rgw_rest_metadata.cc b/src/rgw/rgw_rest_metadata.cc index d465f48a150..c62a9bbcea0 100644 --- a/src/rgw/rgw_rest_metadata.cc +++ b/src/rgw/rgw_rest_metadata.cc @@ -179,7 +179,21 @@ void RGWOp_Metadata_Put::execute() { dout(5) << "ERROR: can't put key: " << cpp_strerror(http_ret) << dendl; return; } - http_ret = 0; + // translate internal codes into return header + if (http_ret == STATUS_NO_APPLY) + update_status = "skipped"; + else if (http_ret == STATUS_APPLIED) + update_status = "applied"; +} + +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; + set_req_state_err(s, http_return_code); + dump_errno(s); + dump_pair(s, "RGWX_UPDATE_STATUS", update_status.c_str()); + end_header(s); } void RGWOp_Metadata_Delete::execute() { diff --git a/src/rgw/rgw_rest_metadata.h b/src/rgw/rgw_rest_metadata.h index 85993d08d58..96969fc5410 100644 --- a/src/rgw/rgw_rest_metadata.h +++ b/src/rgw/rgw_rest_metadata.h @@ -40,6 +40,7 @@ public: class RGWOp_Metadata_Put : public RGWRESTOp { int get_data(bufferlist& bl); + string update_status; public: RGWOp_Metadata_Put() {} ~RGWOp_Metadata_Put() {} @@ -48,6 +49,7 @@ public: return caps.check_cap("metadata", RGW_CAP_WRITE); } void execute(); + void send_response(); virtual const char *name() { return "set_metadata"; } }; diff --git a/src/rgw/rgw_user.cc b/src/rgw/rgw_user.cc index 7722d332c7a..6fcecd4a98d 100644 --- a/src/rgw/rgw_user.cc +++ b/src/rgw/rgw_user.cc @@ -2317,7 +2317,7 @@ public: if (ret < 0) return ret; - return 0; + return STATUS_APPLIED; } struct list_keys_info { |