Line data Source code
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" 11 : #include "control-node/control_node.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 : // 19 273 : void ControlNode::SetDefaultSchedulingPolicy() { 20 : static bool policy_set; 21 : 22 273 : if (policy_set) 23 97 : return; 24 176 : policy_set = true; 25 : 26 176 : TaskScheduler *scheduler = TaskScheduler::GetInstance(); 27 : 28 : // Policy for bgp::Config Task. 29 : TaskPolicy config_policy = boost::assign::list_of 30 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 31 352 : (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment"))) 32 352 : (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter"))) 33 352 : (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate"))) 34 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain"))) 35 352 : (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine"))) 36 352 : (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership"))) 37 352 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))) 38 352 : (TaskExclusion(scheduler->GetTaskId("db::IFMapTable"))) 39 352 : (TaskExclusion(scheduler->GetTaskId("db::Walker"))) 40 352 : (TaskExclusion(scheduler->GetTaskId("io::ReaderTask"))) 41 352 : (TaskExclusion(scheduler->GetTaskId("ifmap::StateMachine"))) 42 352 : (TaskExclusion(scheduler->GetTaskId("xmpp::StateMachine"))) 43 352 : (TaskExclusion(scheduler->GetTaskId("timer::TimerTask"))) 44 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand"))) 45 352 : (TaskExclusion(scheduler->GetTaskId("bgp::SendReadyTask"))) 46 352 : (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute"))) 47 352 : (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation"))) 48 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath"))) 49 176 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop"))); 50 176 : 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 352 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 57 352 : (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment"))) 58 352 : (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter"))) 59 352 : (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate"))) 60 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain"))) 61 352 : (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine"))) 62 352 : (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership"))) 63 352 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))) 64 352 : (TaskExclusion(scheduler->GetTaskId("db::Walker"))) 65 352 : (TaskExclusion(scheduler->GetTaskId("io::ReaderTask"))) 66 352 : (TaskExclusion(scheduler->GetTaskId("xmpp::StateMachine"))) 67 352 : (TaskExclusion(scheduler->GetTaskId("timer::TimerTask"))) 68 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand"))) 69 352 : (TaskExclusion(scheduler->GetTaskId("bgp::SendReadyTask"))) 70 352 : (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute"))) 71 352 : (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation"))) 72 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath"))) 73 176 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop"))); 74 176 : 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 352 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 80 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 81 352 : (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment"))) 82 352 : (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership"))) 83 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath"))) 84 352 : (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation"))) 85 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain"))) 86 352 : (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute"))) 87 352 : (TaskExclusion(scheduler->GetTaskId("db::Walker"))) 88 176 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))); 89 176 : scheduler->SetPolicy(scheduler->GetTaskId("bgp::ServiceChain"), 90 : static_service_chain_policy); 91 176 : 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 352 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 99 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 100 352 : (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership"))) 101 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand"))) 102 176 : (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter"))); 103 880 : for (int idx = 0; idx < scheduler->HardwareThreadCount(); ++idx) { 104 704 : sm_policy.push_back( 105 1408 : (TaskExclusion(scheduler->GetTaskId("io::ReaderTask"), idx))); 106 : } 107 176 : scheduler->SetPolicy(scheduler->GetTaskId("bgp::StateMachine"), 108 : sm_policy); 109 176 : 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 352 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 115 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 116 352 : (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment"))) 117 352 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))) 118 352 : (TaskExclusion(scheduler->GetTaskId("db::Walker"))) 119 352 : (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate"))) 120 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain"))) 121 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand"))) 122 352 : (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine"))) 123 352 : (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute"))) 124 176 : (TaskExclusion(scheduler->GetTaskId("xmpp::StateMachine"))); 125 176 : 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 352 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 133 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 134 352 : (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership"))) 135 176 : (TaskExclusion(scheduler->GetTaskId("bgp::SendReadyTask"))); 136 868 : for (int idx = 0; idx < DB::PartitionCount(); ++idx) { 137 692 : send_update_policy.push_back( 138 1384 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"), idx))); 139 : } 140 176 : 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 352 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 146 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 147 352 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))) 148 352 : (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate"))) 149 176 : (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership"))); 150 176 : 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 352 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 156 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 157 352 : (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership"))) 158 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath"))) 159 352 : (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation"))) 160 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain"))) 161 352 : (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute"))) 162 352 : (TaskExclusion(scheduler->GetTaskId("db::Walker"))) 163 176 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))); 164 176 : 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 352 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))) 170 352 : (TaskExclusion(scheduler->GetTaskId("db::Walker"))) 171 352 : (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine"))) 172 352 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 173 176 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))); 174 176 : 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 352 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))) 180 352 : (TaskExclusion(scheduler->GetTaskId("db::Walker"))) 181 352 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 182 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 183 352 : (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment"))) 184 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop"))) 185 352 : (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation"))) 186 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain"))) 187 176 : (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute"))); 188 176 : 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 352 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))) 194 352 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 195 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 196 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath"))) 197 176 : (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation"))); 198 176 : 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 352 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))) 204 352 : (TaskExclusion(scheduler->GetTaskId("db::Walker"))) 205 352 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 206 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 207 352 : (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment"))) 208 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop"))) 209 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath"))) 210 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain"))) 211 176 : (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute"))); 212 176 : 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 352 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 218 176 : (TaskExclusion(scheduler->GetTaskId("db::Walker"))); 219 176 : 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 352 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 231 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 232 352 : (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership"))) 233 352 : (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter"))) 234 : // Following tasks updates db table partition 235 352 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))) 236 352 : (TaskExclusion(scheduler->GetTaskId("db::IFMapTable"))) 237 352 : (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment"))) 238 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath"))) 239 352 : (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation"))) 240 352 : (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain"))) 241 176 : (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute"))); 242 176 : scheduler->SetPolicy(scheduler->GetTaskId("db::Walker"), walker_policy); 243 176 : } 244 : 245 : // Immediately exit control-node non-gracefully without creating any core dump. 246 0 : void ControlNode::Exit(bool do_assert) { 247 : rlimit new_core_limit; 248 0 : new_core_limit.rlim_cur = 0; 249 0 : new_core_limit.rlim_max = 0; 250 0 : setrlimit(RLIMIT_CORE, &new_core_limit); 251 0 : if (do_assert) 252 0 : assert(false); 253 0 : abort(); 254 : } 255 : 256 0 : string ControlNode::GetProcessState(bool bgpHasSelfConfiguration, 257 : bool bgpIsAdminDown, bool configEndOfRibComputed, 258 : ProcessState::type *state, string *message) { 259 0 : if (!configEndOfRibComputed) { 260 0 : *state = ProcessState::NON_FUNCTIONAL; 261 0 : (*message) += (message->empty() ? "" : ", ") + 262 0 : string("IFMap Server End-Of-RIB not computed"); 263 : } 264 : 265 0 : if (!bgpHasSelfConfiguration) { 266 0 : *state = ProcessState::NON_FUNCTIONAL; 267 0 : (*message) += (message->empty() ? "" : ", ") + 268 0 : string("No BGP configuration for self"); 269 : } 270 : 271 0 : if (bgpIsAdminDown) { 272 0 : *state = ProcessState::NON_FUNCTIONAL; 273 0 : (*message) += (message->empty() ? "" : ", ") + 274 0 : string("BGP is administratively down"); 275 : } 276 : 277 0 : return *message; 278 : }