GRPC Core  18.0.0
address_filtering.h
Go to the documentation of this file.
1 //
2 // Copyright 2020 gRPC authors.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_ADDRESS_FILTERING_H
18 #define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_ADDRESS_FILTERING_H
19 
21 
22 #include <map>
23 #include <string>
24 #include <vector>
25 
27 
28 // The resolver returns a flat list of addresses. When a hierarchy of
29 // LB policies is in use, each leaf of the hierarchy will need a
30 // different subset of those addresses. This library provides a
31 // mechanism for determining which address is passed to which leaf
32 // policy.
33 //
34 // Each address will have an associated path that indicates which child
35 // it should be sent to at each level of the hierarchy to wind up at the
36 // right leaf policy. Each LB policy will look at the first element of
37 // the path of each address to determine which child to send the address
38 // to. It will then remove that first element when passing the address
39 // down to its child.
40 //
41 // For example, consider the following LB policy hierarchy:
42 //
43 // - priority
44 // - child0 (weighted_target)
45 // - localityA (round_robin)
46 // - localityB (round_robin)
47 // - child1 (weighted_target)
48 // - localityC (round_robin)
49 // - localityD (round_robin)
50 //
51 // Now consider the following addresses:
52 // - 10.0.0.1:80 path=["child0", "localityA"]
53 // - 10.0.0.2:80 path=["child0", "localityB"]
54 // - 10.0.0.3:80 path=["child1", "localityC"]
55 // - 10.0.0.4:80 path=["child1", "localityD"]
56 //
57 // The priority policy will split this up into two lists, one for each
58 // of its children:
59 // - child0:
60 // - 10.0.0.1:80 path=["localityA"]
61 // - 10.0.0.2:80 path=["localityB"]
62 // - child1:
63 // - 10.0.0.3:80 path=["localityC"]
64 // - 10.0.0.4:80 path=["localityD"]
65 //
66 // The weighted_target policy for child0 will split its list up into two
67 // lists, one for each of its children:
68 // - localityA:
69 // - 10.0.0.1:80 path=[]
70 // - localityB:
71 // - 10.0.0.2:80 path=[]
72 //
73 // Similarly, the weighted_target policy for child1 will split its list
74 // up into two lists, one for each of its children:
75 // - localityC:
76 // - 10.0.0.3:80 path=[]
77 // - localityD:
78 // - 10.0.0.4:80 path=[]
79 
80 namespace grpc_core {
81 
82 // The attribute key to be used for hierarchical paths in ServerAddress.
83 extern const char* kHierarchicalPathAttributeKey;
84 
85 // Constructs an address attribute containing the hierarchical path
86 // to be associated with the address.
87 std::unique_ptr<ServerAddress::AttributeInterface>
88 MakeHierarchicalPathAttribute(std::vector<std::string> path);
89 
90 // A map from the next path element to the addresses that fall under
91 // that path element.
92 using HierarchicalAddressMap = std::map<std::string, ServerAddressList>;
93 
94 // Splits up the addresses into a separate list for each child.
96  const ServerAddressList& addresses);
97 
98 } // namespace grpc_core
99 
100 #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_ADDRESS_FILTERING_H \
101  */
Round Robin Policy.
Definition: backend_metric.cc:26
absl::InlinedVector< ServerAddress, 1 > ServerAddressList
Definition: server_address.h:111
std::unique_ptr< ServerAddress::AttributeInterface > MakeHierarchicalPathAttribute(std::vector< std::string > path)
Definition: address_filtering.cc:68
const char * kHierarchicalPathAttributeKey
Definition: address_filtering.cc:30
std::map< std::string, ServerAddressList > HierarchicalAddressMap
Definition: address_filtering.h:92
HierarchicalAddressMap MakeHierarchicalAddressMap(const ServerAddressList &addresses)
Definition: address_filtering.cc:72