Loading ndb/src/mgmsrv/ConfigInfo.cpp +105 −3 Original line number Diff line number Diff line Loading @@ -3481,6 +3481,7 @@ check_node_vs_replicas(Vector<ConfigInfo::ConfigRuleSection>§ions, { Uint32 db_nodes= 0; Uint32 replicas= 0; Uint32 db_host_count= 0; ctx.m_userProperties.get(DB_TOKEN, &db_nodes); ctx.m_userProperties.get("NoOfReplicas", &replicas); if((db_nodes % replicas) != 0){ Loading @@ -3488,7 +3489,108 @@ check_node_vs_replicas(Vector<ConfigInfo::ConfigRuleSection>§ions, "No of nodes must be dividable with no or replicas"); return false; } // check that node groups and arbitrators are ok // just issue warning if not if(replicas > 1){ Properties * props= ctx.m_config; Properties p_db_hosts(true); // store hosts which db nodes run on Properties p_arbitrators(true); // store hosts which arbitrators run on // arbitrator should not run together with db node on same host Uint32 i, n, group= 0, i_group= 0; Uint32 n_nodes; BaseString node_group_warning, arbitration_warning; const char *arbit_warn_fmt= "\n arbitrator with id %d and db node with id %d on same host %s"; ctx.m_userProperties.get("NoOfNodes", &n_nodes); for (i= 0, n= 0; n < n_nodes; i++){ const Properties * tmp; if(!props->get("Node", i, &tmp)) continue; n++; const char * type; if(!tmp->get("Type", &type)) continue; const char* host= 0; tmp->get("HostName", &host); if (strcmp(type,DB_TOKEN) == 0) { { Uint32 ii; if (!p_db_hosts.get(host,&ii)) db_host_count++; p_db_hosts.put(host,i); if (p_arbitrators.get(host,&ii)) { arbitration_warning.appfmt(arbit_warn_fmt, ii, i, host); p_arbitrators.remove(host); // only one warning per db node } } { unsigned j; BaseString str, str2; str.assfmt("#group%d_",group); p_db_hosts.put(str.c_str(),i_group,host); str2.assfmt("##group%d_",group); p_db_hosts.put(str2.c_str(),i_group,i); for (j= 0; j < i_group; j++) { const char *other_host; p_db_hosts.get(str.c_str(),j,&other_host); if (strcmp(host,other_host) == 0) { unsigned int other_i, c= 0; p_db_hosts.get(str2.c_str(),j,&other_i); p_db_hosts.get(str.c_str(),&c); if (c == 0) // first warning in this node group node_group_warning.appfmt(" Node group %d", group); c|= 1 << j; p_db_hosts.put(str.c_str(),c); node_group_warning.appfmt(",\n db node with id %d and id %d " "on same host %s", other_i, i, host); } } i_group++; DBUG_ASSERT(i_group <= replicas); if (i_group == replicas) { unsigned c= 0; p_db_hosts.get(str.c_str(),&c); if (c+1 == (1 << (replicas-1))) // all nodes on same machine node_group_warning.append(".\n Host failure will " "cause complete cluster shutdown."); else if (c > 0) node_group_warning.append(".\n Host failure may " "cause complete cluster shutdown."); group++; i_group= 0; } } } else if (strcmp(type,API_TOKEN) == 0 || strcmp(type,MGM_TOKEN) == 0) { Uint32 rank; if(tmp->get("ArbitrationRank", &rank) && rank > 0) { if(host && host[0] != 0) { Uint32 ii; p_arbitrators.put(host,i); if (p_db_hosts.get(host,&ii)) { arbitration_warning.appfmt(arbit_warn_fmt, i, ii, host); } } } } } if (db_host_count > 1 && node_group_warning.length() > 0) ndbout_c("Cluster configuration warning:\n%s",node_group_warning.c_str()); if (db_host_count > 1 && arbitration_warning.length() > 0) ndbout_c("Cluster configuration warning:%s",arbitration_warning.c_str()); } return true; } Loading Loading
ndb/src/mgmsrv/ConfigInfo.cpp +105 −3 Original line number Diff line number Diff line Loading @@ -3481,6 +3481,7 @@ check_node_vs_replicas(Vector<ConfigInfo::ConfigRuleSection>§ions, { Uint32 db_nodes= 0; Uint32 replicas= 0; Uint32 db_host_count= 0; ctx.m_userProperties.get(DB_TOKEN, &db_nodes); ctx.m_userProperties.get("NoOfReplicas", &replicas); if((db_nodes % replicas) != 0){ Loading @@ -3488,7 +3489,108 @@ check_node_vs_replicas(Vector<ConfigInfo::ConfigRuleSection>§ions, "No of nodes must be dividable with no or replicas"); return false; } // check that node groups and arbitrators are ok // just issue warning if not if(replicas > 1){ Properties * props= ctx.m_config; Properties p_db_hosts(true); // store hosts which db nodes run on Properties p_arbitrators(true); // store hosts which arbitrators run on // arbitrator should not run together with db node on same host Uint32 i, n, group= 0, i_group= 0; Uint32 n_nodes; BaseString node_group_warning, arbitration_warning; const char *arbit_warn_fmt= "\n arbitrator with id %d and db node with id %d on same host %s"; ctx.m_userProperties.get("NoOfNodes", &n_nodes); for (i= 0, n= 0; n < n_nodes; i++){ const Properties * tmp; if(!props->get("Node", i, &tmp)) continue; n++; const char * type; if(!tmp->get("Type", &type)) continue; const char* host= 0; tmp->get("HostName", &host); if (strcmp(type,DB_TOKEN) == 0) { { Uint32 ii; if (!p_db_hosts.get(host,&ii)) db_host_count++; p_db_hosts.put(host,i); if (p_arbitrators.get(host,&ii)) { arbitration_warning.appfmt(arbit_warn_fmt, ii, i, host); p_arbitrators.remove(host); // only one warning per db node } } { unsigned j; BaseString str, str2; str.assfmt("#group%d_",group); p_db_hosts.put(str.c_str(),i_group,host); str2.assfmt("##group%d_",group); p_db_hosts.put(str2.c_str(),i_group,i); for (j= 0; j < i_group; j++) { const char *other_host; p_db_hosts.get(str.c_str(),j,&other_host); if (strcmp(host,other_host) == 0) { unsigned int other_i, c= 0; p_db_hosts.get(str2.c_str(),j,&other_i); p_db_hosts.get(str.c_str(),&c); if (c == 0) // first warning in this node group node_group_warning.appfmt(" Node group %d", group); c|= 1 << j; p_db_hosts.put(str.c_str(),c); node_group_warning.appfmt(",\n db node with id %d and id %d " "on same host %s", other_i, i, host); } } i_group++; DBUG_ASSERT(i_group <= replicas); if (i_group == replicas) { unsigned c= 0; p_db_hosts.get(str.c_str(),&c); if (c+1 == (1 << (replicas-1))) // all nodes on same machine node_group_warning.append(".\n Host failure will " "cause complete cluster shutdown."); else if (c > 0) node_group_warning.append(".\n Host failure may " "cause complete cluster shutdown."); group++; i_group= 0; } } } else if (strcmp(type,API_TOKEN) == 0 || strcmp(type,MGM_TOKEN) == 0) { Uint32 rank; if(tmp->get("ArbitrationRank", &rank) && rank > 0) { if(host && host[0] != 0) { Uint32 ii; p_arbitrators.put(host,i); if (p_db_hosts.get(host,&ii)) { arbitration_warning.appfmt(arbit_warn_fmt, i, ii, host); } } } } } if (db_host_count > 1 && node_group_warning.length() > 0) ndbout_c("Cluster configuration warning:\n%s",node_group_warning.c_str()); if (db_host_count > 1 && arbitration_warning.length() > 0) ndbout_c("Cluster configuration warning:%s",arbitration_warning.c_str()); } return true; } Loading