* Mingqiang Zhuang <mingqiangzhuang@hengtiansoft.com>
*
*/
+#include "config.h"
+
+#include <stdlib.h>
#include <getopt.h>
+#include <limits.h>
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+
#include "ms_sigsegv.h"
#include "ms_setting.h"
#define PROGRAM_DESCRIPTION \
"Generates workload against memcached servers."
+#ifdef __sun
+ /* For some odd reason the option struct on solaris defines the argument
+ * as char* and not const char*
+ */
+#define OPTIONSTRING char*
+#else
+#define OPTIONSTRING const char*
+#endif
+
/* options */
static struct option long_options[]=
{
- { "servers", required_argument, NULL,
+ { (OPTIONSTRING)"servers", required_argument, NULL,
OPT_SERVERS },
- { "threads", required_argument, NULL,
+ { (OPTIONSTRING)"threads", required_argument, NULL,
OPT_THREAD_NUMBER },
- { "concurrency", required_argument, NULL,
+ { (OPTIONSTRING)"concurrency", required_argument, NULL,
OPT_CONCURRENCY },
- { "conn_sock", required_argument, NULL,
+ { (OPTIONSTRING)"conn_sock", required_argument, NULL,
OPT_SOCK_PER_CONN },
- { "execute_number", required_argument, NULL,
+ { (OPTIONSTRING)"execute_number", required_argument, NULL,
OPT_EXECUTE_NUMBER },
- { "time", required_argument, NULL,
+ { (OPTIONSTRING)"time", required_argument, NULL,
OPT_TIME },
- { "cfg_cmd", required_argument, NULL,
+ { (OPTIONSTRING)"cfg_cmd", required_argument, NULL,
OPT_CONFIG_CMD },
- { "win_size", required_argument, NULL,
+ { (OPTIONSTRING)"win_size", required_argument, NULL,
OPT_WINDOW_SIZE },
- { "fixed_size", required_argument, NULL,
+ { (OPTIONSTRING)"fixed_size", required_argument, NULL,
OPT_FIXED_LTH },
- { "verify", required_argument, NULL,
+ { (OPTIONSTRING)"verify", required_argument, NULL,
OPT_VERIFY },
- { "division", required_argument, NULL,
+ { (OPTIONSTRING)"division", required_argument, NULL,
OPT_GETS_DIVISION },
- { "stat_freq", required_argument, NULL,
+ { (OPTIONSTRING)"stat_freq", required_argument, NULL,
OPT_STAT_FREQ },
- { "exp_verify", required_argument, NULL,
+ { (OPTIONSTRING)"exp_verify", required_argument, NULL,
OPT_EXPIRE },
- { "overwrite", required_argument, NULL,
+ { (OPTIONSTRING)"overwrite", required_argument, NULL,
OPT_OVERWRITE },
- { "reconnect", no_argument, NULL,
+ { (OPTIONSTRING)"reconnect", no_argument, NULL,
OPT_RECONNECT },
- { "udp", no_argument, NULL,
+ { (OPTIONSTRING)"udp", no_argument, NULL,
OPT_UDP },
- { "facebook", no_argument, NULL,
+ { (OPTIONSTRING)"facebook", no_argument, NULL,
OPT_FACEBOOK_TEST },
- { "binary", no_argument, NULL,
+ { (OPTIONSTRING)"binary", no_argument, NULL,
OPT_BINARY_PROTOCOL },
- { "tps", required_argument, NULL,
+ { (OPTIONSTRING)"tps", required_argument, NULL,
OPT_TPS },
- { "rep_write", required_argument, NULL,
+ { (OPTIONSTRING)"rep_write", required_argument, NULL,
OPT_REP_WRITE_SRV },
- { "verbose", no_argument, NULL,
+ { (OPTIONSTRING)"verbose", no_argument, NULL,
OPT_VERBOSE },
- { "help", no_argument, NULL,
+ { (OPTIONSTRING)"help", no_argument, NULL,
OPT_HELP },
- { "version", no_argument, NULL,
+ { (OPTIONSTRING)"version", no_argument, NULL,
OPT_VERSION },
- { 0, 0, 0, 0 },
+ { 0, 0, 0, 0 },
};
/* Prototypes */
*/
static void ms_version_command(const char *command_name)
{
- printf("%s v%u.%u\n", command_name, 1, 0);
+ printf("%s v%u.%u\n", command_name, 1U, 0U);
exit(0);
}
{
char *help_message= NULL;
- printf("%s v%u.%u\n", command_name, 1, 0);
+ printf("%s v%u.%u\n", command_name, 1U, 0U);
printf(" %s\n\n", description);
printf(
"Usage:\n"
{
printf(" -%c, --%s%c\n", long_options[x].val, long_options[x].name,
long_options[x].has_arg ? '=' : ' ');
+
if ((help_message= (char *)ms_lookup_help(long_options[x].val)) != NULL)
{
printf(" %s\n", help_message);
break;
case OPT_CONCURRENCY: /* --concurrency or -c */
- ms_setting.nconns= atoi(optarg);
+ ms_setting.nconns= (int)strtol(optarg, (char **) NULL, 10);
if (ms_setting.nconns <= 0)
{
fprintf(stderr, "Concurrency must be greater than 0.:-)\n");
break;
case OPT_EXECUTE_NUMBER: /* --execute_number or -x */
- ms_setting.exec_num= atoll(optarg);
+ ms_setting.exec_num= (int)strtol(optarg, (char **) NULL, 10);
if (ms_setting.exec_num <= 0)
{
fprintf(stderr, "Execute number must be greater than 0.:-)\n");
break;
case OPT_THREAD_NUMBER: /* --threads or -T */
- ms_setting.nthreads= atoi(optarg);
+ ms_setting.nthreads= (int)strtol(optarg, (char **) NULL, 10);
if (ms_setting.nthreads <= 0)
{
fprintf(stderr, "Threads number must be greater than 0.:-)\n");
break;
case OPT_FIXED_LTH: /* --fixed_size or -X */
- ms_setting.fixed_value_size= (size_t)atoi(optarg);
+ ms_setting.fixed_value_size= (size_t)strtoull(optarg, (char **) NULL, 10);
if ((ms_setting.fixed_value_size <= 0)
|| (ms_setting.fixed_value_size > MAX_VALUE_SIZE))
{
break;
case OPT_GETS_DIVISION: /* --division or -d */
- ms_setting.mult_key_num= atoi(optarg);
+ ms_setting.mult_key_num= (int)strtol(optarg, (char **) NULL, 10);
if (ms_setting.mult_key_num <= 0)
{
fprintf(stderr, "Multi-get key number must be greater than 0.:-)\n");
break;
case OPT_SOCK_PER_CONN: /* --conn_sock or -n */
- ms_setting.sock_per_conn= atoi(optarg);
+ ms_setting.sock_per_conn= (int)strtol(optarg, (char **) NULL, 10);
if (ms_setting.sock_per_conn <= 0)
{
fprintf(stderr, "Number of socks of each concurrency "
break;
case OPT_REP_WRITE_SRV: /* --rep_write or -p */
- ms_setting.rep_write_srv= atoi(optarg);
+ ms_setting.rep_write_srv= (int)strtol(optarg, (char **) NULL, 10);
if (ms_setting.rep_write_srv <= 0)
{
fprintf(stderr,
{
if (ms_setting.srv_str == NULL)
{
- fprintf(stderr, "No Servers provided.\n\n");
- return -1;
+ char *temp;
+
+ if ((temp= getenv("MEMCACHED_SERVERS")))
+ {
+ ms_setting.srv_str= strdup(temp);
+ }
+ else
+ {
+ fprintf(stderr, "No Servers provided\n\n");
+ return -1;
+ }
}
if (ms_setting.nconns % ms_setting.nthreads != 0)
second++;
if ((ms_setting.stat_freq > 0) && (second % ms_setting.stat_freq == 0)
- && (ms_stats.active_conns >= ms_setting.nconns))
+ && (ms_stats.active_conns >= ms_setting.nconns)
+ && (ms_stats.active_conns <= INT_MAX))
{
ms_print_statistics(second);
}