X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=clients%2Fmemslap.cc;h=777820a02f9e66d72fd1aa16543a34ca77107647;hb=2569efffe16042f47dc5d2c34528a9ec22fc18b0;hp=095cd08817b74e59804347e159227f1604f98e32;hpb=3d528ab093189ae2bee0aa7e79f07789d82c02d9;p=awesomized%2Flibmemcached diff --git a/clients/memslap.cc b/clients/memslap.cc index 095cd088..777820a0 100644 --- a/clients/memslap.cc +++ b/clients/memslap.cc @@ -2,7 +2,7 @@ * * Libmemcached library * - * Copyright (C) 2011 Data Differential, http://datadifferential.com/ + * Copyright (C) 2011-2012 Data Differential, http://datadifferential.com/ * Copyright (C) 2006-2009 Brian Aker All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -51,8 +51,11 @@ #include #include #include +#include -#include +#include + +#include #include "client_options.h" #include "utilities.h" @@ -141,7 +144,7 @@ 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_binary= 0; +static bool opt_binary= 0; static int opt_verbose= 0; static int opt_flush= 0; static int opt_non_blocking_io= 0; @@ -151,12 +154,12 @@ static unsigned int opt_createial_load= 0; static unsigned int opt_concurrency= 0; static int opt_displayflag= 0; static char *opt_servers= NULL; -static int opt_udp_io= 0; +static bool opt_udp_io= false; test_t opt_test= SET_TEST; extern "C" { -static void *run_task(void *p) +static __attribute__((noreturn)) void *run_task(void *p) { thread_context_st *context= (thread_context_st *)p; @@ -242,26 +245,31 @@ void scheduler(memcached_server_st *servers, conclusions_st *conclusion) memcached_st *memc= memcached_create(NULL); + memcached_server_push(memc, servers); + /* We need to set udp behavior before adding servers to the client */ if (opt_udp_io) { - memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_USE_UDP, - (uint64_t)opt_udp_io); - for (uint32_t x= 0; x < memcached_server_list_count(servers); x++ ) + if (memcached_failed(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_USE_UDP, opt_udp_io))) { - servers[x].type= MEMCACHED_CONNECTION_UDP; + std::cerr << "Failed to enable UDP." << std::endl; + memcached_free(memc); + exit(EXIT_FAILURE); } } - memcached_server_push(memc, servers); memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, (uint64_t)opt_binary); if (opt_flush) + { flush_all(memc); + } if (opt_createial_load) + { pairs= load_create_data(memc, opt_createial_load, &actual_loaded); + } char **keys= static_cast(calloc(actual_loaded, sizeof(char*))); size_t *key_lengths= static_cast(calloc(actual_loaded, sizeof(size_t))); @@ -360,6 +368,7 @@ void options_parse(int argc, char *argv[]) { {(OPTIONSTRING)"concurrency", required_argument, NULL, OPT_SLAP_CONCURRENCY}, {(OPTIONSTRING)"debug", no_argument, &opt_verbose, OPT_DEBUG}, + {(OPTIONSTRING)"quiet", no_argument, NULL, OPT_QUIET}, {(OPTIONSTRING)"execute-number", required_argument, NULL, OPT_SLAP_EXECUTE_NUMBER}, {(OPTIONSTRING)"flag", no_argument, &opt_displayflag, OPT_FLAG}, {(OPTIONSTRING)"flush", no_argument, &opt_flush, OPT_FLUSH}, @@ -376,13 +385,15 @@ void options_parse(int argc, char *argv[]) {0, 0, 0, 0}, }; + bool opt_help= false; + bool opt_version= false; int option_index= 0; - int option_rv; - while (1) { - option_rv= getopt_long(argc, argv, "Vhvds:", long_options, &option_index); + int option_rv= getopt_long(argc, argv, "Vhvds:", long_options, &option_index); + if (option_rv == -1) break; + switch (option_rv) { case 0: @@ -395,15 +406,15 @@ void options_parse(int argc, char *argv[]) "does not currently support get ops.\n"); exit(1); } - opt_udp_io= 1; + opt_udp_io= true; break; case OPT_BINARY: - opt_binary = 1; + opt_binary= true; break; case OPT_VERBOSE: /* --verbose or -v */ - opt_verbose = OPT_VERBOSE; + opt_verbose= OPT_VERBOSE; break; case OPT_DEBUG: /* --debug or -d */ @@ -411,11 +422,11 @@ void options_parse(int argc, char *argv[]) break; case OPT_VERSION: /* --version or -V */ - version_command(PROGRAM_NAME); + opt_version= true; break; case OPT_HELP: /* --help or -h */ - help_command(PROGRAM_NAME, PROGRAM_DESCRIPTION, long_options, help_options); + opt_help= true; break; case OPT_SERVERS: /* --servers or -s */ @@ -423,28 +434,28 @@ void options_parse(int argc, char *argv[]) break; case OPT_SLAP_TEST: - if (!strcmp(optarg, "get")) + if (strcmp(optarg, "get") == 0) { if (opt_udp_io == 1) { fprintf(stderr, "You can not run a get test in UDP mode. UDP mode " "does not currently support get ops.\n"); - exit(1); + exit(EXIT_FAILURE); } opt_test= GET_TEST ; } - else if (!strcmp(optarg, "set")) + else if (strcmp(optarg, "set") == 0) { opt_test= SET_TEST; } - else if (!strcmp(optarg, "mget")) + else if (strcmp(optarg, "mget") == 0) { opt_test= MGET_TEST; } else { fprintf(stderr, "Your test, %s, is not a known test\n", optarg); - exit(1); + exit(EXIT_FAILURE); } break; @@ -460,16 +471,33 @@ void options_parse(int argc, char *argv[]) opt_createial_load= (unsigned int)strtoul(optarg, (char **)NULL, 10); break; + case OPT_QUIET: + close_stdio(); + break; + + case '?': /* getopt_long already printed an error message. */ - exit(1); + exit(EXIT_FAILURE); default: abort(); } } - if ((opt_test == GET_TEST or opt_test == MGET_TEST) && opt_createial_load == 0) + if (opt_version) + { + version_command(PROGRAM_NAME); + exit(EXIT_SUCCESS); + } + + if (opt_help) + { + help_command(PROGRAM_NAME, PROGRAM_DESCRIPTION, long_options, help_options); + exit(EXIT_SUCCESS); + } + + if ((opt_test == GET_TEST or opt_test == MGET_TEST) and opt_createial_load == 0) opt_createial_load= DEFAULT_INITIAL_LOAD; if (opt_execute_number == 0)