knet: Always use link0 for loopback

Even if it's not used for anything else.

Also, make cfgtool show the correct link ID when links are not
contiguous

Signed-off-by: Christine Caulfield <ccaulfie@redhat.com>
Reviewed-by: Jan Friesse <jfriesse@redhat.com>
This commit is contained in:
Christine Caulfield 2018-02-26 16:00:24 +00:00 committed by Jan Friesse
parent 111bfbc11d
commit 2c20590d16
8 changed files with 29 additions and 18 deletions

View File

@ -736,6 +736,8 @@ static void message_handler_req_lib_cfg_ringstatusget (
unsigned int iface_count;
char **status;
const char *totem_ip_string;
char ifname[CFG_INTERFACE_NAME_MAX_LEN];
unsigned int iface_ids[INTERFACE_MAX];
unsigned int i;
cs_error_t res = CS_OK;
@ -746,6 +748,7 @@ static void message_handler_req_lib_cfg_ringstatusget (
api->totem_ifaces_get (
api->totem_nodeid_get(),
iface_ids,
interfaces,
INTERFACE_MAX,
&status,
@ -763,11 +766,13 @@ static void message_handler_req_lib_cfg_ringstatusget (
totem_ip_string="";
}
if (strlen(totem_ip_string) >= CFG_INTERFACE_NAME_MAX_LEN) {
/* Allow for i/f number at the start */
if (strlen(totem_ip_string) >= CFG_INTERFACE_NAME_MAX_LEN-3) {
log_printf(LOGSYS_LEVEL_ERROR, "String representation of interface %u is too long", i);
res = CS_ERR_NAME_TOO_LONG;
goto send_response;
}
snprintf(ifname, sizeof(ifname), "%d %s", iface_ids[i], totem_ip_string);
if (strlen(status[i]) >= CFG_INTERFACE_STATUS_MAX_LEN) {
log_printf(LOGSYS_LEVEL_ERROR, "Status string for interface %u is too long", i);
@ -778,7 +783,7 @@ static void message_handler_req_lib_cfg_ringstatusget (
strcpy ((char *)&res_lib_cfg_ringstatusget.interface_status[i],
status[i]);
strcpy ((char *)&res_lib_cfg_ringstatusget.interface_name[i],
totem_ip_string);
ifname);
}
send_response:
@ -999,6 +1004,7 @@ static void message_handler_req_lib_cfg_get_node_addrs (void *conn,
const void *msg)
{
struct totem_ip_address node_ifs[INTERFACE_MAX];
unsigned int iface_ids[INTERFACE_MAX];
char buf[PIPE_BUF];
char **status;
unsigned int num_interfaces = 0;
@ -1014,7 +1020,7 @@ static void message_handler_req_lib_cfg_get_node_addrs (void *conn,
if (nodeid == 0)
nodeid = api->totem_nodeid_get();
if (api->totem_ifaces_get(nodeid, node_ifs, INTERFACE_MAX, &status, &num_interfaces)) {
if (api->totem_ifaces_get(nodeid, iface_ids, node_ifs, INTERFACE_MAX, &status, &num_interfaces)) {
ret = CS_ERR_EXIST;
num_interfaces = 0;
}

View File

@ -834,7 +834,7 @@ int totemknet_initialize (
instance->totemknet_target_set_completed = target_set_completed;
instance->loopback_link = -1;
instance->loopback_link = 0;
res = pipe(instance->logpipes);
if (res == -1) {
@ -1145,12 +1145,10 @@ int totemknet_member_add (
knet_node_id_t host_ids[KNET_MAX_HOST];
size_t num_host_ids;
/* Only create 1 loopback link.
* NOTE: THis depends on member_remove being run before member_add when reconfiguring
* otherwise we could be left with no loopback.
*/
if (member->nodeid == instance->our_nodeid && instance->loopback_link > -1) {
return 0;
/* Only create 1 loopback link and use link 0 */
if (member->nodeid == instance->our_nodeid && !instance->loopback_link) {
link_no = 0;
instance->loopback_link = 1;
}
knet_log_printf (LOGSYS_LEVEL_DEBUG, "knet: member_add: %d (%s), link=%d", member->nodeid, totemip_print(member), link_no);
@ -1195,7 +1193,6 @@ int totemknet_member_add (
if (member->nodeid == instance->our_nodeid) {
knet_log_printf (LOGSYS_LEVEL_DEBUG, "knet: loopback link is %d\n", link_no);
instance->loopback_link = link_no;
err = knet_link_set_config(instance->knet_handle, member->nodeid, link_no,
KNET_TRANSPORT_LOOPBACK,
&local_ss, &remote_ss, KNET_LINK_FLAG_TRAFFICHIPRIO);
@ -1255,9 +1252,9 @@ int totemknet_member_remove (
knet_log_printf (LOGSYS_LEVEL_DEBUG, "knet: member_remove: %d, link=%d", token_target->nodeid, link_no);
/* Removing link with the loopback on it */
if (token_target->nodeid == instance->our_nodeid && link_no == instance->loopback_link) {
instance->loopback_link= -1;
/* Don't remove the link with the loopback on it until we shut down */
if (token_target->nodeid == instance->our_nodeid) {
return 0;
}
/* Tidy stats */

View File

@ -1420,6 +1420,7 @@ int totempg_iface_set (
int totempg_ifaces_get (
unsigned int nodeid,
unsigned int *interface_id,
struct totem_ip_address *interfaces,
unsigned int interfaces_size,
char ***status,
@ -1430,6 +1431,7 @@ int totempg_ifaces_get (
res = totemsrp_ifaces_get (
totemsrp_context,
nodeid,
interface_id,
interfaces,
interfaces_size,
status,
@ -1466,17 +1468,18 @@ const char *totempg_ifaces_print (unsigned int nodeid)
char one_iface[ONE_IFACE_LEN+1];
struct totem_ip_address interfaces[INTERFACE_MAX];
unsigned int iface_count;
unsigned int iface_ids[INTERFACE_MAX];
unsigned int i;
int res;
iface_string[0] = '\0';
res = totempg_ifaces_get (nodeid, interfaces, INTERFACE_MAX, NULL, &iface_count);
res = totempg_ifaces_get (nodeid, iface_ids, interfaces, INTERFACE_MAX, NULL, &iface_count);
if (res == -1) {
return ("no interface found for nodeid");
}
res = totempg_ifaces_get (nodeid, interfaces, INTERFACE_MAX, NULL, &iface_count);
res = totempg_ifaces_get (nodeid, iface_ids, interfaces, INTERFACE_MAX, NULL, &iface_count);
for (i = 0; i < iface_count; i++) {
if (!interfaces[i].family) {

View File

@ -1033,6 +1033,7 @@ void totemsrp_finalize (
int totemsrp_ifaces_get (
void *srp_context,
unsigned int nodeid,
unsigned int *interface_id,
struct totem_ip_address *interfaces,
unsigned int interfaces_size,
char ***status,
@ -1052,6 +1053,7 @@ int totemsrp_ifaces_get (
if (instance->totem_config->interfaces[i].configured &&
instance->totem_config->interfaces[i].member_list[n].nodeid == nodeid) {
memcpy(iface_ptr, &instance->totem_config->interfaces[i].member_list[n], sizeof(struct totem_ip_address));
interface_id[num_ifs] = i;
iface_ptr++;
if (++num_ifs > interfaces_size) {
res = -2;

View File

@ -104,6 +104,7 @@ extern void totemsrp_net_mtu_adjust (struct totem_config *totem_config);
extern int totemsrp_ifaces_get (
void *srp_context,
unsigned int nodeid,
unsigned int *interface_id,
struct totem_ip_address *interfaces,
unsigned int interfaces_size,
char ***status,

View File

@ -281,6 +281,7 @@ struct corosync_api_v1 {
int (*totem_ifaces_get) (
unsigned int nodeid,
unsigned int *interface_ids,
struct totem_ip_address *interfaces,
unsigned int interfaces_size,
char ***status,

View File

@ -140,6 +140,7 @@ extern int totempg_groups_send_ok_groups (
extern int totempg_ifaces_get (
unsigned int nodeid,
unsigned int *interface_id,
struct totem_ip_address *interfaces,
unsigned int interfaces_size,
char ***status,

View File

@ -117,8 +117,8 @@ linkstatusget_do (char *interface_name, int brief)
strcasecmp (interface_name, interface_names[i]) == 0)) ||
!interface_name ) {
printf ("LINK ID %d\n", i);
printf ("\tid\t= %s\n", interface_names[i]);
printf ("LINK ID %c\n", interface_names[i][0]);
printf ("\taddr\t= %s\n", interface_names[i]+1);
if((!brief) && (strcmp(interface_status[i], "OK") != 0) &&
(!strstr(interface_status[i], "FAULTY"))) {
len = strlen(interface_status[i]);