Revision 821be56a
Added by Viktor Gurov almost 5 years ago
src/etc/inc/filter.inc | ||
---|---|---|
938 | 938 |
break; |
939 | 939 |
} |
940 | 940 |
} |
941 |
/* see "Load balancing fails when one gateway has a weight of 1 |
|
942 |
* and another gateway has a weight >1", https://redmine.pfsense.org/issues/6025 */ |
|
943 |
foreach ($members as $idx => $member) { |
|
944 |
if ((int) $member['weight'] == 1) { |
|
945 |
$weight1 = true; |
|
946 |
} elseif ((int) $member['weight'] > 1) { |
|
947 |
$weightgt1 = true; |
|
948 |
} |
|
949 |
} |
|
950 |
if ($weight1 && $weightgt1) { |
|
951 |
$mult = 2; |
|
952 |
} else { |
|
953 |
$mult = 1; |
|
954 |
} |
|
941 | 955 |
foreach ($members as $idx => $member) { |
942 | 956 |
$int = $member['int']; |
943 | 957 |
$gatewayip = $member['gwip']; |
... | ... | |
953 | 967 |
if ($g['debug']) { |
954 | 968 |
log_error(sprintf(gettext('Setting up route with %1$s on %2$s'), $gatewayip, $int)); |
955 | 969 |
} |
956 |
if ($routetomembers + (int) $member['weight'] > 384) {
|
|
970 |
if ($routetomembers + ((int) $member['weight'] * $mult) > 384) {
|
|
957 | 971 |
// would create invalid ruleset, bail |
958 | 972 |
log_error(sprintf(gettext("Too many members in group %s, gateway group truncated in ruleset."), $member['name'])); |
959 | 973 |
continue; |
960 | 974 |
} |
961 |
if ((int) $member['weight'] > 1) {
|
|
962 |
$routeto .= str_repeat("( {$int} {$gatewayip} ) ", $member['weight']); |
|
975 |
if ((int) $member['weight'] > 0) {
|
|
976 |
$routeto .= str_repeat("( {$int} {$gatewayip} ) ", $member['weight'] * $mult);
|
|
963 | 977 |
$routetomembers += (int) $member['weight']; |
964 | 978 |
} else { |
965 | 979 |
$routeto .= "( {$int} {$gatewayip} ) "; |
Also available in: Unified diff
Load balancing when one gateway has a weight of 1 and another gateway has a weight >1. Fixes #6025