From 1066d26e9e150d4f93f404740b526d00d7255062 Mon Sep 17 00:00:00 2001 From: Bin Qian Date: Thu, 31 Jan 2019 08:23:05 -0500 Subject: [PATCH] Fixed host-swact failed Adding new domain event SM_SERVICE_DOMAIN_EVENT_CHANGING_LEADER to handle an on demand switching of service scheduler leader. Closes-Bug: 1812108 Change-Id: I6796d8efcb1ef0c7fa835ed34028c8e6a2b5dcae Signed-off-by: Bin Qian --- service-mgmt/sm-1.0.0/centos/build_srpm.data | 2 +- service-mgmt/sm-1.0.0/src/sm_failover.c | 35 +++++++++++++++---- .../src/sm_service_domain_backup_state.c | 29 +++++++++++++++ .../sm-1.0.0/src/sm_service_domain_fsm.c | 7 ++++ .../src/sm_service_domain_initial_state.c | 4 +++ .../src/sm_service_domain_leader_state.c | 29 +++++++++++++++ .../src/sm_service_domain_other_state.c | 4 +++ .../src/sm_service_domain_waiting_state.c | 4 +++ .../sm-common-1.0.0/centos/build_srpm.data | 2 +- service-mgmt/sm-common-1.0.0/src/sm_types.c | 1 + service-mgmt/sm-common-1.0.0/src/sm_types.h | 1 + .../sm-db-1.0.0/centos/build_srpm.data | 2 +- 12 files changed, 111 insertions(+), 9 deletions(-) diff --git a/service-mgmt/sm-1.0.0/centos/build_srpm.data b/service-mgmt/sm-1.0.0/centos/build_srpm.data index 918657b2..b91c16cd 100644 --- a/service-mgmt/sm-1.0.0/centos/build_srpm.data +++ b/service-mgmt/sm-1.0.0/centos/build_srpm.data @@ -2,4 +2,4 @@ SRC_DIR=$PKG_BASE COPY_LIST="$PKG_BASE/LICENSE" TAR_NAME=sm VERSION=1.0.0 -TIS_PATCH_VER=28 +TIS_PATCH_VER=29 diff --git a/service-mgmt/sm-1.0.0/src/sm_failover.c b/service-mgmt/sm-1.0.0/src/sm_failover.c index f9f0cf45..a88d9591 100644 --- a/service-mgmt/sm-1.0.0/src/sm_failover.c +++ b/service-mgmt/sm-1.0.0/src/sm_failover.c @@ -810,14 +810,37 @@ static SmErrorT sm_ensure_leader_scheduler() { char controller_domain[] = "controller"; char reason_text[SM_LOG_REASON_TEXT_MAX_CHAR] = "Loss of heartbeat"; + SmServiceDomainT* domain; - SmErrorT error = sm_service_domain_fsm_set_state( - controller_domain, - SM_SERVICE_DOMAIN_STATE_LEADER, - reason_text ); - if(SM_OKAY != error) + domain = sm_service_domain_table_read( controller_domain ); + if( NULL == domain ) { - DPRINTFE("Failed to ensure leader scheduler. Error %s", sm_error_str(error)); + DPRINTFE( "Failed to read service domain (%s), error=%s.", + controller_domain, sm_error_str(SM_NOT_FOUND) ); + return( SM_NOT_FOUND ); + } + + if(0 == strncmp(domain->leader, _host_name, sizeof(domain->leader))) + { + //Already leader. Nothing to do + return SM_OKAY; + } + + SmServiceDomainEventT event = SM_SERVICE_DOMAIN_EVENT_CHANGING_LEADER; + void* event_data[] = { + _host_name //new leader + }; + SmErrorT error = sm_service_domain_fsm_event_handler( + controller_domain, + event, + event_data, reason_text ); + + if( SM_OKAY != error ) + { + DPRINTFE( "Service domain (%s) failed to handle event (%s), error=%s.", + controller_domain, sm_service_domain_event_str(event), + sm_error_str( error ) ); + return( error ); } return error; } diff --git a/service-mgmt/sm-1.0.0/src/sm_service_domain_backup_state.c b/service-mgmt/sm-1.0.0/src/sm_service_domain_backup_state.c index e4471ae3..cf58066b 100644 --- a/service-mgmt/sm-1.0.0/src/sm_service_domain_backup_state.c +++ b/service-mgmt/sm-1.0.0/src/sm_service_domain_backup_state.c @@ -58,6 +58,7 @@ SmErrorT sm_service_domain_backup_state_event_handler( SmServiceDomainT* domain, char* neighbor_name = NULL; char leader[SM_NODE_NAME_MAX_CHAR]; char hostname[SM_NODE_NAME_MAX_CHAR]; + const char* new_leader; int generation = 0; char reason_text[SM_LOG_REASON_TEXT_MAX_CHAR] = ""; SmServiceDomainStateT state = SM_SERVICE_DOMAIN_STATE_NIL; @@ -188,6 +189,34 @@ SmErrorT sm_service_domain_backup_state_event_handler( SmServiceDomainT* domain, // Ignore. break; + case SM_SERVICE_DOMAIN_EVENT_CHANGING_LEADER: + new_leader = (const char*) event_data[0]; + error = sm_node_api_get_hostname(hostname); + if(SM_OKAY != error ) + { + DPRINTFE("Failed to get hostname. Error %s", sm_error_str(error)); + return SM_FAILED; + } + + if(0 != strncmp(hostname, new_leader, SM_NODE_NAME_MAX_CHAR)) + { + //Ignore + }else + { + strncpy(domain->leader, new_leader, SM_NODE_NAME_MAX_CHAR); + state = SM_SERVICE_DOMAIN_STATE_LEADER; + error = sm_service_domain_fsm_set_state( domain->name, state, + "leader change"); + if( SM_OKAY != error ) + { + DPRINTFE( "Set state (%s) of service domain (%s) failed, " + "error=%s.", sm_service_domain_state_str( state ), + domain->name, sm_error_str( error ) ); + return( error ); + } + } + break; + default: DPRINTFD( "Service Domain (%s) ignoring event (%s).", domain->name, diff --git a/service-mgmt/sm-1.0.0/src/sm_service_domain_fsm.c b/service-mgmt/sm-1.0.0/src/sm_service_domain_fsm.c index 8919892f..c2c57da2 100644 --- a/service-mgmt/sm-1.0.0/src/sm_service_domain_fsm.c +++ b/service-mgmt/sm-1.0.0/src/sm_service_domain_fsm.c @@ -340,6 +340,13 @@ SmErrorT sm_service_domain_fsm_set_state( char service_domain_name[], snprintf( _reason_text, sizeof(_reason_text), "%s", reason_text ); } + error = sm_service_domain_table_persist( domain ); + if( SM_OKAY != error ) + { + DPRINTFE( "Failed to persist service domain (%s), error=%s.", + domain->name, sm_error_str( error ) ); + } + return( SM_OKAY ); STATE_CHANGE_ERROR: diff --git a/service-mgmt/sm-1.0.0/src/sm_service_domain_initial_state.c b/service-mgmt/sm-1.0.0/src/sm_service_domain_initial_state.c index 051d5075..740f5560 100644 --- a/service-mgmt/sm-1.0.0/src/sm_service_domain_initial_state.c +++ b/service-mgmt/sm-1.0.0/src/sm_service_domain_initial_state.c @@ -198,6 +198,10 @@ SmErrorT sm_service_domain_initial_state_event_handler( // Ignore. break; + case SM_SERVICE_DOMAIN_EVENT_CHANGING_LEADER: + DPRINTFE("Received unexpected %s event", sm_service_domain_event_str(event)); + break; + default: DPRINTFD( "Service Domain (%s) ignoring event (%s).", domain->name, sm_service_domain_event_str( event ) ); diff --git a/service-mgmt/sm-1.0.0/src/sm_service_domain_leader_state.c b/service-mgmt/sm-1.0.0/src/sm_service_domain_leader_state.c index 99e439f9..7259bfd8 100644 --- a/service-mgmt/sm-1.0.0/src/sm_service_domain_leader_state.c +++ b/service-mgmt/sm-1.0.0/src/sm_service_domain_leader_state.c @@ -57,6 +57,7 @@ SmErrorT sm_service_domain_leader_state_event_handler( SmServiceDomainT* domain, char* neighbor_name = NULL; char* leader_name = NULL; char hostname[SM_NODE_NAME_MAX_CHAR]; + const char* new_leader; int generation = 0; int priority = 0; SmServiceDomainStateT state = SM_SERVICE_DOMAIN_STATE_NIL; @@ -189,6 +190,34 @@ SmErrorT sm_service_domain_leader_state_event_handler( SmServiceDomainT* domain, // Ignore. break; + case SM_SERVICE_DOMAIN_EVENT_CHANGING_LEADER: + new_leader = (const char*) event_data[0]; + error = sm_node_api_get_hostname(hostname); + if(SM_OKAY != error ) + { + DPRINTFE("Failed to get hostname. Error %s", sm_error_str(error)); + return SM_FAILED; + } + + if(0 == strncmp(hostname, new_leader, SM_NODE_NAME_MAX_CHAR)) + { + //Ignore + }else + { + strncpy(domain->leader, new_leader, SM_NODE_NAME_MAX_CHAR); + state = SM_SERVICE_DOMAIN_STATE_BACKUP; + error = sm_service_domain_fsm_set_state( domain->name, state, + "leader change"); + if( SM_OKAY != error ) + { + DPRINTFE( "Set state (%s) of service domain (%s) failed, " + "error=%s.", sm_service_domain_state_str( state ), + domain->name, sm_error_str( error ) ); + return( error ); + } + } + break; + default: DPRINTFD( "Service Domain (%s) ignoring event (%s).", domain->name, sm_service_domain_event_str( event ) ); diff --git a/service-mgmt/sm-1.0.0/src/sm_service_domain_other_state.c b/service-mgmt/sm-1.0.0/src/sm_service_domain_other_state.c index 5d5c2193..e7e9783e 100644 --- a/service-mgmt/sm-1.0.0/src/sm_service_domain_other_state.c +++ b/service-mgmt/sm-1.0.0/src/sm_service_domain_other_state.c @@ -98,6 +98,10 @@ SmErrorT sm_service_domain_other_state_event_handler( SmServiceDomainT* domain, // Ignore. break; + case SM_SERVICE_DOMAIN_EVENT_CHANGING_LEADER: + DPRINTFE("Received unexpected %s event", sm_service_domain_event_str(event)); + break; + default: DPRINTFD( "Service Domain (%s) ignoring event (%s).", domain->name, sm_service_domain_event_str( event ) ); diff --git a/service-mgmt/sm-1.0.0/src/sm_service_domain_waiting_state.c b/service-mgmt/sm-1.0.0/src/sm_service_domain_waiting_state.c index c2ccc59a..7c79fb90 100644 --- a/service-mgmt/sm-1.0.0/src/sm_service_domain_waiting_state.c +++ b/service-mgmt/sm-1.0.0/src/sm_service_domain_waiting_state.c @@ -287,6 +287,10 @@ SmErrorT sm_service_domain_waiting_state_event_handler( } break; + case SM_SERVICE_DOMAIN_EVENT_CHANGING_LEADER: + DPRINTFE("Received unexpected %s event", sm_service_domain_event_str(event)); + break; + default: DPRINTFD( "Service Domain (%s) ignoring event (%s).", domain->name, sm_service_domain_event_str( event ) ); diff --git a/service-mgmt/sm-common-1.0.0/centos/build_srpm.data b/service-mgmt/sm-common-1.0.0/centos/build_srpm.data index 857d6ad4..6a178772 100644 --- a/service-mgmt/sm-common-1.0.0/centos/build_srpm.data +++ b/service-mgmt/sm-common-1.0.0/centos/build_srpm.data @@ -1,2 +1,2 @@ SRC_DIR=$PKG_BASE -TIS_PATCH_VER=19 +TIS_PATCH_VER=20 diff --git a/service-mgmt/sm-common-1.0.0/src/sm_types.c b/service-mgmt/sm-common-1.0.0/src/sm_types.c index b3bfdc6a..e59a8cd0 100644 --- a/service-mgmt/sm-common-1.0.0/src/sm_types.c +++ b/service-mgmt/sm-common-1.0.0/src/sm_types.c @@ -151,6 +151,7 @@ _sm_service_domain_event_mappings[SM_SERVICE_DOMAIN_EVENT_MAX] = { SM_SERVICE_DOMAIN_EVENT_INTERFACE_ENABLED, "interface-enabled" }, { SM_SERVICE_DOMAIN_EVENT_INTERFACE_DISABLED, "interface-disabled" }, { SM_SERVICE_DOMAIN_EVENT_WAIT_EXPIRED, "wait-expired" }, + { SM_SERVICE_DOMAIN_EVENT_CHANGING_LEADER, "change-leader" }, }; static SmValueStrMappingT diff --git a/service-mgmt/sm-common-1.0.0/src/sm_types.h b/service-mgmt/sm-common-1.0.0/src/sm_types.h index 074a4fca..5af3d03e 100644 --- a/service-mgmt/sm-common-1.0.0/src/sm_types.h +++ b/service-mgmt/sm-common-1.0.0/src/sm_types.h @@ -267,6 +267,7 @@ typedef enum SM_SERVICE_DOMAIN_EVENT_INTERFACE_ENABLED, SM_SERVICE_DOMAIN_EVENT_INTERFACE_DISABLED, SM_SERVICE_DOMAIN_EVENT_WAIT_EXPIRED, + SM_SERVICE_DOMAIN_EVENT_CHANGING_LEADER, SM_SERVICE_DOMAIN_EVENT_MAX } SmServiceDomainEventT; diff --git a/service-mgmt/sm-db-1.0.0/centos/build_srpm.data b/service-mgmt/sm-db-1.0.0/centos/build_srpm.data index a0b16ae2..03342ca0 100644 --- a/service-mgmt/sm-db-1.0.0/centos/build_srpm.data +++ b/service-mgmt/sm-db-1.0.0/centos/build_srpm.data @@ -2,4 +2,4 @@ SRC_DIR=`pwd` COPY_LIST="$PKG_BASE/LICENSE" TAR_NAME=sm-db VERSION=1.0.0 -TIS_PATCH_VER=27 +TIS_PATCH_VER=28