]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: rework X-Trans-Id header to be conform with Swift API. 5721/head
authorRadoslaw Zarzynski <rzarzynski@mirantis.com>
Thu, 6 Aug 2015 13:52:58 +0000 (15:52 +0200)
committerLoic Dachary <ldachary@redhat.com>
Sun, 30 Aug 2015 17:14:50 +0000 (19:14 +0200)
Fixes: #12108
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
(cherry picked from commit d1735a4e8ea2056d333a5001a7a410fc03fe1b9e)

src/rgw/rgw_common.cc
src/rgw/rgw_common.h
src/rgw/rgw_main.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h
src/rgw/rgw_rest.cc

index f5b9a9b2461584e3698f2a3794e73b6c5b5f4b15..f3988cffd34868212586575bca55ed4dd95da984 100644 (file)
@@ -169,18 +169,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;
index 0f46b63f9fdff7c41dd47912e929a7ec1c098127..87d2cc33e8161343b14ff99ee2d19c8448c576bf 100644 (file)
@@ -1063,8 +1063,6 @@ struct req_state {
 
    req_state(CephContext *_cct, class RGWEnv *e);
    ~req_state();
-
-   void gen_trans_id();
 };
 
 /** Store basic data on an object */
index 10a672a4b4b15f06a78406ce1307eb1b219f6b8f..af892c4058c29c78f6b368268c8dc5815d0cd817 100644 (file)
@@ -555,10 +555,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;
index 6717c54b742162c94b11d75e5ae2799faca1ec88..85791eabd6c94ede0f384bad63420e912bbb634f 100644 (file)
@@ -1520,6 +1520,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) {
index 18213cf3a549922087644f5f34646115d421f6d9..cc2d1dd3971124ef76ea2d2aafea12b28984074d 100644 (file)
@@ -1244,6 +1244,7 @@ protected:
 
   string region_name;
   string zone_name;
+  string trans_id_suffix;
 
   RGWQuotaHandler *quota_handler;
 
@@ -2063,6 +2064,34 @@ public:
     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;
index b59d6866a43fd8be1a6a10a1bc5456fbd7335404..5f4c40043118e1c7968c235ef2d7ca74a583209c 100644 (file)
@@ -495,7 +495,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());