OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
control_node.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include "control_node.h"
6 
7 #include <boost/assign.hpp>
8 #include <sys/resource.h>
9 
10 #include "base/task.h"
12 #include "db/db.h"
13 
14 using process::ProcessState;
15 
16 //
17 // Default scheduler policy for control-node daemon and test processes.
18 //
20  static bool policy_set;
21 
22  if (policy_set)
23  return;
24  policy_set = true;
25 
27 
28  // Policy for bgp::Config Task.
29  TaskPolicy config_policy = boost::assign::list_of
30  (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
31  (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
32  (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter")))
33  (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate")))
34  (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
35  (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine")))
36  (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
37  (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
38  (TaskExclusion(scheduler->GetTaskId("db::IFMapTable")))
39  (TaskExclusion(scheduler->GetTaskId("db::Walker")))
40  (TaskExclusion(scheduler->GetTaskId("io::ReaderTask")))
41  (TaskExclusion(scheduler->GetTaskId("ifmap::StateMachine")))
42  (TaskExclusion(scheduler->GetTaskId("xmpp::StateMachine")))
43  (TaskExclusion(scheduler->GetTaskId("timer::TimerTask")))
44  (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand")))
45  (TaskExclusion(scheduler->GetTaskId("bgp::SendReadyTask")))
46  (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")))
47  (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")))
48  (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
49  (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop")));
50  scheduler->SetPolicy(scheduler->GetTaskId("bgp::Config"), config_policy);
51 
52  // Policy for bgp::ConfigHelper Task.
53  // Same as that for bgp:Config Task except that bgp:ConfigHelper
54  // is not exclusive with db::IFMapTable and ifmap::StateMachine.
55  TaskPolicy config_helper_policy = boost::assign::list_of
56  (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
57  (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
58  (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter")))
59  (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate")))
60  (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
61  (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine")))
62  (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
63  (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
64  (TaskExclusion(scheduler->GetTaskId("db::Walker")))
65  (TaskExclusion(scheduler->GetTaskId("io::ReaderTask")))
66  (TaskExclusion(scheduler->GetTaskId("xmpp::StateMachine")))
67  (TaskExclusion(scheduler->GetTaskId("timer::TimerTask")))
68  (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand")))
69  (TaskExclusion(scheduler->GetTaskId("bgp::SendReadyTask")))
70  (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")))
71  (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")))
72  (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
73  (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop")));
74  scheduler->SetPolicy(scheduler->GetTaskId("bgp::ConfigHelper"),
75  config_helper_policy);
76 
77  // Policy for bgp::ServiceChain and bgp::StaticRoute Tasks.
78  TaskPolicy static_service_chain_policy = boost::assign::list_of
79  (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
80  (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
81  (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
82  (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
83  (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
84  (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")))
85  (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
86  (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")))
87  (TaskExclusion(scheduler->GetTaskId("db::Walker")))
88  (TaskExclusion(scheduler->GetTaskId("db::DBTable")));
89  scheduler->SetPolicy(scheduler->GetTaskId("bgp::ServiceChain"),
90  static_service_chain_policy);
91  scheduler->SetPolicy(scheduler->GetTaskId("bgp::StaticRoute"),
92  static_service_chain_policy);
93 
94  // Policy for bgp::StateMachine and xmpp::StateMachine Tasks.
95  // Add policy to provision exclusion between io::Reader and
96  // bgp/xmpp StateMachine tasks with the same task instance.
97  TaskPolicy sm_policy = boost::assign::list_of
98  (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
99  (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
100  (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
101  (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand")))
102  (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter")));
103  for (int idx = 0; idx < scheduler->HardwareThreadCount(); ++idx) {
104  sm_policy.push_back(
105  (TaskExclusion(scheduler->GetTaskId("io::ReaderTask"), idx)));
106  }
107  scheduler->SetPolicy(scheduler->GetTaskId("bgp::StateMachine"),
108  sm_policy);
109  scheduler->SetPolicy(scheduler->GetTaskId("xmpp::StateMachine"),
110  sm_policy);
111 
112  // Policy for bgp::PeerMembership Task.
113  TaskPolicy peer_membership_policy = boost::assign::list_of
114  (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
115  (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
116  (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
117  (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
118  (TaskExclusion(scheduler->GetTaskId("db::Walker")))
119  (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate")))
120  (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
121  (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand")))
122  (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine")))
123  (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")))
124  (TaskExclusion(scheduler->GetTaskId("xmpp::StateMachine")));
125  scheduler->SetPolicy(scheduler->GetTaskId("bgp::PeerMembership"),
126  peer_membership_policy);
127 
128  // Policy for bgp::SendUpdate Task.
129  // Add policy to provision exclusion between db::DBTable and
130  // bgp::SendUpdate tasks with the same task instance.
131  TaskPolicy send_update_policy = boost::assign::list_of
132  (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
133  (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
134  (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
135  (TaskExclusion(scheduler->GetTaskId("bgp::SendReadyTask")));
136  for (int idx = 0; idx < DB::PartitionCount(); ++idx) {
137  send_update_policy.push_back(
138  (TaskExclusion(scheduler->GetTaskId("db::DBTable"), idx)));
139  }
140  scheduler->SetPolicy(scheduler->GetTaskId("bgp::SendUpdate"),
141  send_update_policy);
142 
143  // Policy for bgp::SendReadyTask Task.
144  TaskPolicy send_ready_policy = boost::assign::list_of
145  (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
146  (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
147  (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
148  (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate")))
149  (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")));
150  scheduler->SetPolicy(scheduler->GetTaskId("bgp::SendReadyTask"),
151  send_ready_policy);
152 
153  // Policy for bgp::EvpnSegment Task.
154  TaskPolicy evpn_segment_policy = boost::assign::list_of
155  (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
156  (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
157  (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
158  (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
159  (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")))
160  (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
161  (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")))
162  (TaskExclusion(scheduler->GetTaskId("db::Walker")))
163  (TaskExclusion(scheduler->GetTaskId("db::DBTable")));
164  scheduler->SetPolicy(scheduler->GetTaskId("bgp::EvpnSegment"),
165  evpn_segment_policy);
166 
167  // Policy for bgp::RTFilter Task.
168  TaskPolicy rtfilter_policy = boost::assign::list_of
169  (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
170  (TaskExclusion(scheduler->GetTaskId("db::Walker")))
171  (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine")))
172  (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
173  (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")));
174  scheduler->SetPolicy(scheduler->GetTaskId("bgp::RTFilter"),
175  rtfilter_policy);
176 
177  // Policy for bgp::ResolverPath Task.
178  TaskPolicy resolver_path_policy = boost::assign::list_of
179  (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
180  (TaskExclusion(scheduler->GetTaskId("db::Walker")))
181  (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
182  (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
183  (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
184  (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop")))
185  (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")))
186  (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
187  (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")));
188  scheduler->SetPolicy(scheduler->GetTaskId("bgp::ResolverPath"),
189  resolver_path_policy);
190 
191  // Policy for bgp::ResolverNexthop Task.
192  TaskPolicy resolver_nexthop_policy = boost::assign::list_of
193  (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
194  (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
195  (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
196  (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
197  (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")));
198  scheduler->SetPolicy(scheduler->GetTaskId("bgp::ResolverNexthop"),
199  resolver_nexthop_policy);
200 
201  // Policy for bgp::RouteAggregation Task.
202  TaskPolicy route_aggregation_policy = boost::assign::list_of
203  (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
204  (TaskExclusion(scheduler->GetTaskId("db::Walker")))
205  (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
206  (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
207  (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
208  (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop")))
209  (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
210  (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
211  (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")));
212  scheduler->SetPolicy(scheduler->GetTaskId("bgp::RouteAggregation"),
213  route_aggregation_policy);
214 
215  // Policy for db::IFMapTable Task.
216  TaskPolicy db_ifmap_policy = boost::assign::list_of
217  (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
218  (TaskExclusion(scheduler->GetTaskId("db::Walker")));
219  scheduler->SetPolicy(scheduler->GetTaskId("db::IFMapTable"),
220  db_ifmap_policy);
221 
222  // Policy for db::Walker Task.
223  // Rules:
224  // 1. All tasks that trigger WalkTable should be mutually exclusive to
225  // db::Walker task
226  // 2. All tasks that updates the db table partition should be mutually
227  // mutually exclusive
228  TaskPolicy walker_policy = boost::assign::list_of
229  // Following tasks trigger WalkTable
230  (TaskExclusion(scheduler->GetTaskId("bgp::Config")))
231  (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper")))
232  (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership")))
233  (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter")))
234  // Following tasks updates db table partition
235  (TaskExclusion(scheduler->GetTaskId("db::DBTable")))
236  (TaskExclusion(scheduler->GetTaskId("db::IFMapTable")))
237  (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment")))
238  (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath")))
239  (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation")))
240  (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain")))
241  (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute")));
242  scheduler->SetPolicy(scheduler->GetTaskId("db::Walker"), walker_policy);
243 }
244 
245 // Immediately exit control-node non-gracefully without creating any core dump.
246 void ControlNode::Exit(bool do_assert) {
247  rlimit new_core_limit;
248  new_core_limit.rlim_cur = 0;
249  new_core_limit.rlim_max = 0;
250  setrlimit(RLIMIT_CORE, &new_core_limit);
251  if (do_assert)
252  assert(false);
253  abort();
254 }
255 
256 string ControlNode::GetProcessState(bool bgpHasSelfConfiguration,
257  bool bgpIsAdminDown, bool configEndOfRibComputed,
258  ProcessState::type *state, string *message) {
259  if (!configEndOfRibComputed) {
260  *state = ProcessState::NON_FUNCTIONAL;
261  (*message) += (message->empty() ? "" : ", ") +
262  string("IFMap Server End-Of-RIB not computed");
263  }
264 
265  if (!bgpHasSelfConfiguration) {
266  *state = ProcessState::NON_FUNCTIONAL;
267  (*message) += (message->empty() ? "" : ", ") +
268  string("No BGP configuration for self");
269  }
270 
271  if (bgpIsAdminDown) {
272  *state = ProcessState::NON_FUNCTIONAL;
273  (*message) += (message->empty() ? "" : ", ") +
274  string("BGP is administratively down");
275  }
276 
277  return *message;
278 }
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
Definition: task.h:178
void SetPolicy(int task_id, TaskPolicy &policy)
Sets the task exclusion policy. Adds policy entries for the task Examples:
Definition: task.cc:610
static void Exit(bool do_assert)
int GetTaskId(const std::string &name)
Definition: task.cc:856
uint8_t type
Definition: load_balance.h:109
static TaskScheduler * GetInstance()
Definition: task.cc:547
static std::string GetProcessState(bool bgpHasSelfConfiguration, bool bgpIsAdminDown, bool configEndOfRibComputed, process::ProcessState::type *state, std::string *message)
std::vector< TaskExclusion > TaskPolicy
Definition: task.h:59
static void SetDefaultSchedulingPolicy()
Definition: control_node.cc:19
static int PartitionCount()
Definition: db.cc:32
int HardwareThreadCount()
Definition: task.h:276