Status: New Owner: ---- Labels: Type-Defect Priority-Medium
New issue 127 by sadao.hiratsuka: incr/decr operations are not thread safe. http://code.google.com/p/memcached/issues/detail?id=127 incr/decr operations are not thread safe. - What steps will reproduce the problem? Please use this code to reproduce the problem. http://gist.github.com/348889 $ memcached -t 16 $ ./test_ascii expected: 100000 result: 99939 Change this line to use binary protocol and test again. bool g_binary = true; $ ./test_binary expected: 100000 result: 99927 - What version of the product are you using? On what operating system? memcached 1.4.4 Red Hat Enterprise Linux 5.4 x86_64 - Please provide any additional information below. Here is a sample patch to fix the problem. *** memcached.c_org 2009-11-27 14:45:13.000000000 +0900 --- memcached.c 2010-03-31 01:29:22.000000000 +0900 *************** *** 54,59 **** --- 54,60 ---- #endif #endif + pthread_mutex_t incr_lock = PTHREAD_MUTEX_INITIALIZER; /* * forward declarations */ *************** *** 1017,1022 **** --- 1018,1024 ---- req->message.body.expiration); } + pthread_mutex_lock(&incr_lock); it = item_get(key, nkey); if (it && (c->binary_header.request.cas == 0 || c->binary_header.request.cas == ITEM_get_cas(it))) { *************** *** 1082,1087 **** --- 1084,1090 ---- write_bin_error(c, PROTOCOL_BINARY_RESPONSE_KEY_ENOENT, 0); } + pthread_mutex_unlock(&incr_lock); } static void complete_update_bin(conn *c) { *************** *** 2780,2785 **** --- 2783,2789 ---- return; } + pthread_mutex_lock(&incr_lock); it = item_get(key, nkey); if (!it) { pthread_mutex_lock(&c->thread->stats.mutex); *************** *** 2791,2796 **** --- 2795,2801 ---- pthread_mutex_unlock(&c->thread->stats.mutex); out_string(c, "NOT_FOUND"); + pthread_mutex_unlock(&incr_lock); return; } *************** *** 2806,2811 **** --- 2811,2817 ---- break; } item_remove(it); /* release our reference */ + pthread_mutex_unlock(&incr_lock); } /* Thanks. -- You received this message because you are listed in the owner or CC fields of this issue, or because you starred this issue. You may adjust your issue notification preferences at: http://code.google.com/hosting/settings To unsubscribe from this group, send email to memcached+unsubscribegooglegroups.com or reply to this email with the words "REMOVE ME" as the subject.
