Skip to content

Commit

Permalink
Merge pull request ceph#5047 from rzarzynski/wip-12108
Browse files Browse the repository at this point in the history
rgw: rework X-Trans-Id header to be conform with Swift API.

Reviewed-by: Yehuda Sadeh <[email protected]>
yehudasa committed Aug 11, 2015
2 parents 0328bc6 + d1735a4 commit 79e7768
Showing 6 changed files with 34 additions and 18 deletions.
12 changes: 0 additions & 12 deletions src/rgw/rgw_common.cc
Original file line number Diff line number Diff line change
@@ -184,18 +184,6 @@ req_state::~req_state() {
delete object_acl;
}

void req_state::gen_trans_id()
{
char buf[256];
timeval timetest;
gettimeofday(&timetest, NULL);
if (strftime(buf, sizeof(buf), "%Y%m%d:%H%M%S",gmtime(&(timetest.tv_sec))) == 0)
return;

snprintf(buf + strlen(buf), sizeof(buf)-strlen(buf) ,":%03ld", timetest.tv_usec/1000);
trans_id = req_id + "-" + buf;
}

struct str_len {
const char *str;
int len;
2 changes: 0 additions & 2 deletions src/rgw/rgw_common.h
Original file line number Diff line number Diff line change
@@ -1071,8 +1071,6 @@ struct req_state {

req_state(CephContext *_cct, class RGWEnv *e);
~req_state();

void gen_trans_id();
};

/** Store basic data on an object */
5 changes: 2 additions & 3 deletions src/rgw/rgw_main.cc
Original file line number Diff line number Diff line change
@@ -556,10 +556,9 @@ static int process_request(RGWRados *store, RGWREST *rest, RGWRequest *req, RGWC
s->obj_ctx = &rados_ctx;

s->req_id = store->unique_id(req->id);
s->trans_id = store->unique_trans_id(req->id);

s->gen_trans_id();

req->log(s, "initializing");
req->log_format(s, "initializing for trans_id = %s", s->trans_id.c_str());

RGWOp *op = NULL;
int init_error = 0;
2 changes: 2 additions & 0 deletions src/rgw/rgw_rados.cc
Original file line number Diff line number Diff line change
@@ -1545,6 +1545,8 @@ int RGWRados::init_complete()
if (ret < 0)
return ret;

init_unique_trans_id_deps();

ret = region_map.read(cct, this);
if (ret < 0) {
if (ret != -ENOENT) {
29 changes: 29 additions & 0 deletions src/rgw/rgw_rados.h
Original file line number Diff line number Diff line change
@@ -1254,6 +1254,7 @@ class RGWRados

string region_name;
string zone_name;
string trans_id_suffix;

RGWQuotaHandler *quota_handler;

@@ -2114,6 +2115,34 @@ class RGWRados
return s;
}

void init_unique_trans_id_deps() {
char buf[16 + 2 + 1]; /* uint64_t needs 16, 2 hyphens add further 2 */

snprintf(buf, sizeof(buf), "-%llx-", (unsigned long long)instance_id());
url_encode(string(buf) + zone.name, trans_id_suffix);
}

/* In order to preserve compability with Swift API, transaction ID
* should contain at least 32 characters satisfying following spec:
* - first 21 chars must be in range [0-9a-f]. Swift uses this
* space for storing fragment of UUID obtained through a call to
* uuid4() function of Python's uuid module;
* - char no. 22 must be a hyphen;
* - at least 10 next characters constitute hex-formatted timestamp
* padded with zeroes if necessary. All bytes must be in [0-9a-f]
* range;
* - last, optional part of transaction ID is any url-encoded string
* without restriction on length. */
string unique_trans_id(const uint64_t unique_num) {
char buf[41]; /* 2 + 21 + 1 + 16 (timestamp can consume up to 16) + 1 */
time_t timestamp = time(NULL);

snprintf(buf, sizeof(buf), "tx%021llx-%010llx",
(unsigned long long)unique_num,
(unsigned long long)timestamp);

return string(buf) + trans_id_suffix;
}

void get_log_pool_name(string& name) {
name = zone.log_pool.name;
2 changes: 1 addition & 1 deletion src/rgw/rgw_rest.cc
Original file line number Diff line number Diff line change
@@ -500,7 +500,7 @@ void dump_start(struct req_state *s)
void dump_trans_id(req_state *s)
{
if (s->prot_flags & RGW_REST_SWIFT) {
s->cio->print("X-Trans-Id: ts-%s\r\n", s->trans_id.c_str());
s->cio->print("X-Trans-Id: %s\r\n", s->trans_id.c_str());
}
else {
s->cio->print("x-amz-request-id: %s\r\n", s->trans_id.c_str());

0 comments on commit 79e7768

Please sign in to comment.