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