Merge pull request #5850 from Spantik/gr_fix

Zebra: Zebra gr dynamic client handling
This commit is contained in:
Quentin Young 2020-03-04 23:40:26 -05:00 committed by GitHub
commit ca8a844cc5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 36 additions and 24 deletions

View File

@ -1773,10 +1773,11 @@ static void zread_hello(ZAPI_HANDLER_ARGS)
client->proto = proto;
client->instance = instance;
/* Graceful restart processing for client connect */
zebra_gr_client_reconnect(client);
}
/* Graceful restart processing for client connect */
zebra_gr_client_reconnect(client);
zsend_capabilities(client, zvrf);
zebra_vrf_update_all(client);
stream_failure:

View File

@ -265,30 +265,31 @@ void zebra_gr_client_reconnect(struct zserv *client)
}
/* Copy the timers */
if (old_client) {
client->gr_instance_count = old_client->gr_instance_count;
client->restart_time = old_client->restart_time;
if (!old_client)
return;
LOG_GR("%s : old client %s, gr_instance_count %d", __func__,
zebra_route_string(old_client->proto),
old_client->gr_instance_count);
client->gr_instance_count = old_client->gr_instance_count;
client->restart_time = old_client->restart_time;
if (TAILQ_FIRST(&old_client->gr_info_queue)) {
TAILQ_CONCAT(&client->gr_info_queue,
&old_client->gr_info_queue, gr_info);
TAILQ_INIT(&old_client->gr_info_queue);
}
LOG_GR("%s : old client %s, gr_instance_count %d", __func__,
zebra_route_string(old_client->proto),
old_client->gr_instance_count);
TAILQ_FOREACH (info, &client->gr_info_queue, gr_info) {
info->stale_client_ptr = client;
info->stale_client = false;
}
/* Delete the stale client */
listnode_delete(zrouter.stale_client_list, old_client);
/* Delete old client */
XFREE(MTYPE_TMP, old_client);
if (TAILQ_FIRST(&old_client->gr_info_queue)) {
TAILQ_CONCAT(&client->gr_info_queue, &old_client->gr_info_queue,
gr_info);
TAILQ_INIT(&old_client->gr_info_queue);
}
TAILQ_FOREACH (info, &client->gr_info_queue, gr_info) {
info->stale_client_ptr = client;
info->stale_client = false;
}
/* Delete the stale client */
listnode_delete(zrouter.stale_client_list, old_client);
/* Delete old client */
XFREE(MTYPE_TMP, old_client);
}
/*
@ -425,6 +426,12 @@ void zread_client_capabilities(ZAPI_HANDLER_ARGS)
return;
}
/* GR only for dynamic clients */
if (client->proto <= ZEBRA_ROUTE_CONNECT) {
LOG_GR("%s: GR capabilities for client %s not supported",
__func__, zebra_route_string(client->proto));
return;
}
/* Call the capabilities handler */
zebra_client_capabilities_handler(client, &api);
}

View File

@ -568,7 +568,7 @@ static void zserv_client_free(struct zserv *client)
close(client->sock);
if (!client->gr_instance_count) {
if (DYNAMIC_CLIENT_GR_DISABLED(client)) {
nroutes = rib_score_proto(client->proto,
client->instance);
zlog_notice(
@ -610,7 +610,7 @@ static void zserv_client_free(struct zserv *client)
* If any instance are graceful restart enabled,
* client is not deleted
*/
if (!client->gr_instance_count) {
if (DYNAMIC_CLIENT_GR_DISABLED(client)) {
if (IS_ZEBRA_DEBUG_EVENT)
zlog_debug("%s: Deleting client %s", __func__,
zebra_route_string(client->proto));

View File

@ -229,6 +229,10 @@ struct zserv {
DECLARE_HOOK(zserv_client_connect, (struct zserv *client), (client));
DECLARE_KOOH(zserv_client_close, (struct zserv *client), (client));
#define DYNAMIC_CLIENT_GR_DISABLED(_client) \
((_client->proto <= ZEBRA_ROUTE_CONNECT) \
|| !(_client->gr_instance_count))
/*
* Initialize Zebra API server.
*