From cb9cdd2652b441d362fdcbd3f185652f941d3108 Mon Sep 17 00:00:00 2001 From: Brian Aker Date: Tue, 24 May 2011 18:03:09 -0700 Subject: [PATCH] Merge in additional for last disconnected server. --- libmemcached/hosts.cc | 20 ++--- libmemcached/options/parser.cc | 148 ++++++++++++++++---------------- libmemcached/options/parser.yy | 20 +++-- libmemcached/options/scanner.cc | 6 +- libmemcached/options/scanner.l | 6 +- tests/mem_functions.cc | 48 +++++++++++ tests/parser.cc | 50 ++++++++++- tests/parser.h | 3 + 8 files changed, 201 insertions(+), 100 deletions(-) diff --git a/libmemcached/hosts.cc b/libmemcached/hosts.cc index 4aee163c..2f600197 100644 --- a/libmemcached/hosts.cc +++ b/libmemcached/hosts.cc @@ -448,10 +448,10 @@ memcached_return_t memcached_server_add_with_weight(memcached_st *ptr, in_port_t port, uint32_t weight) { - if (! port) + if (not port) port= MEMCACHED_DEFAULT_PORT; - if (! hostname) + if (not hostname) hostname= "localhost"; return server_add(ptr, hostname, port, weight, MEMCACHED_CONNECTION_TCP); @@ -462,23 +462,23 @@ static memcached_return_t server_add(memcached_st *ptr, const char *hostname, uint32_t weight, memcached_connection_t type) { - memcached_server_st *new_host_list; - memcached_server_write_instance_st instance; - if ( (ptr->flags.use_udp && type != MEMCACHED_CONNECTION_UDP) - || ( (type == MEMCACHED_CONNECTION_UDP) && (! ptr->flags.use_udp) ) ) + if ( (ptr->flags.use_udp and type != MEMCACHED_CONNECTION_UDP) + or ( (type == MEMCACHED_CONNECTION_UDP) and (not ptr->flags.use_udp) ) ) + { return MEMCACHED_INVALID_HOST_PROTOCOL; + } - new_host_list= static_cast(libmemcached_realloc(ptr, memcached_server_list(ptr), - sizeof(memcached_server_st) * (ptr->number_of_hosts + 1))); + memcached_server_st *new_host_list= static_cast(libmemcached_realloc(ptr, memcached_server_list(ptr), + sizeof(memcached_server_st) * (ptr->number_of_hosts + 1))); - if (new_host_list == NULL) + if (not new_host_list) return MEMCACHED_MEMORY_ALLOCATION_FAILURE; memcached_server_list_set(ptr, new_host_list); /* TODO: Check return type */ - instance= memcached_server_instance_fetch(ptr, memcached_server_count(ptr)); + memcached_server_write_instance_st instance= memcached_server_instance_fetch(ptr, memcached_server_count(ptr)); (void)memcached_server_create_with(ptr, instance, hostname, port, weight, type); diff --git a/libmemcached/options/parser.cc b/libmemcached/options/parser.cc index 491bb0cc..d199a5fa 100644 --- a/libmemcached/options/parser.cc +++ b/libmemcached/options/parser.cc @@ -522,13 +522,13 @@ static const yytype_int8 yyrhs[] = /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 155, 155, 156, 160, 162, 164, 166, 171, 176, - 180, 184, 195, 203, 211, 215, 219, 223, 227, 234, - 241, 252, 259, 266, 273, 279, 283, 287, 291, 295, - 299, 303, 307, 311, 315, 319, 323, 330, 334, 338, - 342, 346, 350, 354, 358, 362, 366, 370, 374, 381, - 382, 387, 388, 393, 397, 401, 405, 409, 413, 417, - 421, 425, 432, 436, 444, 448, 452 + 0, 157, 157, 158, 162, 164, 166, 168, 173, 178, + 182, 186, 197, 205, 213, 217, 221, 225, 229, 236, + 243, 254, 261, 268, 275, 281, 285, 289, 293, 297, + 301, 305, 309, 313, 317, 321, 325, 332, 336, 340, + 344, 348, 352, 356, 360, 364, 368, 372, 376, 383, + 384, 389, 390, 395, 399, 403, 407, 411, 415, 419, + 423, 427, 434, 438, 446, 450, 454 }; #endif @@ -1520,28 +1520,28 @@ yyreduce: case 4: /* Line 1464 of yacc.c */ -#line 161 "libmemcached/options/parser.yy" +#line 163 "libmemcached/options/parser.yy" { ;} break; case 5: /* Line 1464 of yacc.c */ -#line 163 "libmemcached/options/parser.yy" +#line 165 "libmemcached/options/parser.yy" { ;} break; case 6: /* Line 1464 of yacc.c */ -#line 165 "libmemcached/options/parser.yy" +#line 167 "libmemcached/options/parser.yy" { ;} break; case 7: /* Line 1464 of yacc.c */ -#line 167 "libmemcached/options/parser.yy" +#line 169 "libmemcached/options/parser.yy" { context->set_end(); YYACCEPT; @@ -1551,7 +1551,7 @@ yyreduce: case 8: /* Line 1464 of yacc.c */ -#line 172 "libmemcached/options/parser.yy" +#line 174 "libmemcached/options/parser.yy" { context->rc= MEMCACHED_PARSE_USER_ERROR; parser_abort(context, NULL); @@ -1561,7 +1561,7 @@ yyreduce: case 9: /* Line 1464 of yacc.c */ -#line 177 "libmemcached/options/parser.yy" +#line 179 "libmemcached/options/parser.yy" { memcached_reset(context->memc); ;} @@ -1570,7 +1570,7 @@ yyreduce: case 10: /* Line 1464 of yacc.c */ -#line 181 "libmemcached/options/parser.yy" +#line 183 "libmemcached/options/parser.yy" { yydebug= 1; ;} @@ -1579,7 +1579,7 @@ yyreduce: case 11: /* Line 1464 of yacc.c */ -#line 185 "libmemcached/options/parser.yy" +#line 187 "libmemcached/options/parser.yy" { if ((context->rc= memcached_parse_configure_file(context->memc, (yyvsp[(3) - (3)].string).c_str, (yyvsp[(3) - (3)].string).size)) != MEMCACHED_SUCCESS) { @@ -1591,9 +1591,9 @@ yyreduce: case 12: /* Line 1464 of yacc.c */ -#line 196 "libmemcached/options/parser.yy" +#line 198 "libmemcached/options/parser.yy" { - if ((context->rc= memcached_server_add_with_weight(context->memc, (yyvsp[(2) - (4)].server).c_str, (yyvsp[(2) - (4)].server).port, (yyvsp[(2) - (4)].server).weight)) != MEMCACHED_SUCCESS) + if (memcached_failed(context->rc= memcached_server_add_with_weight(context->memc, (yyvsp[(2) - (4)].server).c_str, (yyvsp[(3) - (4)].number), (yyvsp[(4) - (4)].number)))) { parser_abort(context, NULL); } @@ -1604,9 +1604,9 @@ yyreduce: case 13: /* Line 1464 of yacc.c */ -#line 204 "libmemcached/options/parser.yy" +#line 206 "libmemcached/options/parser.yy" { - if ((context->rc= memcached_server_add_with_weight(context->memc, (yyvsp[(2) - (4)].server).c_str, (yyvsp[(2) - (4)].server).port, (yyvsp[(2) - (4)].server).weight)) != MEMCACHED_SUCCESS) + if (memcached_failed(context->rc= memcached_server_add_with_weight(context->memc, (yyvsp[(2) - (4)].server).c_str, (yyvsp[(3) - (4)].number), (yyvsp[(4) - (4)].number)))) { parser_abort(context, NULL); } @@ -1617,7 +1617,7 @@ yyreduce: case 14: /* Line 1464 of yacc.c */ -#line 212 "libmemcached/options/parser.yy" +#line 214 "libmemcached/options/parser.yy" { memcached_set_configuration_file(context->memc, (yyvsp[(2) - (2)].string).c_str, (yyvsp[(2) - (2)].string).size); ;} @@ -1626,7 +1626,7 @@ yyreduce: case 15: /* Line 1464 of yacc.c */ -#line 216 "libmemcached/options/parser.yy" +#line 218 "libmemcached/options/parser.yy" { context->memc->configure.initial_pool_size= (yyvsp[(2) - (2)].number); ;} @@ -1635,7 +1635,7 @@ yyreduce: case 16: /* Line 1464 of yacc.c */ -#line 220 "libmemcached/options/parser.yy" +#line 222 "libmemcached/options/parser.yy" { context->memc->configure.max_pool_size= (yyvsp[(2) - (2)].number); ;} @@ -1644,7 +1644,7 @@ yyreduce: case 18: /* Line 1464 of yacc.c */ -#line 228 "libmemcached/options/parser.yy" +#line 230 "libmemcached/options/parser.yy" { if ((context->rc= memcached_set_prefix_key(context->memc, (yyvsp[(2) - (2)].string).c_str, (yyvsp[(2) - (2)].string).size)) != MEMCACHED_SUCCESS) { @@ -1656,7 +1656,7 @@ yyreduce: case 19: /* Line 1464 of yacc.c */ -#line 235 "libmemcached/options/parser.yy" +#line 237 "libmemcached/options/parser.yy" { if ((context->rc= memcached_behavior_set(context->memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, (yyvsp[(2) - (2)].distribution))) != MEMCACHED_SUCCESS) { @@ -1668,7 +1668,7 @@ yyreduce: case 20: /* Line 1464 of yacc.c */ -#line 242 "libmemcached/options/parser.yy" +#line 244 "libmemcached/options/parser.yy" { if ((context->rc= memcached_behavior_set(context->memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, (yyvsp[(2) - (4)].distribution))) != MEMCACHED_SUCCESS) { @@ -1684,7 +1684,7 @@ yyreduce: case 21: /* Line 1464 of yacc.c */ -#line 253 "libmemcached/options/parser.yy" +#line 255 "libmemcached/options/parser.yy" { if ((context->rc= memcached_behavior_set(context->memc, MEMCACHED_BEHAVIOR_HASH, (yyvsp[(2) - (2)].hash))) != MEMCACHED_SUCCESS) { @@ -1696,7 +1696,7 @@ yyreduce: case 22: /* Line 1464 of yacc.c */ -#line 260 "libmemcached/options/parser.yy" +#line 262 "libmemcached/options/parser.yy" { if ((context->rc= memcached_behavior_set(context->memc, (yyvsp[(1) - (2)].behavior), (yyvsp[(2) - (2)].number))) != MEMCACHED_SUCCESS) { @@ -1708,7 +1708,7 @@ yyreduce: case 23: /* Line 1464 of yacc.c */ -#line 267 "libmemcached/options/parser.yy" +#line 269 "libmemcached/options/parser.yy" { if ((context->rc= memcached_behavior_set(context->memc, (yyvsp[(1) - (1)].behavior), true)) != MEMCACHED_SUCCESS) { @@ -1720,7 +1720,7 @@ yyreduce: case 24: /* Line 1464 of yacc.c */ -#line 274 "libmemcached/options/parser.yy" +#line 276 "libmemcached/options/parser.yy" { ;} break; @@ -1728,7 +1728,7 @@ yyreduce: case 25: /* Line 1464 of yacc.c */ -#line 280 "libmemcached/options/parser.yy" +#line 282 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_REMOVE_FAILED_SERVERS; ;} @@ -1737,7 +1737,7 @@ yyreduce: case 26: /* Line 1464 of yacc.c */ -#line 284 "libmemcached/options/parser.yy" +#line 286 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT; ;} @@ -1746,7 +1746,7 @@ yyreduce: case 27: /* Line 1464 of yacc.c */ -#line 288 "libmemcached/options/parser.yy" +#line 290 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK; ;} @@ -1755,7 +1755,7 @@ yyreduce: case 28: /* Line 1464 of yacc.c */ -#line 292 "libmemcached/options/parser.yy" +#line 294 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK; ;} @@ -1764,7 +1764,7 @@ yyreduce: case 29: /* Line 1464 of yacc.c */ -#line 296 "libmemcached/options/parser.yy" +#line 298 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_IO_KEY_PREFETCH; ;} @@ -1773,7 +1773,7 @@ yyreduce: case 30: /* Line 1464 of yacc.c */ -#line 300 "libmemcached/options/parser.yy" +#line 302 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS; ;} @@ -1782,7 +1782,7 @@ yyreduce: case 31: /* Line 1464 of yacc.c */ -#line 304 "libmemcached/options/parser.yy" +#line 306 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_POLL_TIMEOUT; ;} @@ -1791,7 +1791,7 @@ yyreduce: case 32: /* Line 1464 of yacc.c */ -#line 308 "libmemcached/options/parser.yy" +#line 310 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_RCV_TIMEOUT; ;} @@ -1800,7 +1800,7 @@ yyreduce: case 33: /* Line 1464 of yacc.c */ -#line 312 "libmemcached/options/parser.yy" +#line 314 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_RETRY_TIMEOUT; ;} @@ -1809,7 +1809,7 @@ yyreduce: case 34: /* Line 1464 of yacc.c */ -#line 316 "libmemcached/options/parser.yy" +#line 318 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_SND_TIMEOUT; ;} @@ -1818,7 +1818,7 @@ yyreduce: case 35: /* Line 1464 of yacc.c */ -#line 320 "libmemcached/options/parser.yy" +#line 322 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE; ;} @@ -1827,7 +1827,7 @@ yyreduce: case 36: /* Line 1464 of yacc.c */ -#line 324 "libmemcached/options/parser.yy" +#line 326 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE; ;} @@ -1836,7 +1836,7 @@ yyreduce: case 37: /* Line 1464 of yacc.c */ -#line 331 "libmemcached/options/parser.yy" +#line 333 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_BINARY_PROTOCOL; ;} @@ -1845,7 +1845,7 @@ yyreduce: case 38: /* Line 1464 of yacc.c */ -#line 335 "libmemcached/options/parser.yy" +#line 337 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_BUFFER_REQUESTS; ;} @@ -1854,7 +1854,7 @@ yyreduce: case 39: /* Line 1464 of yacc.c */ -#line 339 "libmemcached/options/parser.yy" +#line 341 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_HASH_WITH_PREFIX_KEY; ;} @@ -1863,7 +1863,7 @@ yyreduce: case 40: /* Line 1464 of yacc.c */ -#line 343 "libmemcached/options/parser.yy" +#line 345 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_NOREPLY; ;} @@ -1872,7 +1872,7 @@ yyreduce: case 41: /* Line 1464 of yacc.c */ -#line 347 "libmemcached/options/parser.yy" +#line 349 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ; ;} @@ -1881,7 +1881,7 @@ yyreduce: case 42: /* Line 1464 of yacc.c */ -#line 351 "libmemcached/options/parser.yy" +#line 353 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_SORT_HOSTS; ;} @@ -1890,7 +1890,7 @@ yyreduce: case 43: /* Line 1464 of yacc.c */ -#line 355 "libmemcached/options/parser.yy" +#line 357 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_SUPPORT_CAS; ;} @@ -1899,7 +1899,7 @@ yyreduce: case 44: /* Line 1464 of yacc.c */ -#line 359 "libmemcached/options/parser.yy" +#line 361 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_TCP_NODELAY; ;} @@ -1908,7 +1908,7 @@ yyreduce: case 45: /* Line 1464 of yacc.c */ -#line 363 "libmemcached/options/parser.yy" +#line 365 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_TCP_KEEPALIVE; ;} @@ -1917,7 +1917,7 @@ yyreduce: case 46: /* Line 1464 of yacc.c */ -#line 367 "libmemcached/options/parser.yy" +#line 369 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_TCP_KEEPIDLE; ;} @@ -1926,7 +1926,7 @@ yyreduce: case 47: /* Line 1464 of yacc.c */ -#line 371 "libmemcached/options/parser.yy" +#line 373 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_USE_UDP; ;} @@ -1935,7 +1935,7 @@ yyreduce: case 48: /* Line 1464 of yacc.c */ -#line 375 "libmemcached/options/parser.yy" +#line 377 "libmemcached/options/parser.yy" { (yyval.behavior)= MEMCACHED_BEHAVIOR_VERIFY_KEY; ;} @@ -1944,35 +1944,35 @@ yyreduce: case 49: /* Line 1464 of yacc.c */ -#line 381 "libmemcached/options/parser.yy" - { ;} +#line 383 "libmemcached/options/parser.yy" + { (yyval.number)= MEMCACHED_DEFAULT_PORT;;} break; case 50: /* Line 1464 of yacc.c */ -#line 383 "libmemcached/options/parser.yy" +#line 385 "libmemcached/options/parser.yy" { ;} break; case 51: /* Line 1464 of yacc.c */ -#line 387 "libmemcached/options/parser.yy" - { ;} +#line 389 "libmemcached/options/parser.yy" + { (yyval.number)= 1; ;} break; case 52: /* Line 1464 of yacc.c */ -#line 389 "libmemcached/options/parser.yy" +#line 391 "libmemcached/options/parser.yy" { ;} break; case 53: /* Line 1464 of yacc.c */ -#line 394 "libmemcached/options/parser.yy" +#line 396 "libmemcached/options/parser.yy" { (yyval.hash)= MEMCACHED_HASH_MD5; ;} @@ -1981,7 +1981,7 @@ yyreduce: case 54: /* Line 1464 of yacc.c */ -#line 398 "libmemcached/options/parser.yy" +#line 400 "libmemcached/options/parser.yy" { (yyval.hash)= MEMCACHED_HASH_CRC; ;} @@ -1990,7 +1990,7 @@ yyreduce: case 55: /* Line 1464 of yacc.c */ -#line 402 "libmemcached/options/parser.yy" +#line 404 "libmemcached/options/parser.yy" { (yyval.hash)= MEMCACHED_HASH_FNV1_64; ;} @@ -1999,7 +1999,7 @@ yyreduce: case 56: /* Line 1464 of yacc.c */ -#line 406 "libmemcached/options/parser.yy" +#line 408 "libmemcached/options/parser.yy" { (yyval.hash)= MEMCACHED_HASH_FNV1A_64; ;} @@ -2008,7 +2008,7 @@ yyreduce: case 57: /* Line 1464 of yacc.c */ -#line 410 "libmemcached/options/parser.yy" +#line 412 "libmemcached/options/parser.yy" { (yyval.hash)= MEMCACHED_HASH_FNV1_32; ;} @@ -2017,7 +2017,7 @@ yyreduce: case 58: /* Line 1464 of yacc.c */ -#line 414 "libmemcached/options/parser.yy" +#line 416 "libmemcached/options/parser.yy" { (yyval.hash)= MEMCACHED_HASH_FNV1A_32; ;} @@ -2026,7 +2026,7 @@ yyreduce: case 59: /* Line 1464 of yacc.c */ -#line 418 "libmemcached/options/parser.yy" +#line 420 "libmemcached/options/parser.yy" { (yyval.hash)= MEMCACHED_HASH_HSIEH; ;} @@ -2035,7 +2035,7 @@ yyreduce: case 60: /* Line 1464 of yacc.c */ -#line 422 "libmemcached/options/parser.yy" +#line 424 "libmemcached/options/parser.yy" { (yyval.hash)= MEMCACHED_HASH_MURMUR; ;} @@ -2044,7 +2044,7 @@ yyreduce: case 61: /* Line 1464 of yacc.c */ -#line 426 "libmemcached/options/parser.yy" +#line 428 "libmemcached/options/parser.yy" { (yyval.hash)= MEMCACHED_HASH_JENKINS; ;} @@ -2053,7 +2053,7 @@ yyreduce: case 62: /* Line 1464 of yacc.c */ -#line 433 "libmemcached/options/parser.yy" +#line 435 "libmemcached/options/parser.yy" { (yyval.string)= (yyvsp[(1) - (1)].string); ;} @@ -2062,7 +2062,7 @@ yyreduce: case 63: /* Line 1464 of yacc.c */ -#line 437 "libmemcached/options/parser.yy" +#line 439 "libmemcached/options/parser.yy" { (yyval.string).c_str= (yyvsp[(1) - (1)].string).c_str +1; // +1 to move use passed the initial quote (yyval.string).size= (yyvsp[(1) - (1)].string).size -2; // -2 removes the begin and end quote @@ -2072,7 +2072,7 @@ yyreduce: case 64: /* Line 1464 of yacc.c */ -#line 445 "libmemcached/options/parser.yy" +#line 447 "libmemcached/options/parser.yy" { (yyval.distribution)= MEMCACHED_DISTRIBUTION_CONSISTENT; ;} @@ -2081,7 +2081,7 @@ yyreduce: case 65: /* Line 1464 of yacc.c */ -#line 449 "libmemcached/options/parser.yy" +#line 451 "libmemcached/options/parser.yy" { (yyval.distribution)= MEMCACHED_DISTRIBUTION_MODULA; ;} @@ -2090,7 +2090,7 @@ yyreduce: case 66: /* Line 1464 of yacc.c */ -#line 453 "libmemcached/options/parser.yy" +#line 455 "libmemcached/options/parser.yy" { (yyval.distribution)= MEMCACHED_DISTRIBUTION_RANDOM; ;} @@ -2311,7 +2311,7 @@ yyreturn: /* Line 1684 of yacc.c */ -#line 458 "libmemcached/options/parser.yy" +#line 460 "libmemcached/options/parser.yy" void Context::start() diff --git a/libmemcached/options/parser.yy b/libmemcached/options/parser.yy index e7fb84ed..6a7bd9b9 100644 --- a/libmemcached/options/parser.yy +++ b/libmemcached/options/parser.yy @@ -135,19 +135,21 @@ inline void config_error(Context *context, yyscan_t *scanner, const char *error) %token FLOAT %token NUMBER -%token PORT -%token WEIGHT_START +%token PORT +%token WEIGHT_START %token IPADDRESS %token HOSTNAME %token STRING %token QUOTED_STRING %token FILE_PATH -%type string -%type distribution -%type hash %type behavior_boolean %type behavior_number +%type distribution +%type hash +%type optional_port +%type optional_weight +%type string %% @@ -194,7 +196,7 @@ statement: expression: SERVER HOSTNAME optional_port optional_weight { - if ((context->rc= memcached_server_add_with_weight(context->memc, $2.c_str, $2.port, $2.weight)) != MEMCACHED_SUCCESS) + if (memcached_failed(context->rc= memcached_server_add_with_weight(context->memc, $2.c_str, $3, $4))) { parser_abort(context, NULL); } @@ -202,7 +204,7 @@ expression: } | SERVER IPADDRESS optional_port optional_weight { - if ((context->rc= memcached_server_add_with_weight(context->memc, $2.c_str, $2.port, $2.weight)) != MEMCACHED_SUCCESS) + if (memcached_failed(context->rc= memcached_server_add_with_weight(context->memc, $2.c_str, $3, $4))) { parser_abort(context, NULL); } @@ -378,13 +380,13 @@ behavior_boolean: optional_port: - { } + { $$= MEMCACHED_DEFAULT_PORT;} | PORT { }; ; optional_weight: - { } + { $$= 1; } | WEIGHT_START { } ; diff --git a/libmemcached/options/scanner.cc b/libmemcached/options/scanner.cc index 84d1c69c..fd5a0cb9 100644 --- a/libmemcached/options/scanner.cc +++ b/libmemcached/options/scanner.cc @@ -1568,17 +1568,17 @@ YY_RULE_SETUP case 2: YY_RULE_SETUP #line 79 "libmemcached/options/scanner.l" -{ yylval->number = atoi(yytext); return (NUMBER); } +{ yylval->number= atoi(yytext); return (NUMBER); } YY_BREAK case 3: YY_RULE_SETUP #line 81 "libmemcached/options/scanner.l" -{ yylval->server.port = atoi(yytext +1); return PORT; } +{ yylval->number= atoi(yytext +1); return PORT; } YY_BREAK case 4: YY_RULE_SETUP #line 83 "libmemcached/options/scanner.l" -{ yylval->server.weight = atoi(yytext +2); return WEIGHT_START; } +{ yylval->number= atoi(yytext +2); return WEIGHT_START; } YY_BREAK case 5: /* rule 5 can match eol */ diff --git a/libmemcached/options/scanner.l b/libmemcached/options/scanner.l index 694be4b3..dd6a9e00 100644 --- a/libmemcached/options/scanner.l +++ b/libmemcached/options/scanner.l @@ -76,11 +76,11 @@ =|,|[ ] { return yytext[0];} -[[:digit:]]+ { yylval->number = atoi(yytext); return (NUMBER); } +[[:digit:]]+ { yylval->number= atoi(yytext); return (NUMBER); } -:[[:digit:]]{1,5} { yylval->server.port = atoi(yytext +1); return PORT; } +:[[:digit:]]{1,5} { yylval->number= atoi(yytext +1); return PORT; } -"/?"[[:digit:]]{1,5} { yylval->server.weight = atoi(yytext +2); return WEIGHT_START; } +"/?"[[:digit:]]{1,5} { yylval->number= atoi(yytext +2); return WEIGHT_START; } [\t\r\n] ; /* skip whitespace */ diff --git a/tests/mem_functions.cc b/tests/mem_functions.cc index 3b417b29..14141a0b 100644 --- a/tests/mem_functions.cc +++ b/tests/mem_functions.cc @@ -5419,6 +5419,46 @@ static test_return_t test_get_last_disconnect(memcached_st *memc) return TEST_SUCCESS; } +static test_return_t test_multiple_get_last_disconnect(memcached_st *) +{ + const char *server_string= "--server=localhost:8888 --server=localhost:8889 --server=localhost:8890 --server=localhost:8891 --server=localhost:8892"; + char buffer[BUFSIZ]; + + memcached_return_t rc; + test_compare_got(MEMCACHED_SUCCESS, + rc= libmemcached_check_configuration(server_string, strlen(server_string), buffer, sizeof(buffer)), + memcached_strerror(NULL, rc)); + + memcached_st *memc= memcached(server_string, strlen(server_string)); + test_true(memc); + + // We will just use the error strings as our keys + uint32_t counter= 100; + while (--counter) + { + for (int x= int(MEMCACHED_SUCCESS); x < int(MEMCACHED_MAXIMUM_RETURN); ++x) + { + const char *msg= memcached_strerror(memc, memcached_return_t(x)); + memcached_return_t ret= memcached_set(memc, msg, strlen(msg), NULL, 0, (time_t)0, (uint32_t)0); + test_compare_got(MEMCACHED_WRITE_FAILURE, ret, memcached_strerror(NULL, ret)); + + memcached_server_instance_st disconnected_server= memcached_server_get_last_disconnect(memc); + test_true(disconnected_server); + test_strcmp("localhost", memcached_server_name(disconnected_server)); + test_true(memcached_server_port(disconnected_server) >= 8888 and memcached_server_port(disconnected_server) <= 8892); + + if (random() % 2) + { + memcached_reset_last_disconnected_server(memc); + } + } + } + + memcached_free(memc); + + return TEST_SUCCESS; +} + static test_return_t test_verbosity(memcached_st *memc) { memcached_verbosity(memc, 3); @@ -6013,6 +6053,12 @@ test_st string_tests[] ={ {0, 0, (test_callback_fn)0} }; +test_st memcached_server_get_last_disconnect_tests[] ={ + {"memcached_server_get_last_disconnect()", 0, (test_callback_fn)test_multiple_get_last_disconnect}, + {0, 0, (test_callback_fn)0} +}; + + test_st result_tests[] ={ {"result static", 0, (test_callback_fn)result_static}, {"result alloc", 0, (test_callback_fn)result_alloc}, @@ -6204,6 +6250,7 @@ test_st parser_tests[] ={ {"server", 0, (test_callback_fn)server_test }, {"bad server strings", 0, (test_callback_fn)servers_bad_test }, {"server with weights", 0, (test_callback_fn)server_with_weight_test }, + {"parsing servername, port, and weight", 0, (test_callback_fn)test_hostname_port_weight }, {0, 0, (test_callback_fn)0} }; @@ -6277,6 +6324,7 @@ collection_st collection[] ={ {"error_conditions", 0, 0, error_conditions}, {"parser", 0, 0, parser_tests}, {"virtual buckets", 0, 0, virtual_bucket_tests}, + {"memcached_server_get_last_disconnect", 0, 0, memcached_server_get_last_disconnect_tests}, {0, 0, 0, 0} }; diff --git a/tests/parser.cc b/tests/parser.cc index 68a65a40..7a8b8690 100644 --- a/tests/parser.cc +++ b/tests/parser.cc @@ -40,7 +40,8 @@ #include #include #include -#include +#include +#include #define BUILDING_LIBMEMCACHED // !NEVER use common.h, always use memcached.h in your own apps @@ -497,3 +498,50 @@ test_return_t random_statement_build_test(memcached_st*) return TEST_SUCCESS; } + +static memcached_return_t dump_server_information(const memcached_st *, + const memcached_server_st *instance, + void *) +{ + if (strcmp(memcached_server_name(instance), "localhost")) + { + assert(not memcached_server_name(instance)); + return MEMCACHED_FAILURE; + } + + if (memcached_server_port(instance) < 8888 or memcached_server_port(instance) > 8892) + { + assert(not memcached_server_port(instance)); + return MEMCACHED_FAILURE; + } + + if (instance->weight > 5 or instance->weight < 2) + { + assert(not instance->weight); + return MEMCACHED_FAILURE; + } + + return MEMCACHED_SUCCESS; +} + + +test_return_t test_hostname_port_weight(memcached_st *) +{ + const char *server_string= "--server=localhost:8888/?2 --server=localhost:8889/?3 --server=localhost:8890/?4 --server=localhost:8891/?5 --server=localhost:8892/?3"; + char buffer[BUFSIZ]; + + memcached_return_t rc; + test_compare_got(MEMCACHED_SUCCESS, + rc= libmemcached_check_configuration(server_string, strlen(server_string), buffer, sizeof(buffer)), + memcached_strerror(NULL, rc)); + + memcached_st *memc= memcached(server_string, strlen(server_string)); + test_true(memc); + + memcached_server_fn callbacks[]= { dump_server_information }; + test_true(memcached_success(memcached_server_cursor(memc, callbacks, NULL, 1))); + + memcached_free(memc); + + return TEST_SUCCESS; +} diff --git a/tests/parser.h b/tests/parser.h index c53f0e41..dba9bc59 100644 --- a/tests/parser.h +++ b/tests/parser.h @@ -97,6 +97,9 @@ test_return_t test_error_keyword(memcached_st*); LIBTEST_INTERNAL_API test_return_t server_with_weight_test(memcached_st *); +LIBTEST_INTERNAL_API +test_return_t test_hostname_port_weight(memcached_st *); + #ifdef __cplusplus } #endif -- 2.30.2