X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=clients%2Fms_setting.c;h=3eb4d0e6e9d9a79668f91aef06512864a46de338;hb=9e4ae978d7d40c4f1c7d221c61a07a31a5e270d5;hp=2821ec524d2254bbb8713de66ef5e8f45d4d43b3;hpb=e42302e08fa4d04cb21eaf7493f5f92b11169c03;p=m6w6%2Flibmemcached diff --git a/clients/ms_setting.c b/clients/ms_setting.c index 2821ec52..3eb4d0e6 100644 --- a/clients/ms_setting.c +++ b/clients/ms_setting.c @@ -11,9 +11,17 @@ #include "config.h" +#include + #include #include +#include +#include #include +#include +#include + + #include "ms_setting.h" #include "ms_conn.h" @@ -23,6 +31,8 @@ #define RAND_CHAR_SIZE (10 * 1024 * 1024) /* 10M character table */ #define RESERVED_RAND_CHAR_SIZE (2 * 1024 * 1024) /* reserved 2M to avoid pointer sloping over */ +#define DEFAULT_CONFIG_NAME ".memslap.cnf" + #define DEFAULT_THREADS_NUM 1 /* default start one thread */ #define DEFAULT_CONNS_NUM 16 /* default each thread with 16 connections */ #define DEFAULT_EXE_NUM 0 /* default execute number is 0 */ @@ -43,7 +53,7 @@ ms_setting_st ms_setting; /* store the settings specified by user */ /* read setting from configuration file */ static void ms_get_serverlist(char *str); -static int ms_get_cpu_count(void); +static uint32_t ms_get_cpu_count(void); ms_conf_type_t ms_get_conf_type(char *line); static int ms_is_line_data(char *line); static int ms_read_is_data(char *line, ssize_t nread); @@ -146,60 +156,28 @@ static ssize_t getline (char **line, size_t *line_size, FILE *fp) */ static void ms_get_serverlist(char *str) { - char *string; - int64_t port; - char *begin_ptr; - char *end_ptr= str + strlen(str); ms_mcd_server_t *srvs= NULL; - char buffer[512]; - char *ptr= NULL; /** * Servers list format is like this. For example: * "localhost:11108, localhost:11109" */ - for (begin_ptr= str, string= index(str, ','); - begin_ptr != end_ptr; - string= index(begin_ptr, ',')) - { - port= 0; - - if (string) - { - memcpy(buffer, begin_ptr, (size_t)(string - begin_ptr)); - buffer[(unsigned int)(string - begin_ptr)]= '\0'; - begin_ptr= string + 1; - } - else - { - size_t length= strlen(begin_ptr); - memcpy(buffer, begin_ptr, length); - buffer[length]= '\0'; - begin_ptr= end_ptr; - } - - ptr= index(buffer, ':'); - - if (ptr != NULL) - { - ptr[0]= '\0'; - ptr++; - port= strtol(ptr, (char **)NULL, 10); - } + memcached_server_st *server_pool; + server_pool = memcached_servers_parse(str); + for (uint32_t loop= 0; loop < memcached_server_list_count(server_pool); loop++) + { assert(ms_setting.srv_cnt < ms_setting.total_srv_cnt); - strcpy(ms_setting.servers[ms_setting.srv_cnt].srv_host_name, buffer); - ms_setting.servers[ms_setting.srv_cnt].srv_port= (int)port; + strcpy(ms_setting.servers[ms_setting.srv_cnt].srv_host_name, server_pool[loop].hostname); + ms_setting.servers[ms_setting.srv_cnt].srv_port= server_pool[loop].port; ms_setting.servers[ms_setting.srv_cnt].disconn_cnt= 0; ms_setting.servers[ms_setting.srv_cnt].reconn_cnt= 0; ms_setting.srv_cnt++; if (ms_setting.srv_cnt >= ms_setting.total_srv_cnt) { - srvs= (ms_mcd_server_t *)realloc( - ms_setting.servers, - (size_t)ms_setting.total_srv_cnt - * sizeof(ms_mcd_server_t) * 2); + srvs= (ms_mcd_server_t *)realloc( ms_setting.servers, + (size_t)ms_setting.total_srv_cnt * sizeof(ms_mcd_server_t) * 2); if (srvs == NULL) { fprintf(stderr, "Can't reallocate servers structure.\n"); @@ -208,19 +186,18 @@ static void ms_get_serverlist(char *str) ms_setting.servers= srvs; ms_setting.total_srv_cnt*= 2; } - - if (isspace(*begin_ptr)) - begin_ptr++; } + + memcached_server_free(server_pool); } /* ms_get_serverlist */ /** * used to get the CPU count of the current system * - * @return return the cpu count if get, else return 1 + * @return return the cpu count if get, else return EXIT_FAILURE */ -static int ms_get_cpu_count() +static uint32_t ms_get_cpu_count() { #ifdef HAVE__SC_NPROCESSORS_ONLN return sysconf(_SC_NPROCESSORS_CONF); @@ -246,7 +223,7 @@ static int ms_get_cpu_count() #endif /* the system with one cpu at least */ - return 1; + return EXIT_FAILURE; } /* ms_get_cpu_count */ @@ -285,7 +262,7 @@ ms_conf_type_t ms_get_conf_type(char *line) * * @param line, string of one line * - * @return if success, return 1, else return 0 + * @return if success, return EXIT_FAILURE, else return EXIT_SUCCESS */ static int ms_is_line_data(char *line) { @@ -298,9 +275,9 @@ static int ms_is_line_data(char *line) begin_ptr++; } if ((begin_ptr[0] == '\0') || (begin_ptr[0] == '#')) - return 0; + return EXIT_SUCCESS; - return 1; + return EXIT_FAILURE; } /* ms_is_line_data */ @@ -310,14 +287,14 @@ static int ms_is_line_data(char *line) * @param line, string of one line * @param nread, length of the line * - * @return if it's EOF or not line data, return 0, else return 1 + * @return if it's EOF or not line data, return EXIT_SUCCESS, else return EXIT_FAILURE */ static int ms_read_is_data(char *line, ssize_t nread) { if ((nread == EOF) || ! ms_is_line_data(line)) - return 0; + return EXIT_SUCCESS; - return 1; + return EXIT_FAILURE; } /* ms_read_is_data */ @@ -327,12 +304,30 @@ static int ms_read_is_data(char *line, ssize_t nread) */ static void ms_no_config_file() { - FILE *fd= fopen("config", "w+"); + char userpath[PATH_MAX]; + struct passwd *usr= NULL; + FILE *fd; + + usr= getpwuid(getuid()); + snprintf(userpath, PATH_MAX, "%s/%s", usr->pw_dir, DEFAULT_CONFIG_NAME); + + if (access (userpath, F_OK | R_OK) == 0) + goto exit; + + fd= fopen(userpath, "w+"); + + if (fd == NULL) + { + fprintf(stderr, "Could not create default configure file %s\n", userpath); + perror(strerror(errno)); + exit(1); + } fprintf(fd, "%s", DEFAULT_CONGIF_STR); fclose(fd); - ms_setting.cfg_file= strdup("config"); +exit: + ms_setting.cfg_file= strdup(userpath); } /* ms_no_config_file */ @@ -346,7 +341,6 @@ static void ms_parse_cfg_file(char *cfg_file) FILE *f; size_t start_len, end_len; double proportion; - size_t frequence; char *line= NULL; size_t read_len; ssize_t nread; @@ -355,13 +349,11 @@ static void ms_parse_cfg_file(char *cfg_file) int end_of_file= 0; ms_key_distr_t *key_distr= NULL; ms_value_distr_t *val_distr= NULL; - bool no_cfg= false; if (cfg_file == NULL) { ms_no_config_file(); cfg_file= ms_setting.cfg_file; - no_cfg= true; } /*read key value configure file*/ @@ -376,6 +368,7 @@ static void ms_parse_cfg_file(char *cfg_file) if ((((nread= getline(&line, &read_len, f)) == 1) || ! ms_read_is_data(line, nread)) && (nread != EOF)) /* bypass blank line */ continue; + if (nread == EOF) { fprintf(stderr, "Bad configuration file, no configuration find.\n"); @@ -440,8 +433,8 @@ static void ms_parse_cfg_file(char *cfg_file) if (nread != EOF) { - if (sscanf(line, "%zu %zu %lf %zu", &start_len, &end_len, - &proportion, &frequence) != 3) + if (sscanf(line, "%zu %zu %lf", &start_len, &end_len, + &proportion) != 3) { conf_type= ms_get_conf_type(line); break; @@ -484,11 +477,15 @@ static void ms_parse_cfg_file(char *cfg_file) if (nread != EOF) { - if (sscanf(line, "%d %lf\n", &cmd_type, &proportion) != 2) + if (sscanf(line, "%d %lf", &cmd_type, &proportion) != 2) { conf_type= ms_get_conf_type(line); break; } + if (cmd_type >= CMD_NULL) + { + continue; + } ms_setting.cmd_distr[ms_setting.cmd_used_count].cmd_type= cmd_type; ms_setting.cmd_distr[ms_setting.cmd_used_count].cmd_prop= @@ -528,13 +525,10 @@ static void ms_parse_cfg_file(char *cfg_file) fclose(f); - if (no_cfg) - { - remove(ms_setting.cfg_file); - } - if (line != NULL) + { free(line); + } } /* ms_parse_cfg_file */ @@ -581,7 +575,7 @@ static void ms_calc_avg_size() * @param distr, pointer of distribution structure array * @param length, length of the array * - * @return always return 0 + * @return always return EXIT_SUCCESS */ static int ms_shuffle_distr(ms_distr_t *distr, int length) { @@ -620,7 +614,7 @@ static int ms_shuffle_distr(ms_distr_t *distr, int length) } /* switch */ } - return 0; + return EXIT_SUCCESS; } /* ms_shuffle_distr */ @@ -689,7 +683,7 @@ static void ms_build_distr() exit(1); } - if (! ms_setting.binary_prot + if (! ms_setting.binary_prot_ && ((start_len > MAX_KEY_SIZE) || (end_len > MAX_KEY_SIZE))) { fprintf(stderr, "key length must be less than 250 bytes.\n"); @@ -849,6 +843,7 @@ static void ms_init_random_block() */ static void ms_print_setting() { + fprintf(stdout, "servers : %s\n", ms_setting.srv_str); fprintf(stdout, "threads count: %d\n", ms_setting.nthreads); fprintf(stdout, "concurrency: %d\n", ms_setting.nconns); if (ms_setting.run_time > 0) @@ -885,7 +880,7 @@ static void ms_setting_slapmode_init_pre() ms_setting.reconnect= false; ms_setting.verbose= false; ms_setting.facebook_test= false; - ms_setting.binary_prot= false; + ms_setting.binary_prot_= false; ms_setting.stat_freq= 0; ms_setting.srv_str= NULL; ms_setting.cfg_file= NULL; @@ -927,9 +922,9 @@ void ms_setting_init_pre() static void ms_setting_slapmode_init_post() { ms_setting.total_key_rng_cnt= KEY_RANGE_COUNT_INIT; - ms_setting.key_distr= (ms_key_distr_t *)malloc( - (size_t)ms_setting.total_key_rng_cnt - * sizeof(ms_key_distr_t)); + ms_setting.key_distr= + (ms_key_distr_t *)malloc((size_t)ms_setting.total_key_rng_cnt * sizeof(ms_key_distr_t)); + if (ms_setting.key_distr == NULL) { fprintf(stderr, "Can't allocate key distribution structure.\n"); @@ -937,10 +932,10 @@ static void ms_setting_slapmode_init_post() } ms_setting.total_val_rng_cnt= VALUE_RANGE_COUNT_INIT; - ms_setting.value_distr= (ms_value_distr_t *)malloc( - (size_t)ms_setting.total_val_rng_cnt - * sizeof( - ms_value_distr_t)); + + ms_setting.value_distr= + (ms_value_distr_t *)malloc((size_t)ms_setting.total_val_rng_cnt * sizeof( ms_value_distr_t)); + if (ms_setting.value_distr == NULL) { fprintf(stderr, "Can't allocate value distribution structure.\n"); @@ -987,13 +982,6 @@ static void ms_setting_slapmode_init_post() exit(1); } - if ((ms_setting.udp - || ms_setting.facebook_test) && ms_setting.binary_prot) - { - fprintf(stderr, "Binary protocol doesn't support UDP now.\n"); - exit(1); - } - if ((ms_setting.rep_write_srv > 0) && (ms_setting.srv_cnt < 2)) { fprintf(stderr, "Please specify 2 servers at least for replication\n"); @@ -1014,26 +1002,12 @@ static void ms_setting_slapmode_init_post() exit(1); } - if ((ms_setting.rep_write_srv > 0) && (ms_setting.sock_per_conn > 1)) - { - fprintf(stderr, "Replication doesn't support multi-socks " - "in one connection structure.\n"); - exit(1); - } - if (ms_setting.facebook_test && (ms_setting.rep_write_srv > 0)) { fprintf(stderr, "facebook test couldn't work with replication.\n"); exit(1); } - if (ms_setting.reconnect && (ms_setting.sock_per_conn > 1)) - { - fprintf(stderr, "Reconnection doesn't support multi-socks " - "in one connection structure.\n"); - exit(1); - } - ms_build_distr(); /* initialize global character block */