memstorm

mixi Engineers’ Blog » libmemcachedで快速キャッシュ生活」で紹介されているmemstormをビルドしてみた。

memstorm開発時期よりlibmemcachedのバージョンが上がっているのと、libmemcachedを変則的な位置にインストールしているのとで少々苦労した。

  • memstorm-0.6.8
  • libmemcached-0.32
$ tar xvzf memstorm-0.6.8.tar.gz 
$ cd memstorm-0.6.8/
$ ./configure
(略)
$ LD_RUN_PATH=/opt/local/lib make INCLUDES='-I/opt/local/include/ -I/opt/local/include/libmemcached' LIBS='-L/opt/local/lib'
if gcc -DPACKAGE_NAME=\"memstorm\" -DPACKAGE_TARNAME=\"memstorm\" -DPACKAGE_VERSION=\"0.6\" -DPACKAGE_STRING=\"memstorm\ 0.6\" -DPACKAGE_BUGREPORT=\"8\" -DPACKAGE=\"memstorm\" -DVERSION=\"0.6.8\"  -I. -I. -I/opt/local/include/ -I/opt/local/include/libmemcached    -Wall -MT memstorm.o -MD -MP -MF ".deps/memstorm.Tpo" -c -o memstorm.o memstorm.c; \
        then mv -f ".deps/memstorm.Tpo" ".deps/memstorm.Po"; else rm -f ".deps/memstorm.Tpo"; exit 1; fi
memstorm.c: In function ‘engage’:
memstorm.c:112: warning: passing argument 3 of ‘memcached_behavior_set’ makes integer from pointer without a cast
memstorm.c:115: warning: passing argument 3 of ‘memcached_behavior_set’ makes integer from pointer without a cast
memstorm.c:162: warning: passing argument 5 of ‘memcached_get’ from incompatible pointer type
gcc  -Wall   -o memstorm -lmemcached memstorm.o  -L/opt/local/lib
$ ./memstorm 
memstorm: Simple CLI memcached Utility
  -s <string>  : hostname of the server to access
  -n <num>     : number of SET/GET tests to run
  -k <num>     : length of the key (default: 32, max: 250)
  -l <num>     : length of the value (default: 128)
  -b           : use non-blocking IO
  -t           : use tcp-nodelay
  -h           : print this help
$

でも、うごかねー。PROTOCOL ERRORとか怒られる。修正したら動くようになったけど、正しいかどうかは不明。

--- memstorm.c~ 2008-01-20 22:54:22.000000000 +0900
+++ memstorm.c  2009-10-14 09:13:57.000000000 +0900
@@ -84,7 +84,7 @@
   int i, kalloc = 0, valloc = 0;
   int set_succ = 0, set_fail = 0;
   int get_succ = 0, get_fail = 0;
-  uint16_t flags;
+  uint32_t flags;
   char kbuf[IOBUFSIZ];
   char vbuf[IOBUFSIZ];
   char *key = NULL, *val = NULL, *res = NULL;
@@ -109,10 +109,10 @@
   }
 
   if(set_no_delay) {
-    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, &behave_val);
+    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, behave_val);
   }
   if(set_no_block) {
-    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, &behave_val);
+    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, behave_val);
   }
 
   srand(time(NULL));
@@ -147,7 +147,7 @@
     }
 
     gettimeofday(&start_time, NULL);
-    rc = memcached_set(memc, key, klen, val, vlen, (time_t)0, (uint16_t)0);
+    rc = memcached_set(memc, key, strlen(key), val, strlen(val), (time_t)0, (uint32_t)0);
     gettimeofday(&end_time, NULL);
 
     set_accum += timedif(end_time, start_time); 
@@ -159,7 +159,7 @@
       set_fail++;
     }
     gettimeofday(&start_time, NULL);
-    res = memcached_get(memc, key, klen, &reslen, &flags, &rc);
+    res = memcached_get(memc, key, strlen(key), &reslen, &flags, &rc);
     gettimeofday(&end_time, NULL);
 
     get_accum += timedif(end_time, start_time); 

memslapも信用ならない気がするし、何を使えばいいんだ…