LCOV - code coverage report
Current view: top level - control-node - control_node.cc (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 151 172 87.8 %
Date: 2026-11-09 02:10:49 Functions: 1 3 33.3 %
Legend: Lines: hit not hit

          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             : }

Generated by: LCOV version 1.14