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