X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=clients%2Fmemslap.cc;h=e66ab0fd584dbba094d675e55ef127b5083680e3;hb=0b262a1571e2196e988a841d3449b5a4e0a2081a;hp=f00ba45764ed24bf43b3e762dbe5dab0b9668dca;hpb=956d15b5b1f3f3518eb374a3a9e0393e9dacd3b6;p=awesomized%2Flibmemcached diff --git a/clients/memslap.cc b/clients/memslap.cc index f00ba457..e66ab0fd 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 @@ -36,9 +36,10 @@ */ -#include +#include #include +#include #include #include #include @@ -50,10 +51,11 @@ #include #include #include -#include #include -#include +#include + +#include #include "client_options.h" #include "utilities.h" @@ -152,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; @@ -222,7 +224,15 @@ int main(int argc, char *argv[]) pthread_mutex_init(&sleeper_mutex, NULL); pthread_cond_init(&sleep_threshhold, NULL); - scheduler(servers, &conclusion); + int error_code= EXIT_SUCCESS; + try { + scheduler(servers, &conclusion); + } + catch(std::exception& e) + { + std::cerr << "Died with exception: " << e.what() << std::endl; + error_code= EXIT_FAILURE; + } free(opt_servers); @@ -231,7 +241,7 @@ int main(int argc, char *argv[]) conclusions_print(&conclusion); memcached_server_list_free(servers); - return EXIT_SUCCESS; + return error_code; } void scheduler(memcached_server_st *servers, conclusions_st *conclusion) @@ -243,26 +253,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))); @@ -298,7 +313,7 @@ void scheduler(memcached_server_st *servers, conclusions_st *conclusion) pthread_t *threads= new (std::nothrow) pthread_t[opt_concurrency]; - if (not threads) + if (threads == NULL) { exit(EXIT_FAILURE); } @@ -399,7 +414,7 @@ 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: @@ -453,15 +468,33 @@ void options_parse(int argc, char *argv[]) break; case OPT_SLAP_CONCURRENCY: + errno= 0; opt_concurrency= (unsigned int)strtoul(optarg, (char **)NULL, 10); + if (errno != 0) + { + fprintf(stderr, "Invalid value for concurrency: %s\n", optarg); + exit(EXIT_FAILURE); + } break; case OPT_SLAP_EXECUTE_NUMBER: + errno= 0; opt_execute_number= (unsigned int)strtoul(optarg, (char **)NULL, 10); + if (errno != 0) + { + fprintf(stderr, "Invalid value for execute: %s\n", optarg); + exit(EXIT_FAILURE); + } break; case OPT_SLAP_INITIAL_LOAD: + errno= 0; opt_createial_load= (unsigned int)strtoul(optarg, (char **)NULL, 10); + if (errno != 0) + { + fprintf(stderr, "Invalid value for initial load: %s\n", optarg); + exit(EXIT_FAILURE); + } break; case OPT_QUIET: