1 /*
2  * File:   ms_setting.h
3  * Author: Mingqiang Zhuang
4  *
5  * Created on February 10, 2009
6  *
7  * (c) Copyright 2009, Schooner Information Technology, Inc.
8  * http://www.schoonerinfotech.com/
9  *
10  */
11 #ifndef MS_SETTING_H
12 #define MS_SETTING_H
13 
14 #include "ms_memslap.h"
15 
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19 
20 #define MCD_SRVS_NUM_INIT         8
21 #define MCD_HOST_LENGTH           64
22 #define KEY_RANGE_COUNT_INIT      8
23 #define VALUE_RANGE_COUNT_INIT    8
24 #define PROP_ERROR                0.001
25 
26 #define MIN_KEY_SIZE              16
27 #define MAX_KEY_SIZE              250
28 #define MAX_VALUE_SIZE            (1024 * 1024)
29 
30 /* the content of the configuration file for memslap running without configuration file */
31 #define DEFAULT_CONGIF_STR \
32   "key\n"                  \
33   "64 64 1\n"              \
34   "value\n"                \
35   "1024 1024 1\n"          \
36   "cmd\n"                  \
37   "0 0.1\n"                \
38   "1 0.9"
39 
40 /* Used to parse the value length return by server and path string */
41 typedef struct token_s
42 {
43   char *value;
44   size_t length;
45 } token_t;
46 
47 #define MAX_TOKENS    10
48 
49 /* server information */
50 typedef struct mcd_server
51 {
52   char srv_host_name[MCD_HOST_LENGTH];              /* host name of server */
53   int srv_port;                                     /* server port */
54 
55   /* for calculating how long the server disconnects */
56   volatile uint32_t disconn_cnt;                    /* number of disconnections count */
57   volatile uint32_t reconn_cnt;                     /* number of reconnections count */
58   struct timeval disconn_time;                      /* start time of disconnection */
59   struct timeval reconn_time;                       /* end time of reconnection */
60 } ms_mcd_server_t;
61 
62 /* information of an item distribution including key and value */
63 typedef struct distr
64 {
65   size_t key_size;                  /* size of key */
66   int key_offset;                   /* offset of one key in character block */
67   size_t value_size;                /* size of value */
68 } ms_distr_t;
69 
70 /* information of key distribution */
71 typedef struct key_distr
72 {
73   size_t start_len;                 /* start of the key length range */
74   size_t end_len;                   /* end of the key length range */
75   double key_prop;                  /* key proportion */
76 } ms_key_distr_t;
77 
78 /* information of value distribution */
79 typedef struct value_distr
80 {
81   size_t start_len;                 /* start of the value length range */
82   size_t end_len;                   /* end of the value length range */
83   double value_prop;                /* value proportion */
84 } ms_value_distr_t;
85 
86 /* memcached command types */
87 typedef enum cmd_type
88 {
89   CMD_SET,
90   CMD_GET,
91   CMD_NULL
92 } ms_cmd_type_t;
93 
94 /* types in the configuration file */
95 typedef enum conf_type
96 {
97   CONF_KEY,
98   CONF_VALUE,
99   CONF_CMD,
100   CONF_NULL
101 } ms_conf_type_t;
102 
103 /* information of command distribution */
104 typedef struct cmd_distr
105 {
106   ms_cmd_type_t cmd_type;               /* command type */
107   double cmd_prop;                      /* proportion of the command */
108 } ms_cmd_distr_t;
109 
110 /* global setting structure */
111 typedef struct setting
112 {
113   uint32_t ncpu;                             /* cpu count of this system */
114   uint32_t nthreads;                         /* total thread count, must equal or less than cpu cores */
115   uint32_t nconns;                      /* total conn count, must multiply by total thread count */
116   int64_t exec_num;                     /* total execute number */
117   int run_time;                         /* total run time */
118 
119   uint32_t char_blk_size;               /* global character block size */
120   char *char_block;                     /* global character block with random character */
121   ms_distr_t *distr;                    /* distribution from configure file */
122 
123   char *srv_str;                        /* string includes servers information */
124   char *cfg_file;                       /* configure file name */
125 
126   ms_mcd_server_t *servers;             /* servers array */
127   uint32_t total_srv_cnt;                    /* total servers count of the servers array */
128   uint32_t srv_cnt;                          /* servers count */
129 
130   ms_key_distr_t *key_distr;            /* array of key distribution */
131   int total_key_rng_cnt;                /* total key range count of the array */
132   int key_rng_cnt;                      /* actual key range count */
133 
134   ms_value_distr_t *value_distr;        /* array of value distribution */
135   int total_val_rng_cnt;                /* total value range count of the array */
136   int val_rng_cnt;                      /* actual value range count */
137 
138   ms_cmd_distr_t cmd_distr[CMD_NULL];   /* total we have CMD_NULL commands */
139   int cmd_used_count;                   /* supported command count */
140 
141   size_t fixed_value_size;              /* fixed value size */
142   size_t avg_val_size;                  /* average value size */
143   size_t avg_key_size;                  /* average value size */
144 
145   double verify_percent;                /* percent of data verification */
146   double exp_ver_per;                   /* percent of data verification with expire time */
147   double overwrite_percent;             /* percent of overwrite */
148   int mult_key_num;                     /* number of keys used by multi-get once */
149   size_t win_size;                      /* item window size per connection */
150   bool udp;                             /* whether or not use UDP */
151   int stat_freq;                        /* statistic frequency second */
152   bool reconnect;                       /* whether it reconnect when connection close */
153   bool verbose;                         /* whether it outputs detailed information when verification */
154   bool facebook_test;                   /* facebook test, TCP set and multi-get with UDP */
155   uint32_t sock_per_conn;                    /* number of socks per connection structure */
156   bool binary_prot_;                     /* whether it use binary protocol */
157   int expected_tps;                     /* expected throughput */
158   uint32_t rep_write_srv;                    /* which servers are used to do replication writing */
159 } ms_setting_st;
160 
161 extern ms_setting_st ms_setting;
162 
163 /* previous part of initialization of setting structure */
164 void ms_setting_init_pre(void);
165 
166 
167 /* post part of initialization of setting structure */
168 void ms_setting_init_post(void);
169 
170 
171 /* clean up the global setting structure */
172 void ms_setting_cleanup(void);
173 
174 
175 #define UNUSED_ARGUMENT(x)    (void)x
176 
177 #ifdef __cplusplus
178 }
179 #endif
180 
181 #endif /* end of MS_SETTING_H */
182