From c81032a5727892f0107089c5a9d735f147770e10 Mon Sep 17 00:00:00 2001 From: Bin Qian Date: Wed, 22 Mar 2023 20:54:35 +0000 Subject: [PATCH] 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 Change-Id: Ie9717d3b2b73dc7d623e1b980b3387c6c4e6d991 --- service-mgmt/sm/src/sm_service_dependency.c | 67 +++++++++++++++++++-- 1 file changed, 62 insertions(+), 5 deletions(-) diff --git a/service-mgmt/sm/src/sm_service_dependency.c b/service-mgmt/sm/src/sm_service_dependency.c index 7c33a977..9aa23e70 100644 --- a/service-mgmt/sm/src/sm_service_dependency.c +++ b/service-mgmt/sm/src/sm_service_dependency.c @@ -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 )