Merge branch 'develop' into 1.2.1-binlog_router_trx

This commit is contained in:
MassimilianoPinto
2015-09-22 08:40:03 +02:00
4 changed files with 186 additions and 145 deletions

View File

@ -109,6 +109,10 @@ static bool flushall_done_flag;
static int default_log_augmentation = 0; static int default_log_augmentation = 0;
static int log_augmentation = default_log_augmentation; static int log_augmentation = default_log_augmentation;
/** This is used to detect if the initialization of the log manager has failed
* and that it isn't initialized again after a failure has occurred. */
static bool fatal_error = false;
/** Writer thread structure */ /** Writer thread structure */
struct filewriter_st { struct filewriter_st {
#if defined(SS_DEBUG) #if defined(SS_DEBUG)
@ -1681,7 +1685,7 @@ static bool logmanager_register(
* and its members which would probabaly lead to NULL pointer * and its members which would probabaly lead to NULL pointer
* reference. * reference.
*/ */
if (!writep) { if (!writep || fatal_error) {
succp = false; succp = false;
goto return_succp; goto return_succp;
} }
@ -1709,6 +1713,11 @@ static bool logmanager_register(
} }
return_succp: return_succp:
if(!succp)
{
fatal_error = true;
}
release_lock(&lmlock); release_lock(&lmlock);
return succp; return succp;
} }
@ -3232,10 +3241,16 @@ void flushall_logfiles(bool flush)
void skygw_log_sync_all(void) void skygw_log_sync_all(void)
{ {
if(!use_stdout)skygw_log_write(LOGFILE_TRACE,"Starting log flushing to disk."); if(!use_stdout)skygw_log_write(LOGFILE_TRACE,"Starting log flushing to disk.");
/** If initialization of the log manager has not been done, lm pointer can be
* NULL. */
if(lm)
{
flushall_logfiles(true); flushall_logfiles(true);
skygw_message_send(lm->lm_logmes); skygw_message_send(lm->lm_logmes);
skygw_message_wait(lm->lm_clientmes); skygw_message_wait(lm->lm_clientmes);
} }
}
/** /**
* Toggle high precision logging * Toggle high precision logging

View File

@ -1648,7 +1648,6 @@ int main(int argc, char **argv)
if (!resolve_maxscale_conf_fname(&cnf_file_path, pathbuf, cnf_file_arg)) if (!resolve_maxscale_conf_fname(&cnf_file_path, pathbuf, cnf_file_arg))
{ {
ss_dassert(cnf_file_path == NULL);
rc = MAXSCALE_BADCONFIG; rc = MAXSCALE_BADCONFIG;
goto return_main; goto return_main;
} }

View File

@ -1331,14 +1331,15 @@ return_1:
} }
/** /**
* set listener for mysql protocol, retur 1 on success and 0 in failure * Bind the DCB to a network port or a UNIX Domain Socket.
* @param listen_dcb Listener DCB
* @param config_bind Bind address in either IP:PORT format for network sockets or PATH for UNIX Domain Sockets
* @return 1 on success, 0 on error
*/ */
int gw_MySQLListener( int gw_MySQLListener(DCB *listen_dcb,
DCB *listen_dcb,
char *config_bind) char *config_bind)
{ {
int l_so; int l_so;
int syseno = 0;
struct sockaddr_in serv_addr; struct sockaddr_in serv_addr;
struct sockaddr_un local_addr; struct sockaddr_un local_addr;
struct sockaddr *current_addr; struct sockaddr *current_addr;
@ -1348,17 +1349,18 @@ int gw_MySQLListener(
memset(&serv_addr, 0, sizeof(serv_addr)); memset(&serv_addr, 0, sizeof(serv_addr));
memset(&local_addr, 0, sizeof(local_addr)); memset(&local_addr, 0, sizeof(local_addr));
if (strchr(config_bind, '/')) { if (strchr(config_bind, '/'))
{
char *tmp = strrchr(config_bind, ':'); char *tmp = strrchr(config_bind, ':');
if (tmp) if (tmp)
*tmp = '\0'; *tmp = '\0';
// UNIX socket create // UNIX socket create
if ((l_so = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { if ((l_so = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
{
char errbuf[STRERROR_BUFLEN]; char errbuf[STRERROR_BUFLEN];
fprintf(stderr, skygw_log_write(LE,
"\n* Error: can't create UNIX socket due " "Error: Can't create UNIX socket: %i, %s",
"error %i, %s.\n\n\t",
errno, errno,
strerror_r(errno, errbuf, sizeof(errbuf))); strerror_r(errno, errbuf, sizeof(errbuf)));
return 0; return 0;
@ -1369,18 +1371,24 @@ int gw_MySQLListener(
current_addr = (struct sockaddr *) &local_addr; current_addr = (struct sockaddr *) &local_addr;
} else { }
/* MaxScale, as default, will bind on port 4406 */ else
if (!parse_bindconfig(config_bind, 4406, &serv_addr)) { {
fprintf(stderr, "Error in parse_bindconfig for [%s]\n", config_bind); /* This is partially dead code, MaxScale will never start without explicit
* ports defined for all listeners. Thus the default port is never used.
*/
if (!parse_bindconfig(config_bind, 4406, &serv_addr))
{
skygw_log_write(LE, "Error in parse_bindconfig for [%s]", config_bind);
return 0; return 0;
} }
// TCP socket create
if ((l_so = socket(AF_INET, SOCK_STREAM, 0)) < 0) { /** Create the TCP socket */
if ((l_so = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
char errbuf[STRERROR_BUFLEN]; char errbuf[STRERROR_BUFLEN];
fprintf(stderr, skygw_log_write(LE,
"\n* Error: can't create socket due " "Error: Can't create socket: %i, %s",
"error %i, %s.\n\n\t",
errno, errno,
strerror_r(errno, errbuf, sizeof(errbuf))); strerror_r(errno, errbuf, sizeof(errbuf)));
return 0; return 0;
@ -1393,45 +1401,64 @@ int gw_MySQLListener(
listen_dcb->fd = -1; listen_dcb->fd = -1;
// socket options // socket options
if((syseno = setsockopt(l_so, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one))) != 0){ if (setsockopt(l_so, SOL_SOCKET, SO_REUSEADDR, (char *) &one, sizeof(one)) != 0)
{
char errbuf[STRERROR_BUFLEN]; char errbuf[STRERROR_BUFLEN];
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,"Error: Failed to set socket options. Error %d: %s", errno, strerror_r(errno, errbuf, sizeof(errbuf))))); LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,
"Error: Failed to set socket options. Error %d: %s",
errno,
strerror_r(errno, errbuf, sizeof(errbuf)))));
} }
if (is_tcp) if (is_tcp)
{ {
char errbuf[STRERROR_BUFLEN]; char errbuf[STRERROR_BUFLEN];
if((syseno = setsockopt(l_so, IPPROTO_TCP, TCP_NODELAY, (char *)&one, sizeof(one))) != 0){ if (setsockopt(l_so, IPPROTO_TCP, TCP_NODELAY, (char *) &one, sizeof(one)) != 0)
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,"Error: Failed to set socket options. Error %d: %s", errno, strerror_r(errno, errbuf, sizeof(errbuf))))); {
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,
"Error: Failed to set socket options. Error %d: %s",
errno,
strerror_r(errno, errbuf, sizeof(errbuf)))));
} }
} }
// set NONBLOCKING mode // set NONBLOCKING mode
setnonblocking(l_so); if (setnonblocking(l_so) != 0)
{
/* get the right socket family for bind */ skygw_log_write(LE, "Error: Failed to set socket to non-blocking mode.");
switch (current_addr->sa_family) { close(l_so);
case AF_UNIX: return 0;
rc = unlink(config_bind);
if ( (rc == -1) && (errno!=ENOENT) ) {
fprintf(stderr, "Error unlink Unix Socket %s\n", config_bind);
} }
if (bind(l_so, (struct sockaddr *) &local_addr, sizeof(local_addr)) < 0) { /* get the right socket family for bind */
switch (current_addr->sa_family)
{
case AF_UNIX:
rc = unlink(config_bind);
if ((rc == -1) && (errno != ENOENT))
{
char errbuf[STRERROR_BUFLEN]; char errbuf[STRERROR_BUFLEN];
fprintf(stderr, skygw_log_write(LE, "Error: Failed to unlink Unix Socket %s: %d %s",
"\n* Bind failed due error %i, %s.\n", config_bind, errno, strerror_r(errno, errbuf, sizeof(errbuf)));
}
if (bind(l_so, (struct sockaddr *) &local_addr, sizeof(local_addr)) < 0)
{
char errbuf[STRERROR_BUFLEN];
skygw_log_write(LE,
"Error: Failed to bind to UNIX Domain socket '%s': %i, %s",
config_bind,
errno, errno,
strerror_r(errno, errbuf, sizeof(errbuf))); strerror_r(errno, errbuf, sizeof(errbuf)));
fprintf(stderr, "* Can't bind to %s\n\n", config_bind);
close(l_so); close(l_so);
return 0; return 0;
} }
/* set permission for all users */ /* set permission for all users */
if (chmod(config_bind, 0777) < 0) { if (chmod(config_bind, 0777) < 0)
{
char errbuf[STRERROR_BUFLEN]; char errbuf[STRERROR_BUFLEN];
fprintf(stderr, skygw_log_write(LE,
"\n* chmod failed for %s due error %i, %s.\n\n", "Error: Failed to change permissions on UNIX Domain socket '%s': %i, %s",
config_bind, config_bind,
errno, errno,
strerror_r(errno, errbuf, sizeof(errbuf))); strerror_r(errno, errbuf, sizeof(errbuf)));
@ -1440,47 +1467,48 @@ int gw_MySQLListener(
break; break;
case AF_INET: case AF_INET:
if (bind(l_so, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { if (bind(l_so, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
{
char errbuf[STRERROR_BUFLEN]; char errbuf[STRERROR_BUFLEN];
fprintf(stderr, skygw_log_write(LE,
"\n* Bind failed due error %i, %s.\n", "Error: Failed to bind on '%s': %i, %s",
config_bind,
errno, errno,
strerror_r(errno, errbuf, sizeof(errbuf))); strerror_r(errno, errbuf, sizeof(errbuf)));
fprintf(stderr, "* Can't bind to %s\n\n", config_bind);
close(l_so); close(l_so);
return 0; return 0;
} }
break; break;
default: default:
fprintf(stderr, "* Socket Family %i not supported\n", current_addr->sa_family); skygw_log_write(LE, "Error: Socket Family %i not supported\n", current_addr->sa_family);
close(l_so); close(l_so);
return 0; return 0;
} }
rc = listen(l_so, 10 * SOMAXCONN); if (listen(l_so, 10 * SOMAXCONN) != 0)
{
if (rc == 0) {
LOGIF(LM, (skygw_log_write_flush(LOGFILE_MESSAGE,"Listening MySQL connections at %s", config_bind)));
} else {
int eno = errno;
errno = 0;
char errbuf[STRERROR_BUFLEN]; char errbuf[STRERROR_BUFLEN];
fprintf(stderr, skygw_log_write(LE,
"\n* Failed to start listening MySQL due error %d, %s\n\n", "Failed to start listening on '%s': %d, %s",
eno, config_bind,
strerror_r(eno, errbuf, sizeof(errbuf))); errno,
strerror_r(errno, errbuf, sizeof(errbuf)));
close(l_so); close(l_so);
return 0; return 0;
} }
LOGIF(LM, (skygw_log_write_flush(LOGFILE_MESSAGE, "Listening MySQL connections at %s", config_bind)));
// assign l_so to dcb // assign l_so to dcb
listen_dcb->fd = l_so; listen_dcb->fd = l_so;
// add listening socket to poll structure // add listening socket to poll structure
if (poll_add_dcb(listen_dcb) == -1) { if (poll_add_dcb(listen_dcb) != 0)
fprintf(stderr, {
"\n* MaxScale encountered system limit while " skygw_log_write(LE,
"attempting to register on an epoll instance.\n\n"); "MaxScale encountered system limit while "
"attempting to register on an epoll instance.");
return 0; return 0;
} }
#if defined(FAKE_CODE) #if defined(FAKE_CODE)

View File

@ -4243,7 +4243,6 @@ static bool execute_sescmd_in_backend(
} }
else else
{ {
while((buf = GWBUF_CONSUME_ALL(buf)) != NULL);
succp = false; succp = false;
} }
return_succp: return_succp: