diff options
Diffstat (limited to 'storage/spider/spd_conn.cc')
-rw-r--r-- | storage/spider/spd_conn.cc | 181 |
1 files changed, 73 insertions, 108 deletions
diff --git a/storage/spider/spd_conn.cc b/storage/spider/spd_conn.cc index 68c5362d..fed6bc27 100644 --- a/storage/spider/spd_conn.cc +++ b/storage/spider/spd_conn.cc @@ -108,7 +108,6 @@ uchar *spider_conn_get_key( ) { DBUG_ENTER("spider_conn_get_key"); *length = conn->conn_key_length; - DBUG_PRINT("info",("spider conn_kind=%u", conn->conn_kind)); #ifdef DBUG_TRACE spider_print_keys(conn->conn_key, conn->conn_key_length); #endif @@ -382,7 +381,6 @@ SPIDER_CONN *spider_create_conn( ha_spider *spider, int link_idx, int base_link_idx, - uint conn_kind, int *error_num ) { int *need_mon; @@ -602,7 +600,6 @@ SPIDER_CONN *spider_create_conn( conn->semi_trx_isolation_chk = FALSE; conn->semi_trx_chk = FALSE; conn->link_idx = base_link_idx; - conn->conn_kind = conn_kind; conn->conn_need_mon = need_mon; if (spider) conn->need_mon = &spider->need_mons[base_link_idx]; @@ -689,13 +686,11 @@ SPIDER_CONN *spider_get_conn( ha_spider *spider, bool another, bool thd_chg, - uint conn_kind, int *error_num ) { SPIDER_CONN *conn = NULL; int base_link_idx = link_idx; DBUG_ENTER("spider_get_conn"); - DBUG_PRINT("info",("spider conn_kind=%u", conn_kind)); if (spider) link_idx = spider->conn_link_idx[base_link_idx]; @@ -734,7 +729,8 @@ SPIDER_CONN *spider_get_conn( pthread_mutex_unlock(&spider_conn_mutex); if (spider_param_max_connections()) { /* enable connection pool */ - conn = spider_get_conn_from_idle_connection(share, link_idx, conn_key, spider, conn_kind, base_link_idx, error_num); + conn= spider_get_conn_from_idle_connection( + share, link_idx, conn_key, spider, base_link_idx, error_num); /* failed get conn, goto error */ if (!conn) goto error; @@ -743,8 +739,8 @@ SPIDER_CONN *spider_get_conn( else { /* did not enable conncetion pool , create_conn */ DBUG_PRINT("info",("spider create new conn")); - if (!(conn = spider_create_conn(share, spider, link_idx, - base_link_idx, conn_kind, error_num))) + if (!(conn= spider_create_conn(share, spider, link_idx, + base_link_idx, error_num))) goto error; *conn->conn_key = *conn_key; if (spider) @@ -768,8 +764,8 @@ SPIDER_CONN *spider_get_conn( } else { DBUG_PRINT("info",("spider create new conn")); /* conn_recycle_strict = 0 and conn_recycle_mode = 0 or 2 */ - if (!(conn = spider_create_conn(share, spider, link_idx, base_link_idx, - conn_kind, error_num))) + if (!(conn= spider_create_conn(share, spider, link_idx, base_link_idx, + error_num))) goto error; *conn->conn_key = *conn_key; if (spider) @@ -918,8 +914,7 @@ int spider_check_and_get_casual_read_conn( '0' + spider->result_list.casual_read[link_idx]; if (!(spider->conns[link_idx]= spider_get_conn( spider->share, link_idx, spider->conn_keys[link_idx], - spider->wide_handler->trx, spider, FALSE, TRUE, - SPIDER_CONN_KIND_MYSQL, &error_num))) + spider->wide_handler->trx, spider, FALSE, TRUE, &error_num))) { *spider->conn_keys[link_idx] = first_byte_bak; DBUG_RETURN(error_num); @@ -3024,12 +3019,6 @@ void *spider_bg_sts_action( if (spider.search_link_idx < 0) { spider_trx_set_link_idx_for_all(&spider); -/* - spider.search_link_idx = spider_conn_next_link_idx( - thd, share->link_statuses, share->access_balances, - spider.conn_link_idx, spider.search_link_idx, share->link_count, - SPIDER_LINK_STATUS_OK); -*/ spider.search_link_idx = spider_conn_first_link_idx(thd, share->link_statuses, share->access_balances, spider.conn_link_idx, share->link_count, SPIDER_LINK_STATUS_OK); @@ -3042,36 +3031,9 @@ void *spider_bg_sts_action( if (!conns[spider.search_link_idx]) { spider_get_conn(share, spider.search_link_idx, - share->conn_keys[spider.search_link_idx], - trx, &spider, FALSE, FALSE, SPIDER_CONN_KIND_MYSQL, - &error_num); + share->conn_keys[spider.search_link_idx], trx, + &spider, FALSE, FALSE, &error_num); conns[spider.search_link_idx]->error_mode = 0; -/* - if ( - error_num && - share->monitoring_kind[spider.search_link_idx] && - need_mons[spider.search_link_idx] - ) { - lex_start(thd); - error_num = spider_ping_table_mon_from_table( - trx, - thd, - share, - spider.search_link_idx, - (uint32) share->monitoring_sid[spider.search_link_idx], - share->table_name, - share->table_name_length, - spider.conn_link_idx[spider.search_link_idx], - NULL, - 0, - share->monitoring_kind[spider.search_link_idx], - share->monitoring_limit[spider.search_link_idx], - share->monitoring_flag[spider.search_link_idx], - TRUE - ); - lex_end(thd->lex); - } -*/ spider.search_link_idx = -1; } if (spider.search_link_idx != -1 && conns[spider.search_link_idx]) @@ -3082,31 +3044,6 @@ void *spider_bg_sts_action( share->bg_sts_sync, 2, HA_STATUS_CONST | HA_STATUS_VARIABLE)) { -/* - if ( - share->monitoring_kind[spider.search_link_idx] && - need_mons[spider.search_link_idx] - ) { - lex_start(thd); - error_num = spider_ping_table_mon_from_table( - trx, - thd, - share, - spider.search_link_idx, - (uint32) share->monitoring_sid[spider.search_link_idx], - share->table_name, - share->table_name_length, - spider.conn_link_idx[spider.search_link_idx], - NULL, - 0, - share->monitoring_kind[spider.search_link_idx], - share->monitoring_limit[spider.search_link_idx], - share->monitoring_flag[spider.search_link_idx], - TRUE - ); - lex_end(thd->lex); - } -*/ spider.search_link_idx = -1; } } @@ -3349,12 +3286,6 @@ void *spider_bg_crd_action( if (spider.search_link_idx < 0) { spider_trx_set_link_idx_for_all(&spider); -/* - spider.search_link_idx = spider_conn_next_link_idx( - thd, share->link_statuses, share->access_balances, - spider.conn_link_idx, spider.search_link_idx, share->link_count, - SPIDER_LINK_STATUS_OK); -*/ spider.search_link_idx = spider_conn_first_link_idx(thd, share->link_statuses, share->access_balances, spider.conn_link_idx, share->link_count, SPIDER_LINK_STATUS_OK); @@ -3367,9 +3298,8 @@ void *spider_bg_crd_action( if (!conns[spider.search_link_idx]) { spider_get_conn(share, spider.search_link_idx, - share->conn_keys[spider.search_link_idx], - trx, &spider, FALSE, FALSE, SPIDER_CONN_KIND_MYSQL, - &error_num); + share->conn_keys[spider.search_link_idx], trx, + &spider, FALSE, FALSE, &error_num); conns[spider.search_link_idx]->error_mode = 0; /* if ( @@ -3781,6 +3711,24 @@ void *spider_bg_mon_action( } } +/** + Returns a random (active) server with a maximum required link status + + Calculate the sum of balances of all servers whose link status is at + most the specified status ("eligible"), generate a random number + less than this balance, then find the first server cumulatively + exceeding this balance + + @param thd Connection used for generating a random number + @param link_statuses The link statuses of servers + @param access_balances The access balances of servers + @param conn_link_idx Array of indexes to servers + @param link_count Number of servers + @param link_status The maximum required link status + @retval Index to the found server + @retval -1 if no eligible servers + @retval -2 if out of memory +*/ int spider_conn_first_link_idx( THD *thd, long *link_statuses, @@ -3789,35 +3737,35 @@ int spider_conn_first_link_idx( int link_count, int link_status ) { - int roop_count, active_links = 0; - longlong balance_total = 0, balance_val; + int eligible_link_idx, eligible_links = 0; + longlong balance_total = 0, balance_threshold; double rand_val; - int *link_idxs, link_idx; - long *balances; + int *link_idxs, result; DBUG_ENTER("spider_conn_first_link_idx"); char *ptr; - ptr = (char *) my_alloca((sizeof(int) * link_count) + (sizeof(long) * link_count)); + /* Allocate memory for link_idxs */ + ptr = (char *) my_alloca((sizeof(int) * link_count)); if (!ptr) { DBUG_PRINT("info",("spider out of memory")); DBUG_RETURN(-2); } link_idxs = (int *) ptr; - ptr += sizeof(int) * link_count; - balances = (long *) ptr; - for (roop_count = 0; roop_count < link_count; roop_count++) + + /* Filter for eligible servers, store their indexes and calculate + the total balances */ + for (int link_idx = 0; link_idx < link_count; link_idx++) { - DBUG_ASSERT((conn_link_idx[roop_count] - roop_count) % link_count == 0); - if (link_statuses[conn_link_idx[roop_count]] <= link_status) + DBUG_ASSERT((conn_link_idx[link_idx] - link_idx) % link_count == 0); + if (link_statuses[conn_link_idx[link_idx]] <= link_status) { - link_idxs[active_links] = roop_count; - balances[active_links] = access_balances[roop_count]; - balance_total += access_balances[roop_count]; - active_links++; + link_idxs[eligible_links] = link_idx; + balance_total += access_balances[link_idx]; + eligible_links++; } } - if (active_links == 0) + if (eligible_links == 0) { DBUG_PRINT("info",("spider all links are failed")); my_afree(link_idxs); @@ -3827,21 +3775,25 @@ int spider_conn_first_link_idx( DBUG_PRINT("info",("spider thread_id=%lu", thd_get_thread_id(thd))); rand_val = spider_rand(thd->variables.server_id + thd_get_thread_id(thd)); DBUG_PRINT("info",("spider rand_val=%f", rand_val)); - balance_val = (longlong) (rand_val * balance_total); - DBUG_PRINT("info",("spider balance_val=%lld", balance_val)); - for (roop_count = 0; roop_count < active_links - 1; roop_count++) - { + balance_threshold = (longlong) (rand_val * balance_total); + DBUG_PRINT("info",("spider balance_threshold=%lld", balance_threshold)); + /* Since balance_threshold < total balance, this loop WILL break */ + for (eligible_link_idx = 0; + eligible_link_idx < eligible_links; + eligible_link_idx++) + { + result = link_idxs[eligible_link_idx]; + const long balance = access_balances[result]; DBUG_PRINT("info",("spider balances[%d]=%ld", - roop_count, balances[roop_count])); - if (balance_val < balances[roop_count]) + link_idxs[eligible_link_idx], balance)); + if (balance_threshold < balance) break; - balance_val -= balances[roop_count]; + balance_threshold -= balance; } - DBUG_PRINT("info",("spider first link_idx=%d", link_idxs[roop_count])); - link_idx = link_idxs[roop_count]; + DBUG_PRINT("info",("spider first link_idx=%d", result)); my_afree(link_idxs); - DBUG_RETURN(link_idx); + DBUG_RETURN(result); } int spider_conn_next_link_idx( @@ -3876,6 +3828,17 @@ int spider_conn_next_link_idx( DBUG_RETURN(tmp_link_idx); } +/** + Finds the next active server with a maximum required link status + + @param link_statuses The statuses of servers + @param conn_link_idx The array of active servers + @param link_idx The index of the current active server + @param link_count The number of active servers + @param link_status The required maximum link status + @return The next active server whose link status is + at most the required one. +*/ int spider_conn_link_idx_next( long *link_statuses, uint *conn_link_idx, @@ -3888,6 +3851,8 @@ int spider_conn_link_idx_next( link_idx++; if (link_idx >= link_count) break; + /* Asserts that the `link_idx`th active server is in the correct + "group" */ DBUG_ASSERT((conn_link_idx[link_idx] - link_idx) % link_count == 0); } while (link_statuses[conn_link_idx[link_idx]] > link_status); DBUG_PRINT("info",("spider link_idx=%d", link_idx)); @@ -3936,7 +3901,6 @@ SPIDER_CONN* spider_get_conn_from_idle_connection( int link_idx, char *conn_key, ha_spider *spider, - uint conn_kind, int base_link_idx, int *error_num ) @@ -4024,7 +3988,8 @@ SPIDER_CONN* spider_get_conn_from_idle_connection( if (ip_port_conn) pthread_mutex_unlock(&ip_port_conn->mutex); DBUG_PRINT("info",("spider create new conn")); - if (!(conn = spider_create_conn(share, spider, link_idx, base_link_idx, conn_kind, error_num))) + if (!(conn= spider_create_conn(share, spider, link_idx, base_link_idx, + error_num))) DBUG_RETURN(conn); *conn->conn_key = *conn_key; if (spider) |