--- src/zabbix_server/pgmanager/pg_cache.c.orig 2024-10-17 04:04:52.708634109 +0000 +++ src/zabbix_server/pgmanager/pg_cache.c 2024-10-17 04:08:25.181027205 +0000 @@ -363,6 +363,21 @@ static int pg_proxy_hosts_compare_by_hos /****************************************************************************** * * + * Purpose: compare function to sort proxies by number of hosts in ascending * + * order for initial registration * + * * + ******************************************************************************/ +static int pg_proxy_hosts_compare_by_hosts_asc_init(const void *d1, const void *d2) +{ + const zbx_pg_proxy_hosts_t *ph1 = *(const zbx_pg_proxy_hosts_t * const *)d1; + const zbx_pg_proxy_hosts_t *ph2 = *(const zbx_pg_proxy_hosts_t * const *)d2; + + return ph1->hosts_num - ph2->hosts_num; +} + + +/****************************************************************************** + * * * Purpose: unassign last host from proxy * * * ******************************************************************************/ @@ -421,7 +436,47 @@ static void pg_cache_group_unassign_exce out: zabbix_log(LOG_LEVEL_DEBUG, "End of %s()", __func__); } +/****************************************************************************** + * * + * Purpose: distribute unassigned hosts between online proxies for initial registration * + * * + * Parameters: cache - [IN] proxy group cache * + * group - [IN] target group * + * proxies - [IN] target proxies * + * * + * Return value: SUCCEED - unassigned hosts were distributed between online * + * proxies * + * FAIL - otherwise * + * * + ******************************************************************************/ +static int pg_cache_group_distribute_hosts_init(zbx_pg_cache_t *cache, zbx_pg_group_t *group, + zbx_vector_pg_proxy_hosts_ptr_t *proxies) +{ + if (0 == group->unassigned_hostids.values_num) + return FAIL; + + zbx_vector_pg_proxy_hosts_ptr_sort(proxies, pg_proxy_hosts_compare_by_hosts_asc_init); + + while (0 < group->unassigned_hostids.values_num) + { + int hosts_num = proxies->values[0]->hosts_num + 1; + for (int i = 0; i < proxies->values_num && 0 < group->unassigned_hostids.values_num; i++) + { + if (hosts_num <= proxies->values[i]->hosts_num) + break; + + int last = group->unassigned_hostids.values_num - 1; + + proxies->values[i]->hosts_num++; + pg_cache_set_host_proxy(cache, group->unassigned_hostids.values[last], + proxies->values[i]->proxy->proxyid); + zbx_vector_uint64_remove_noorder(&group->unassigned_hostids, last); + } + } + + return SUCCEED; +} /****************************************************************************** * * * Purpose: distribute unassigned hosts between online proxies * @@ -600,8 +655,7 @@ static int pg_cache_reassign_hosts(zbx_p if (0 == proxies.values_num) goto out; - if (SUCCEED == pg_cache_group_distribute_hosts(cache, group, &proxies)) - goto out; + if (SUCCEED == pg_cache_group_distribute_hosts_init(cache, group, &proxies)) if (hosts_num > proxies.values_num) hosts_min = hosts_num / proxies.values_num;