Added messages about missing usernames and passwords for servers.

This commit is contained in:
Markus Makela
2014-12-07 00:07:58 +02:00
parent 06578c95a5
commit a580799eb2

View File

@ -24,7 +24,7 @@
#include <router.h> #include <router.h>
#include <dbshard.h> #include <dbshard.h>
#include <secrets.h>
#include <mysql.h> #include <mysql.h>
#include <skygw_utils.h> #include <skygw_utils.h>
#include <log_manager.h> #include <log_manager.h>
@ -331,20 +331,23 @@ bool update_dbnames_hash(BACKEND** backends, HASHTABLE* hashtable)
const unsigned int read_timeout = 10; const unsigned int read_timeout = 10;
bool rval = true; bool rval = true;
SERVER* server; SERVER* server;
MYSQL* handle;
MYSQL_RES* result;
MYSQL_ROW row;
int i, rc, numfields; int i, rc, numfields;
for(i = 0;backends[i] && rval;i++){
handle = mysql_init(NULL);
for(i = 0;backends[i];i++){
MYSQL* handle = mysql_init(NULL);
MYSQL_RES* result = NULL;
MYSQL_ROW row;
char *user,*pwd = NULL;
if(handle == NULL){ if(handle == NULL){
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,"Error: Failed to initialize MySQL handle."))); LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,"Error: Failed to initialize MySQL handle.")));
continue; return false;
} }
rc = 0; rc = 0;
rc |= mysql_options(handle, MYSQL_OPT_CONNECT_TIMEOUT, (void *)&connect_timeout); rc |= mysql_options(handle, MYSQL_OPT_CONNECT_TIMEOUT, (void *)&connect_timeout);
rc |= mysql_options(handle, MYSQL_OPT_READ_TIMEOUT, (void *)&read_timeout); rc |= mysql_options(handle, MYSQL_OPT_READ_TIMEOUT, (void *)&read_timeout);
@ -356,12 +359,25 @@ bool update_dbnames_hash(BACKEND** backends, HASHTABLE* hashtable)
} }
server = backends[i]->backend_server; server = backends[i]->backend_server;
ss_dassert(server != NULL); ss_dassert(server != NULL);
if(server->monuser == NULL || server->monpw == NULL){
LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR,
"Error: No username or password defined for server '%s'.",server->unique_name)));
rval = false;
goto cleanup;
}
user = server->monuser;
pwd = decryptPassword(server->monpw);
if (mysql_real_connect(handle, if (mysql_real_connect(handle,
server->name, server->name,
server->monuser, user,
server->monpw, pwd,
NULL, NULL,
server->port, server->port,
NULL, NULL,
@ -369,7 +385,7 @@ bool update_dbnames_hash(BACKEND** backends, HASHTABLE* hashtable)
{ {
LOGIF(LE, (skygw_log_write_flush( LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"Error: Failed to connect to backend server '%s'.",server->name))); "Error: Failed to connect to backend server '%s': %ud %s",server->name,mysql_errno(handle),mysql_error(handle))));
rval = false; rval = false;
goto cleanup; goto cleanup;
} }
@ -380,7 +396,7 @@ bool update_dbnames_hash(BACKEND** backends, HASHTABLE* hashtable)
if((result = mysql_list_dbs(handle,NULL)) == NULL){ if((result = mysql_list_dbs(handle,NULL)) == NULL){
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR, LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,
"Error: Failed to execute query in backend server '%s'.",server->name))); "Error: Failed to retrieve databases from backend server '%s': %d %s",server->name,mysql_errno(handle),mysql_error(handle))));
goto cleanup; goto cleanup;
} }
@ -465,6 +481,7 @@ bool update_dbnames_hash(BACKEND** backends, HASHTABLE* hashtable)
} }
result = NULL; result = NULL;
mysql_close(handle); mysql_close(handle);
free(pwd);
} }
return rval; return rval;
@ -505,25 +522,39 @@ bool add_shard_info(GWBUF* buffer, char* target)
return (bool)gwbuf_add_hint(buffer,hint); return (bool)gwbuf_add_hint(buffer,hint);
} }
char* get_shard_target_name(ROUTER_INSTANCE* router, GWBUF* buffer){ char* get_shard_target_name(ROUTER_INSTANCE* router, ROUTER_CLIENT_SES* client, GWBUF* buffer){
MYSQL_session* sqlses = (MYSQL_session*)client->
rses_master_ref->bref_dcb->session->data;
HASHTABLE* ht = router->dbnames_hash; HASHTABLE* ht = router->dbnames_hash;
int sz = 0,i; int sz = 0,i,j;
char** dbnms = NULL; char** dbnms = NULL;
char* rval = NULL; char* rval = NULL;
bool has_dbs = false; /**If the query targets any database other than the current one*/
if(!query_is_parsed(buffer)){ if(!query_is_parsed(buffer)){
parse_query(buffer); parse_query(buffer);
} }
dbnms = skygw_get_database_names(buffer,&sz); dbnms = skygw_get_database_names(buffer,&sz);
if(sz > 0){
if(sz > 0){
has_dbs = true;
for(i = 0; i < sz; i++){ for(i = 0; i < sz; i++){
if((rval = (char*)hashtable_fetch(ht,dbnms[i]))){ if((rval = (char*)hashtable_fetch(ht,dbnms[i]))){
for(j = i;j < sz;j++) free(dbnms[j]);
break; break;
} }
free(dbnms[i]);
} }
free(dbnms);
} }
if(rval == NULL && !has_dbs){
rval = (char*)hashtable_fetch(ht,sqlses->db);
}
return rval; return rval;
} }
@ -2062,7 +2093,7 @@ static int routeQuery(
/** /**
* Added for simple sharding, using hints for testing. * Added for simple sharding, using hints for testing.
*/ */
if((tname = get_shard_target_name(inst,querybuf)) != NULL && if((tname = get_shard_target_name(inst,router_cli_ses,querybuf)) != NULL &&
add_shard_info(querybuf,tname)){ add_shard_info(querybuf,tname)){
route_target = TARGET_NAMED_SERVER; route_target = TARGET_NAMED_SERVER;