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 <bin.qian@windriver.com>
This commit is contained in:
parent
729a8e7f36
commit
1066d26e9e
|
@ -2,4 +2,4 @@ SRC_DIR=$PKG_BASE
|
||||||
COPY_LIST="$PKG_BASE/LICENSE"
|
COPY_LIST="$PKG_BASE/LICENSE"
|
||||||
TAR_NAME=sm
|
TAR_NAME=sm
|
||||||
VERSION=1.0.0
|
VERSION=1.0.0
|
||||||
TIS_PATCH_VER=28
|
TIS_PATCH_VER=29
|
||||||
|
|
|
@ -810,14 +810,37 @@ static SmErrorT sm_ensure_leader_scheduler()
|
||||||
{
|
{
|
||||||
char controller_domain[] = "controller";
|
char controller_domain[] = "controller";
|
||||||
char reason_text[SM_LOG_REASON_TEXT_MAX_CHAR] = "Loss of heartbeat";
|
char reason_text[SM_LOG_REASON_TEXT_MAX_CHAR] = "Loss of heartbeat";
|
||||||
|
SmServiceDomainT* domain;
|
||||||
|
|
||||||
SmErrorT error = sm_service_domain_fsm_set_state(
|
domain = sm_service_domain_table_read( controller_domain );
|
||||||
controller_domain,
|
if( NULL == domain )
|
||||||
SM_SERVICE_DOMAIN_STATE_LEADER,
|
|
||||||
reason_text );
|
|
||||||
if(SM_OKAY != error)
|
|
||||||
{
|
{
|
||||||
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;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,6 +58,7 @@ SmErrorT sm_service_domain_backup_state_event_handler( SmServiceDomainT* domain,
|
||||||
char* neighbor_name = NULL;
|
char* neighbor_name = NULL;
|
||||||
char leader[SM_NODE_NAME_MAX_CHAR];
|
char leader[SM_NODE_NAME_MAX_CHAR];
|
||||||
char hostname[SM_NODE_NAME_MAX_CHAR];
|
char hostname[SM_NODE_NAME_MAX_CHAR];
|
||||||
|
const char* new_leader;
|
||||||
int generation = 0;
|
int generation = 0;
|
||||||
char reason_text[SM_LOG_REASON_TEXT_MAX_CHAR] = "";
|
char reason_text[SM_LOG_REASON_TEXT_MAX_CHAR] = "";
|
||||||
SmServiceDomainStateT state = SM_SERVICE_DOMAIN_STATE_NIL;
|
SmServiceDomainStateT state = SM_SERVICE_DOMAIN_STATE_NIL;
|
||||||
|
@ -188,6 +189,34 @@ SmErrorT sm_service_domain_backup_state_event_handler( SmServiceDomainT* domain,
|
||||||
// Ignore.
|
// Ignore.
|
||||||
break;
|
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:
|
default:
|
||||||
DPRINTFD( "Service Domain (%s) ignoring event (%s).",
|
DPRINTFD( "Service Domain (%s) ignoring event (%s).",
|
||||||
domain->name,
|
domain->name,
|
||||||
|
|
|
@ -340,6 +340,13 @@ SmErrorT sm_service_domain_fsm_set_state( char service_domain_name[],
|
||||||
snprintf( _reason_text, sizeof(_reason_text), "%s", reason_text );
|
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 );
|
return( SM_OKAY );
|
||||||
|
|
||||||
STATE_CHANGE_ERROR:
|
STATE_CHANGE_ERROR:
|
||||||
|
|
|
@ -198,6 +198,10 @@ SmErrorT sm_service_domain_initial_state_event_handler(
|
||||||
// Ignore.
|
// Ignore.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SM_SERVICE_DOMAIN_EVENT_CHANGING_LEADER:
|
||||||
|
DPRINTFE("Received unexpected %s event", sm_service_domain_event_str(event));
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
DPRINTFD( "Service Domain (%s) ignoring event (%s).",
|
DPRINTFD( "Service Domain (%s) ignoring event (%s).",
|
||||||
domain->name, sm_service_domain_event_str( event ) );
|
domain->name, sm_service_domain_event_str( event ) );
|
||||||
|
|
|
@ -57,6 +57,7 @@ SmErrorT sm_service_domain_leader_state_event_handler( SmServiceDomainT* domain,
|
||||||
char* neighbor_name = NULL;
|
char* neighbor_name = NULL;
|
||||||
char* leader_name = NULL;
|
char* leader_name = NULL;
|
||||||
char hostname[SM_NODE_NAME_MAX_CHAR];
|
char hostname[SM_NODE_NAME_MAX_CHAR];
|
||||||
|
const char* new_leader;
|
||||||
int generation = 0;
|
int generation = 0;
|
||||||
int priority = 0;
|
int priority = 0;
|
||||||
SmServiceDomainStateT state = SM_SERVICE_DOMAIN_STATE_NIL;
|
SmServiceDomainStateT state = SM_SERVICE_DOMAIN_STATE_NIL;
|
||||||
|
@ -189,6 +190,34 @@ SmErrorT sm_service_domain_leader_state_event_handler( SmServiceDomainT* domain,
|
||||||
// Ignore.
|
// Ignore.
|
||||||
break;
|
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:
|
default:
|
||||||
DPRINTFD( "Service Domain (%s) ignoring event (%s).",
|
DPRINTFD( "Service Domain (%s) ignoring event (%s).",
|
||||||
domain->name, sm_service_domain_event_str( event ) );
|
domain->name, sm_service_domain_event_str( event ) );
|
||||||
|
|
|
@ -98,6 +98,10 @@ SmErrorT sm_service_domain_other_state_event_handler( SmServiceDomainT* domain,
|
||||||
// Ignore.
|
// Ignore.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SM_SERVICE_DOMAIN_EVENT_CHANGING_LEADER:
|
||||||
|
DPRINTFE("Received unexpected %s event", sm_service_domain_event_str(event));
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
DPRINTFD( "Service Domain (%s) ignoring event (%s).",
|
DPRINTFD( "Service Domain (%s) ignoring event (%s).",
|
||||||
domain->name, sm_service_domain_event_str( event ) );
|
domain->name, sm_service_domain_event_str( event ) );
|
||||||
|
|
|
@ -287,6 +287,10 @@ SmErrorT sm_service_domain_waiting_state_event_handler(
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SM_SERVICE_DOMAIN_EVENT_CHANGING_LEADER:
|
||||||
|
DPRINTFE("Received unexpected %s event", sm_service_domain_event_str(event));
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
DPRINTFD( "Service Domain (%s) ignoring event (%s).",
|
DPRINTFD( "Service Domain (%s) ignoring event (%s).",
|
||||||
domain->name, sm_service_domain_event_str( event ) );
|
domain->name, sm_service_domain_event_str( event ) );
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
SRC_DIR=$PKG_BASE
|
SRC_DIR=$PKG_BASE
|
||||||
TIS_PATCH_VER=19
|
TIS_PATCH_VER=20
|
||||||
|
|
|
@ -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_ENABLED, "interface-enabled" },
|
||||||
{ SM_SERVICE_DOMAIN_EVENT_INTERFACE_DISABLED, "interface-disabled" },
|
{ SM_SERVICE_DOMAIN_EVENT_INTERFACE_DISABLED, "interface-disabled" },
|
||||||
{ SM_SERVICE_DOMAIN_EVENT_WAIT_EXPIRED, "wait-expired" },
|
{ SM_SERVICE_DOMAIN_EVENT_WAIT_EXPIRED, "wait-expired" },
|
||||||
|
{ SM_SERVICE_DOMAIN_EVENT_CHANGING_LEADER, "change-leader" },
|
||||||
};
|
};
|
||||||
|
|
||||||
static SmValueStrMappingT
|
static SmValueStrMappingT
|
||||||
|
|
|
@ -267,6 +267,7 @@ typedef enum
|
||||||
SM_SERVICE_DOMAIN_EVENT_INTERFACE_ENABLED,
|
SM_SERVICE_DOMAIN_EVENT_INTERFACE_ENABLED,
|
||||||
SM_SERVICE_DOMAIN_EVENT_INTERFACE_DISABLED,
|
SM_SERVICE_DOMAIN_EVENT_INTERFACE_DISABLED,
|
||||||
SM_SERVICE_DOMAIN_EVENT_WAIT_EXPIRED,
|
SM_SERVICE_DOMAIN_EVENT_WAIT_EXPIRED,
|
||||||
|
SM_SERVICE_DOMAIN_EVENT_CHANGING_LEADER,
|
||||||
SM_SERVICE_DOMAIN_EVENT_MAX
|
SM_SERVICE_DOMAIN_EVENT_MAX
|
||||||
} SmServiceDomainEventT;
|
} SmServiceDomainEventT;
|
||||||
|
|
||||||
|
|
|
@ -2,4 +2,4 @@ SRC_DIR=`pwd`
|
||||||
COPY_LIST="$PKG_BASE/LICENSE"
|
COPY_LIST="$PKG_BASE/LICENSE"
|
||||||
TAR_NAME=sm-db
|
TAR_NAME=sm-db
|
||||||
VERSION=1.0.0
|
VERSION=1.0.0
|
||||||
TIS_PATCH_VER=27
|
TIS_PATCH_VER=28
|
||||||
|
|
Loading…
Reference in New Issue