summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Farnum <greg@inktank.com>2013-07-25 16:03:54 -0700
committerGreg Farnum <greg@inktank.com>2013-07-25 16:03:54 -0700
commit81b62b5c7192f30f8a3b355cc7cc270cb7e6af92 (patch)
tree8468f063eb0e1bbc0f225d3a49110b01451947f1
parent8ffc4ca914a18bc62da699923196818adc1944bb (diff)
downloadceph-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.cc2
-rw-r--r--src/rgw/rgw_common.h1
-rw-r--r--src/rgw/rgw_http_errors.h1
-rw-r--r--src/rgw/rgw_rest_metadata.cc16
-rw-r--r--src/rgw/rgw_rest_metadata.h2
-rw-r--r--src/rgw/rgw_user.cc2
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 {