Update rule of disable & standby dependency

This change is to update the service disabling and going standby
dependency check.
The 2 specific rules are
1. "service a" has a disable action dependency to "service b", with
   targeted "service b" state of disabled, disable action of
   "service a" is considered as "dependency met" only when "service b"
    is in disabled stated, or enabled-standby state.
2. "service a" has a go-standby action dependency "to service b", with
   targeted "service b" state of disabled, go-standby action of
   "service a" is considered as "dependency met" only when "service b"
   is in disabled stated, or enabled-standby state.

TCs:
   passed: Perform repeatedly host-swact operations, with adding long
           delay in xxx-fs ocf-script in disable action, observed that
           all xxx-fs services are disabled before drbd-xxx services
           start disabling.

Closes-Bug: 2012570

Signed-off-by: Bin Qian <bin.qian@windriver.com>
Change-Id: Ie9717d3b2b73dc7d623e1b980b3387c6c4e6d991
This commit is contained in:
Bin Qian 2023-03-22 20:54:35 +00:00
parent b65eb7b2f6
commit c81032a572
1 changed files with 62 additions and 5 deletions

View File

@ -93,7 +93,61 @@ static void sm_service_dependency_dependent_state_compare(
// ****************************************************************************
// ****************************************************************************
// Service Dependency - Go-Active Met
// Service Dependency - Dependent State in
// user_data = {service, => pointer to service object
// &dependency_met, => pointer to dependency met boolean variable
// &at_least_one, => pointer to boolean variable indicates
// if at least one dependency found
// qualified_states => an array of states that are qualified for
// depenedncy met condition of a dependency.
// array ends with SM_SERVICE_STATE_MAX
// };
// service_dependency => a service dependency record
// ============================================
static void sm_service_dependency_dependent_state_in(
void* user_data[], SmServiceDependencyT* service_dependency )
{
SmServiceT* service = (SmServiceT*) user_data[0];
bool* met = (bool*) user_data[1];
bool* at_least_one = (bool*) user_data[2];
SmServiceStateT* qualified_states = (SmServiceStateT*) user_data[3];
SmServiceT* dependent_service;
bool matched = false;
if( '\0' == service_dependency->dependent[0] )
{
DPRINTFI( "Service (%s) has no dependencies.", service->name );
return;
}
dependent_service = sm_service_table_read( service_dependency->dependent );
if( NULL == dependent_service )
{
DPRINTFE( "Failed to read service (%s), error=%s.",
service_dependency->service_name,
sm_error_str(SM_NOT_FOUND) );
return;
}
*at_least_one = true;
for(SmServiceStateT* qs = qualified_states; *qs != SM_SERVICE_STATE_MAX; qs ++)
{
if(*qs == service_dependency->state)
{
matched = true;
break;
}
}
if (!matched)
{
*met = false;
}
}
// ****************************************************************************
// ****************************************************************************
// Service Dependency - Go-Active Met
// ==================================
SmErrorT sm_service_dependency_go_active_met( SmServiceT* service, bool* met )
{
@ -220,6 +274,7 @@ static void _sm_service_disable_dependency_met(
}
if( SM_SERVICE_STATE_DISABLED != dependent_service->state &&
SM_SERVICE_STATE_ENABLED_STANDBY != dependent_service->state &&
SM_SERVICE_STATE_ENABLED_ACTIVE != dependent_service->desired_state)
{
*dependency_met = false;
@ -283,15 +338,17 @@ SmErrorT sm_service_dependency_enabled_standby_state_met( SmServiceT* service,
{
bool at_least_one = false;
bool dependency_met = true;
SmCompareOperatorT compare_operator = SM_COMPARE_OPERATOR_LE;
void* user_data[] = {service, &dependency_met, &compare_operator,
&at_least_one};
SmServiceStateT qualified_states[] = {SM_SERVICE_STATE_ENABLED_STANDBY,
SM_SERVICE_STATE_DISABLED,
SM_SERVICE_STATE_MAX};
void* user_data[] = {service, &dependency_met, &at_least_one, qualified_states};
*met = false;
sm_service_dependency_table_foreach( SM_SERVICE_DEPENDENCY_TYPE_STATE,
service->name, SM_SERVICE_STATE_ENABLED_STANDBY, SM_SERVICE_ACTION_NA,
user_data, sm_service_dependency_dependent_state_compare );
user_data, sm_service_dependency_dependent_state_in );
if( at_least_one )