diff options
Diffstat (limited to 'storage/spider/spd_conn.cc')
-rw-r--r-- | storage/spider/spd_conn.cc | 148 |
1 files changed, 60 insertions, 88 deletions
diff --git a/storage/spider/spd_conn.cc b/storage/spider/spd_conn.cc index ca556702c65..1baf6a30e7c 100644 --- a/storage/spider/spd_conn.cc +++ b/storage/spider/spd_conn.cc @@ -2992,12 +2992,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); @@ -3013,32 +3007,6 @@ void *spider_bg_sts_action( 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]) @@ -3049,31 +3017,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; } } @@ -3316,12 +3259,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); @@ -3747,6 +3684,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, @@ -3755,35 +3710,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); @@ -3793,21 +3748,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( @@ -3842,6 +3801,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, @@ -3854,6 +3824,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)); |