X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Fmemslap.c;h=899d8b81af45ea9852cc056985660dce388f65fe;hb=e660fe3e93b1068891c1306fd9eaeac27d3c18a9;hp=3de38f309d48e213d01e6a8c60a434d7a52e6cd9;hpb=8040887dc668c712a5aafc8483fc5470fbc846a5;p=awesomized%2Flibmemcached diff --git a/src/memslap.c b/src/memslap.c index 3de38f30..899d8b81 100644 --- a/src/memslap.c +++ b/src/memslap.c @@ -1,10 +1,12 @@ #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -24,10 +26,10 @@ #define PROGRAM_DESCRIPTION "Generates a load against a memcached custer of servers." /* Global Thread counter */ -unsigned int thread_counter; +volatile unsigned int thread_counter; pthread_mutex_t counter_mutex; pthread_cond_t count_threshhold; -unsigned int master_wakeup; +volatile unsigned int master_wakeup; pthread_mutex_t sleeper_mutex; pthread_cond_t sleep_threshhold; @@ -48,7 +50,7 @@ struct thread_context_st { pairs_st *execute_pairs; unsigned int execute_number; test_type test; - memcached_server_st *servers; + memcached_st *memc; }; struct conclusions_st { @@ -62,9 +64,9 @@ struct conclusions_st { void options_parse(int argc, char *argv[]); void conclusions_print(conclusions_st *conclusion); void scheduler(memcached_server_st *servers, conclusions_st *conclusion); -pairs_st *load_create_data(memcached_server_st *servers, unsigned int number_of, - unsigned int *actual_loaded); -void flush_all(memcached_server_st *servers); +pairs_st *load_create_data(memcached_st *memc, unsigned int number_of, + unsigned int *actual_loaded); +void flush_all(memcached_st *memc); static int opt_verbose= 0; static int opt_flush= 0; @@ -94,7 +96,10 @@ int main(int argc, char *argv[]) if ((temp= getenv("MEMCACHED_SERVERS"))) opt_servers= strdup(temp); else + { + fprintf(stderr, "No Servers provided\n"); exit(1); + } } servers= memcached_servers_parse(opt_servers); @@ -121,7 +126,8 @@ int main(int argc, char *argv[]) void scheduler(memcached_server_st *servers, conclusions_st *conclusion) { unsigned int x; - unsigned int actual_loaded; + unsigned int actual_loaded= 0; /* Fix warning */ + memcached_st *memc; struct timeval start_time, end_time; pthread_t mainthread; /* Thread descriptor */ @@ -132,10 +138,23 @@ void scheduler(memcached_server_st *servers, conclusions_st *conclusion) pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + memc= memcached_create(NULL); + memcached_server_push(memc, servers); + if (opt_flush) - flush_all(servers); + flush_all(memc); if (opt_createial_load) - pairs= load_create_data(servers, opt_createial_load, &actual_loaded); + pairs= load_create_data(memc, opt_createial_load, &actual_loaded); + + /* We set this after we have loaded */ + { + unsigned int value= 1; + if (opt_non_blocking_io) + memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, &value); + if (opt_tcp_nodelay) + memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, &value); + } + pthread_mutex_lock(&counter_mutex); thread_counter= 0; @@ -148,8 +167,9 @@ void scheduler(memcached_server_st *servers, conclusions_st *conclusion) { thread_context_st *context; context= (thread_context_st *)malloc(sizeof(thread_context_st)); + memset(context, 0, sizeof(thread_context_st)); - context->servers= servers; + context->memc= memcached_clone(NULL, memc); context->test= opt_test; context->initial_pairs= pairs; @@ -157,7 +177,7 @@ void scheduler(memcached_server_st *servers, conclusions_st *conclusion) if (opt_test == SET_TEST) { - context->execute_pairs= pairs_generate(opt_execute_number); + context->execute_pairs= pairs_generate(opt_execute_number, 400); context->execute_number= opt_execute_number; } @@ -309,15 +329,8 @@ void *run_task(void *p) { thread_context_st *context= (thread_context_st *)p; memcached_st *memc; - unsigned int value= 1; - memc= memcached_create(NULL); - if (opt_non_blocking_io) - memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, &value); - if (opt_tcp_nodelay) - memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, &value); - - memcached_server_push(memc, context->servers); + memc= context->memc; pthread_mutex_lock(&sleeper_mutex); while (master_wakeup) @@ -337,47 +350,39 @@ void *run_task(void *p) break; } - pthread_mutex_lock(&counter_mutex); - thread_counter--; - pthread_cond_signal(&count_threshhold); - pthread_mutex_unlock(&counter_mutex); memcached_free(memc); if (context->execute_pairs) pairs_free(context->execute_pairs); free(context); + pthread_mutex_lock(&counter_mutex); + thread_counter--; + pthread_cond_signal(&count_threshhold); + pthread_mutex_unlock(&counter_mutex); + return NULL; } -void flush_all(memcached_server_st *servers) +void flush_all(memcached_st *memc) { - memcached_st *memc; - - memc= memcached_create(NULL); - - memcached_server_push(memc, servers); - memcached_flush(memc, 0); - - memcached_free(memc); } -pairs_st *load_create_data(memcached_server_st *servers, unsigned int number_of, - unsigned int *actual_loaded) +pairs_st *load_create_data(memcached_st *memc, unsigned int number_of, + unsigned int *actual_loaded) { - memcached_st *memc; + memcached_st *clone; pairs_st *pairs; - memc= memcached_create(NULL); + clone= memcached_clone(NULL, memc); /* We always used non-blocking IO for load since it is faster */ - memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, NULL ); - memcached_server_push(memc, servers); + memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_NO_BLOCK, NULL ); - pairs= pairs_generate(number_of); - *actual_loaded= execute_set(memc, pairs, number_of); + pairs= pairs_generate(number_of, 400); + *actual_loaded= execute_set(clone, pairs, number_of); - memcached_free(memc); + memcached_free(clone); return pairs; }