attempt to fix #12, #49 and #65
[awesomized/libmemcached] / clients / ms_task.c
index c99f67cc2e3159eb9b0898f71db7827c67f9c8b9..f2cb8657d678bc2088aea873155fc6962cdd404a 100644 (file)
@@ -9,7 +9,15 @@
  *
  */
 
-#include "config.h"
+#include "mem_config.h"
+
+#if defined(HAVE_SYS_TIME_H)
+# include <sys/time.h>
+#endif
+
+#if defined(HAVE_TIME_H)
+# include <time.h>
+#endif
 
 #include "ms_thread.h"
 #include "ms_setting.h"
                                  * item in the window. This factor shows it.
                                  */
 
-extern __thread ms_thread_t ms_thread;
-
 /* get item from task window */
 static ms_task_item_t *ms_get_cur_opt_item(ms_conn_t *c);
 static ms_task_item_t *ms_get_next_get_item(ms_conn_t *c);
 static ms_task_item_t *ms_get_next_set_item(ms_conn_t *c);
-static ms_task_item_t *ms_get_pre_set_item(ms_conn_t *c);
+static ms_task_item_t *ms_get_random_overwrite_item(ms_conn_t *c);
 
 
 /* select next operation to do */
@@ -44,7 +50,7 @@ static void ms_kick_out_item(ms_task_item_t *item);
 
 
 /* miss rate adjustment */
-static bool ms_need_overwirte_item(ms_task_t *task);
+static bool ms_need_overwrite_item(ms_task_t *task);
 static bool ms_adjust_opt(ms_conn_t *c, ms_task_t *task);
 
 
@@ -144,18 +150,10 @@ static ms_task_item_t *ms_get_next_set_item(ms_conn_t *c)
  * @return ms_task_item_t*, the pointer of the previous item of
  *         set operation
  */
-static ms_task_item_t *ms_get_pre_set_item(ms_conn_t *c)
+static ms_task_item_t *ms_get_random_overwrite_item(ms_conn_t *c)
 {
-  if (c->set_cursor <= 0)
-  {
-    return &c->item_win[0];
-  }
-  else
-  {
-    return &c->item_win[(int64_t)-- c->set_cursor % c->win_size];
-  }
-} /* ms_get_pre_set_item */
-
+    return ms_get_next_get_item(c);
+} /* ms_get_random_overwrite_item */
 
 /**
  * According to the proportion of operations(get or set), select
@@ -291,7 +289,7 @@ static void ms_kick_out_item(ms_task_item_t *item)
  * @return bool, if need overwrite, return true, else return
  *         false
  */
-static bool ms_need_overwirte_item(ms_task_t *task)
+static bool ms_need_overwrite_item(ms_task_t *task)
 {
   ms_task_item_t *item= task->item;
 
@@ -345,7 +343,7 @@ static bool ms_adjust_opt(ms_conn_t *c, ms_task_t *task)
     /* If the current item is not a new item, kick it out */
     if (item->value_offset != INVALID_OFFSET)
     {
-      if (ms_need_overwirte_item(task))
+      if (ms_need_overwrite_item(task))
       {
         /* overwrite */
         task->overwrite_set++;
@@ -359,17 +357,23 @@ static bool ms_adjust_opt(ms_conn_t *c, ms_task_t *task)
     else            /* it's a new item */
     {
       /* need overwrite */
-      if (ms_need_overwirte_item(task))
+      if (ms_need_overwrite_item(task))
       {
-        item= ms_get_pre_set_item(c);
+        /**
+         *  overwrite not use the item with current set cursor, revert
+         *  set cursor.
+         */
+        c->set_cursor--;
+
+        item= ms_get_random_overwrite_item(c);
         if (item->value_offset != INVALID_OFFSET)
         {
           task->item= item;
           task->overwrite_set++;
         }
-        else                /* previous set item is a new item */
+        else                /* item is a new item */
         {
-          /* select the previous item to run, and cancel overwrite */
+          /* select the item to run, and cancel overwrite */
           task->item= item;
         }
       }
@@ -571,7 +575,7 @@ static void ms_warmup_server(ms_conn_t *c)
     }
     else if (c->precmd.cmd == CMD_SET && c->precmd.retstat != MCD_STORED)
     {
-      printf("key: %lx didn't set success\n", item->key_prefix);
+      printf("key: %" PRIx64 " didn't set success\n", item->key_prefix);
     }
   }
 
@@ -591,7 +595,7 @@ static void ms_warmup_server(ms_conn_t *c)
    */
   if (c->remain_warmup_num == -1)
   {
-    ms_send_signal(&ms_global.init_lock);
+    ms_send_signal(&ms_global.warmup_lock);
     c->remain_warmup_num--;       /* never run the if branch */
   }
 } /* ms_warmup_server */
@@ -619,7 +623,7 @@ static void ms_single_getset_task_sch(ms_conn_t *c)
     else if (task->cmd == CMD_GET)
     {
       assert(task->cmd == CMD_GET);
-      ms_mcd_get(c, item, task->verify);
+      ms_mcd_get(c, item);
     }
   }
 } /* ms_single_getset_task_sch */
@@ -725,7 +729,7 @@ static void ms_update_multi_get_result(ms_conn_t *c)
     /* update get miss counter */
     if (mlget_item->get_miss)
     {
-      atomic_add_64(&ms_stats.get_misses, 1);
+      atomic_add_size(&ms_stats.get_misses, 1);
     }
 
     /* get nothing from server for this task item */
@@ -741,7 +745,7 @@ static void ms_update_multi_get_result(ms_conn_t *c)
         if (curr_time.tv_sec - item->client_time
             < item->exp_time - EXPIRE_TIME_ERROR)
         {
-          atomic_add_64(&ms_stats.unexp_unget, 1);
+          atomic_add_size(&ms_stats.unexp_unget, 1);
 
           if (ms_setting.verbose)
           {
@@ -755,7 +759,7 @@ static void ms_update_multi_get_result(ms_conn_t *c)
                     "\n\t<%d expire time verification failed, object "
                     "doesn't expire but can't get it now\n"
                     "\tkey len: %d\n"
-                    "\tkey: %lx %.*s\n"
+                    "\tkey: %" PRIx64 " %.*s\n"
                     "\tset time: %s current time: %s "
                     "diff time: %d expire time: %d\n"
                     "\texpected data len: %d\n"
@@ -779,13 +783,13 @@ static void ms_update_multi_get_result(ms_conn_t *c)
       }
       else
       {
-        atomic_add_64(&ms_stats.vef_miss, 1);
+        atomic_add_size(&ms_stats.vef_miss, 1);
 
         if (ms_setting.verbose)
         {
           fprintf(stderr, "\n<%d data verification failed\n"
                           "\tkey len: %d\n"
-                          "\tkey: %lx %.*s\n"
+                          "\tkey: %" PRIx64 " %.*s\n"
                           "\texpected data len: %d\n"
                           "\texpected data: %.*s\n"
                           "\treceived data: \n",
@@ -829,7 +833,7 @@ static void ms_update_single_get_result(ms_conn_t *c, ms_task_item_t *item)
   /* update get miss counter */
   if ((c->precmd.cmd == CMD_GET) && c->curr_task.get_miss)
   {
-    atomic_add_64(&ms_stats.get_misses, 1);
+    atomic_add_size(&ms_stats.get_misses, 1);
   }
 
   /* get nothing from server for this task item */
@@ -846,7 +850,7 @@ static void ms_update_single_get_result(ms_conn_t *c, ms_task_item_t *item)
       if (curr_time.tv_sec - item->client_time
           < item->exp_time - EXPIRE_TIME_ERROR)
       {
-        atomic_add_64(&ms_stats.unexp_unget, 1);
+        atomic_add_size(&ms_stats.unexp_unget, 1);
 
         if (ms_setting.verbose)
         {
@@ -860,7 +864,7 @@ static void ms_update_single_get_result(ms_conn_t *c, ms_task_item_t *item)
                   "\n\t<%d expire time verification failed, object "
                   "doesn't expire but can't get it now\n"
                   "\tkey len: %d\n"
-                  "\tkey: %lx %.*s\n"
+                  "\tkey: %" PRIx64 " %.*s\n"
                   "\tset time: %s current time: %s "
                   "diff time: %d expire time: %d\n"
                   "\texpected data len: %d\n"
@@ -884,13 +888,13 @@ static void ms_update_single_get_result(ms_conn_t *c, ms_task_item_t *item)
     }
     else
     {
-      atomic_add_64(&ms_stats.vef_miss, 1);
+      atomic_add_size(&ms_stats.vef_miss, 1);
 
       if (ms_setting.verbose)
       {
         fprintf(stderr, "\n<%d data verification failed\n"
                         "\tkey len: %d\n"
-                        "\tkey: %lx %.*s\n"
+                        "\tkey: %" PRIx64 " %.*s\n"
                         "\texpected data len: %d\n"
                         "\texpected data: %.*s\n"
                         "\treceived data: \n",
@@ -1045,7 +1049,7 @@ static void ms_update_task_result(ms_conn_t *c)
  *
  * @param c, pointer of the concurrency
  *
- * @return int, if success, return 0, else return -1
+ * @return int, if success, return EXIT_SUCCESS, else return -1
  */
 static int ms_run_getset_task(ms_conn_t *c)
 {
@@ -1077,7 +1081,7 @@ static int ms_run_getset_task(ms_conn_t *c)
     return -1;
   }
 
-  return 0;
+  return EXIT_SUCCESS;
 } /* ms_run_getset_task */
 
 
@@ -1086,7 +1090,7 @@ static int ms_run_getset_task(ms_conn_t *c)
  *
  * @param c, pointer of the concurrency
  *
- * @return int, if success, return 0, else return -1
+ * @return int, if success, return EXIT_SUCCESS, else return -1
  */
 int ms_exec_task(struct conn *c)
 {
@@ -1102,5 +1106,5 @@ int ms_exec_task(struct conn *c)
     }
   }
 
-  return 0;
+  return EXIT_SUCCESS;
 } /* ms_exec_task */