Skip to content

Commit bacbc06

Browse files
authored
BugFix: fix the problem of uneven traffic using backup request in IP direct connection scenario (#106)
1 parent 99fc614 commit bacbc06

File tree

2 files changed

+30
-9
lines changed

2 files changed

+30
-9
lines changed

trpc/naming/common/util/BUILD

+1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ cc_library(
1010
hdrs = ["utils_help.h"],
1111
deps = [
1212
"//trpc/naming/common:common_defs",
13+
"//trpc/util/algorithm:random",
1314
],
1415
)

trpc/naming/common/util/utils_help.cc

+29-9
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,44 @@
1515

1616
#include <stdlib.h>
1717

18+
#include "trpc/util/algorithm/random.h"
19+
1820
namespace trpc {
1921

2022
int SelectMultiple(const std::vector<TrpcEndpointInfo>& src, std::vector<TrpcEndpointInfo>* dst,
2123
const int select_size) {
24+
if (src.empty()) {
25+
return -1;
26+
}
27+
2228
int need_select_size = select_size;
2329
int instances_size = src.size();
2430
if (need_select_size > instances_size) {
2531
need_select_size = instances_size;
2632
}
27-
int pos = rand() % instances_size;
28-
if (pos + need_select_size > instances_size) {
29-
// Add instances_size-pos elements
30-
dst->assign(src.begin() + pos, src.end());
31-
// Add need_select_size - (instances_size-pos) elements
32-
int reserve_size = need_select_size - (instances_size - pos);
33-
dst->insert(dst->end(), src.begin(), src.begin() + reserve_size);
34-
} else {
35-
dst->assign(src.begin() + pos, src.begin() + pos + need_select_size);
33+
dst->reserve(need_select_size);
34+
35+
int pos = trpc::Random<uint32_t>() % instances_size;
36+
dst->push_back(src[pos]);
37+
if (instances_size == 1) {
38+
return 0;
39+
}
40+
41+
// Randomly obtain the offset of the next node to be retrieved and retrieve 'need_select_size - 1' nodes
42+
// continuously (skipping the selected node).
43+
int pos_offset = trpc::Random<uint32_t>() % (instances_size - 1) + 1;
44+
int next_pos = pos + pos_offset;
45+
for (int i = 1; i < need_select_size; i++) {
46+
if (next_pos >= instances_size) {
47+
next_pos -= instances_size;
48+
}
49+
if (next_pos == pos) {
50+
next_pos++;
51+
}
52+
if (next_pos >= instances_size) {
53+
next_pos -= instances_size;
54+
}
55+
dst->push_back(src[next_pos++]);
3656
}
3757

3858
return 0;

0 commit comments

Comments
 (0)