#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h>
+#include <assert.h>
#include <sys/time.h>
#include <getopt.h>
#include <pthread.h>
pairs_st *execute_pairs;
unsigned int execute_number;
test_type test;
- memcached_server_st *servers;
+ memcached_st *memc;
};
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_createial_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);
+void flush_all(memcached_st *memc);
static int opt_verbose= 0;
+static int opt_flush= 0;
+static int opt_non_blocking_io= 0;
+static int opt_tcp_nodelay= 0;
static unsigned int opt_execute_number= 0;
static unsigned int opt_createial_load= 0;
static unsigned int opt_concurrency= 0;
options_parse(argc, argv);
if (!opt_servers)
- exit(0);
+ {
+ char *temp;
- servers= parse_opt_servers(opt_servers);
+ if ((temp= getenv("MEMCACHED_SERVERS")))
+ opt_servers= strdup(temp);
+ else
+ {
+ fprintf(stderr, "No Servers provided\n");
+ exit(1);
+ }
+ }
+
+ servers= memcached_servers_parse(opt_servers);
pthread_mutex_init(&counter_mutex, NULL);
pthread_cond_init(&count_threshhold, NULL);
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 */
pthread_attr_setdetachstate(&attr,
PTHREAD_CREATE_DETACHED);
+ memc= memcached_create(NULL);
+ memcached_server_push(memc, servers);
+
+ if (opt_flush)
+ flush_all(memc);
if (opt_createial_load)
- pairs= load_createial_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;
{
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;
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;
}
{"debug", no_argument, &opt_verbose, OPT_DEBUG},
{"execute-number", required_argument, NULL, OPT_SLAP_EXECUTE_NUMBER},
{"flag", no_argument, &opt_displayflag, OPT_FLAG},
+ {"flush", no_argument, &opt_flush, OPT_FLUSH},
{"help", no_argument, NULL, OPT_HELP},
{"initial-load", required_argument, NULL, OPT_SLAP_INITIAL_LOAD}, /* Number to load initially */
+ {"non-blocking", no_argument, &opt_non_blocking_io, OPT_SLAP_NON_BLOCK},
{"servers", required_argument, NULL, OPT_SERVERS},
+ {"tcp-nodelay", no_argument, &opt_tcp_nodelay, OPT_SLAP_TCP_NODELAY},
{"test", required_argument, NULL, OPT_SLAP_TEST},
{"verbose", no_argument, &opt_verbose, OPT_VERBOSE},
{"version", no_argument, NULL, OPT_VERSION},
thread_context_st *context= (thread_context_st *)p;
memcached_st *memc;
- memc= memcached_create(NULL);
-
- memcached_server_push(memc, context->servers);
+ memc= context->memc;
pthread_mutex_lock(&sleeper_mutex);
while (master_wakeup)
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;
}
-pairs_st *load_createial_data(memcached_server_st *servers, unsigned int number_of,
- unsigned int *actual_loaded)
+void flush_all(memcached_st *memc)
{
- memcached_st *memc;
+ memcached_flush(memc, 0);
+}
+
+pairs_st *load_create_data(memcached_st *memc, unsigned int number_of,
+ unsigned int *actual_loaded)
+{
+ memcached_st *clone;
pairs_st *pairs;
- memc= memcached_create(NULL);
- memcached_server_push(memc, servers);
+ clone= memcached_clone(NULL, memc);
+ /* We always used non-blocking IO for load since it is faster */
+ 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;
}