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 272 : void ControlNode::SetDefaultSchedulingPolicy() { 20 : static bool policy_set; 21 : 22 272 : if (policy_set) 23 97 : return; 24 175 : policy_set = true; 25 : 26 175 : TaskScheduler *scheduler = TaskScheduler::GetInstance(); 27 : 28 : // Policy for bgp::Config Task. 29 : TaskPolicy config_policy = boost::assign::list_of 30 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 31 350 : (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment"))) 32 350 : (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter"))) 33 350 : (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate"))) 34 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain"))) 35 350 : (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine"))) 36 350 : (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership"))) 37 350 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))) 38 350 : (TaskExclusion(scheduler->GetTaskId("db::IFMapTable"))) 39 350 : (TaskExclusion(scheduler->GetTaskId("db::Walker"))) 40 350 : (TaskExclusion(scheduler->GetTaskId("io::ReaderTask"))) 41 350 : (TaskExclusion(scheduler->GetTaskId("ifmap::StateMachine"))) 42 350 : (TaskExclusion(scheduler->GetTaskId("xmpp::StateMachine"))) 43 350 : (TaskExclusion(scheduler->GetTaskId("timer::TimerTask"))) 44 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand"))) 45 350 : (TaskExclusion(scheduler->GetTaskId("bgp::SendReadyTask"))) 46 350 : (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute"))) 47 350 : (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation"))) 48 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath"))) 49 175 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop"))); 50 175 : 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 350 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 57 350 : (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment"))) 58 350 : (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter"))) 59 350 : (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate"))) 60 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain"))) 61 350 : (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine"))) 62 350 : (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership"))) 63 350 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))) 64 350 : (TaskExclusion(scheduler->GetTaskId("db::Walker"))) 65 350 : (TaskExclusion(scheduler->GetTaskId("io::ReaderTask"))) 66 350 : (TaskExclusion(scheduler->GetTaskId("xmpp::StateMachine"))) 67 350 : (TaskExclusion(scheduler->GetTaskId("timer::TimerTask"))) 68 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand"))) 69 350 : (TaskExclusion(scheduler->GetTaskId("bgp::SendReadyTask"))) 70 350 : (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute"))) 71 350 : (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation"))) 72 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath"))) 73 175 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop"))); 74 175 : 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 350 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 80 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 81 350 : (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment"))) 82 350 : (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership"))) 83 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath"))) 84 350 : (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation"))) 85 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain"))) 86 350 : (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute"))) 87 350 : (TaskExclusion(scheduler->GetTaskId("db::Walker"))) 88 175 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))); 89 175 : scheduler->SetPolicy(scheduler->GetTaskId("bgp::ServiceChain"), 90 : static_service_chain_policy); 91 175 : 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 350 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 99 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 100 350 : (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership"))) 101 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand"))) 102 175 : (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter"))); 103 875 : for (int idx = 0; idx < scheduler->HardwareThreadCount(); ++idx) { 104 700 : sm_policy.push_back( 105 1400 : (TaskExclusion(scheduler->GetTaskId("io::ReaderTask"), idx))); 106 : } 107 175 : scheduler->SetPolicy(scheduler->GetTaskId("bgp::StateMachine"), 108 : sm_policy); 109 175 : 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 350 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 115 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 116 350 : (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment"))) 117 350 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))) 118 350 : (TaskExclusion(scheduler->GetTaskId("db::Walker"))) 119 350 : (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate"))) 120 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain"))) 121 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ShowCommand"))) 122 350 : (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine"))) 123 350 : (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute"))) 124 175 : (TaskExclusion(scheduler->GetTaskId("xmpp::StateMachine"))); 125 175 : 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 350 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 133 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 134 350 : (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership"))) 135 175 : (TaskExclusion(scheduler->GetTaskId("bgp::SendReadyTask"))); 136 863 : for (int idx = 0; idx < DB::PartitionCount(); ++idx) { 137 688 : send_update_policy.push_back( 138 1376 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"), idx))); 139 : } 140 175 : 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 350 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 146 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 147 350 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))) 148 350 : (TaskExclusion(scheduler->GetTaskId("bgp::SendUpdate"))) 149 175 : (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership"))); 150 175 : 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 350 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 156 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 157 350 : (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership"))) 158 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath"))) 159 350 : (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation"))) 160 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain"))) 161 350 : (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute"))) 162 350 : (TaskExclusion(scheduler->GetTaskId("db::Walker"))) 163 175 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))); 164 175 : 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 350 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))) 170 350 : (TaskExclusion(scheduler->GetTaskId("db::Walker"))) 171 350 : (TaskExclusion(scheduler->GetTaskId("bgp::StateMachine"))) 172 350 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 173 175 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))); 174 175 : 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 350 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))) 180 350 : (TaskExclusion(scheduler->GetTaskId("db::Walker"))) 181 350 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 182 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 183 350 : (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment"))) 184 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop"))) 185 350 : (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation"))) 186 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain"))) 187 175 : (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute"))); 188 175 : 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 350 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))) 194 350 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 195 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 196 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath"))) 197 175 : (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation"))); 198 175 : 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 350 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))) 204 350 : (TaskExclusion(scheduler->GetTaskId("db::Walker"))) 205 350 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 206 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 207 350 : (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment"))) 208 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverNexthop"))) 209 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath"))) 210 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain"))) 211 175 : (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute"))); 212 175 : 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 350 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 218 175 : (TaskExclusion(scheduler->GetTaskId("db::Walker"))); 219 175 : 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 350 : (TaskExclusion(scheduler->GetTaskId("bgp::Config"))) 231 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ConfigHelper"))) 232 350 : (TaskExclusion(scheduler->GetTaskId("bgp::PeerMembership"))) 233 350 : (TaskExclusion(scheduler->GetTaskId("bgp::RTFilter"))) 234 : // Following tasks updates db table partition 235 350 : (TaskExclusion(scheduler->GetTaskId("db::DBTable"))) 236 350 : (TaskExclusion(scheduler->GetTaskId("db::IFMapTable"))) 237 350 : (TaskExclusion(scheduler->GetTaskId("bgp::EvpnSegment"))) 238 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ResolverPath"))) 239 350 : (TaskExclusion(scheduler->GetTaskId("bgp::RouteAggregation"))) 240 350 : (TaskExclusion(scheduler->GetTaskId("bgp::ServiceChain"))) 241 175 : (TaskExclusion(scheduler->GetTaskId("bgp::StaticRoute"))); 242 175 : scheduler->SetPolicy(scheduler->GetTaskId("db::Walker"), walker_policy); 243 175 : } 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 : }