From: Dave H. <hel...@us...> - 2012-12-30 01:19:26
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "SFCB - Small Footprint CIM Broker". The branch, master has been updated via 75145bf63e1e6a3eae4275c097466e8d5c3d7a11 (commit) from 228df4fef740c1ef180b5676831340d87028d61e (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 75145bf63e1e6a3eae4275c097466e8d5c3d7a11 Author: Dave Heller <hel...@us...> Date: Sat Dec 29 20:17:52 2012 -0500 [ 3597805 ] Restart HTTP daemon without restarting SFCB ----------------------------------------------------------------------- Summary of changes: diff --git a/NEWS b/NEWS index a30f2a4..289848f 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,7 @@ Changes in 1.4.4 Everything in 1.3.17 (see below), plus: New features: +- 3597805 Restart HTTP daemon without restarting SFCB Bugs fixed: diff --git a/httpAdapter.c b/httpAdapter.c index 9d338f6..9b0b447 100644 --- a/httpAdapter.c +++ b/httpAdapter.c @@ -1562,7 +1562,6 @@ handleHttpRequest(int connFd, int sslMode) conn_fd.ssl = NULL; } #endif - numRequest = 0; FD_ZERO(&httpfds); FD_SET(conn_fd.socket, &httpfds); @@ -1701,7 +1700,7 @@ prepSockAddr4(int port, void *ssin, socklen_t * sin_len) *sin_len = sizeof(*sin); memset(sin, 0, *sin_len); - + sin->sin_family = AF_INET; if (httpLocalOnly) { const char *loopback_int = "127.0.0.1"; @@ -1713,7 +1712,6 @@ prepSockAddr4(int port, void *ssin, socklen_t * sin_len) return (struct sockaddr *) sin; } - static int bindToPort(int sock, int port, void *ssin, socklen_t * sin_len) { @@ -1724,25 +1722,58 @@ bindToPort(int sock, int port, void *ssin, socklen_t * sin_len) if (getControlBool("httpLocalOnly", &httpLocalOnly)) httpLocalOnly = 0; + + char *l = ""; + char *r = ""; + char *ip; + + ip = httpLocalOnly ? "127.0.0.1" : "0.0.0.0"; #ifdef HAVE_IPV6 - if (!fallback_ipv4) - sin = prepSockAddr6(port, ssin, sin_len); + if (!fallback_ipv4) { + l = "["; + r = "]"; + ip = httpLocalOnly ? "::1" : "::"; + if (!(sin = prepSockAddr6(port, ssin, sin_len))) + return 1; + } else #endif - sin = prepSockAddr4(port, ssin, sin_len); + if (!(sin = prepSockAddr4(port, ssin, sin_len))) + return 1; - if (bind(sock, sin, *sin_len) || listen(sock, 10)) { - mlogf(M_ERROR, M_SHOW, "--- Cannot listen on port %ld (%s)\n", port, + int maxtries = 5; + int i = maxtries; + while (1) { + if (!bind(sock, sin, *sin_len)) { + if (!listen(sock, 10)) { + break; + } else { + mlogf(M_ERROR, M_SHOW, "--- Cannot listen on socket %s%s%s:%d (%s)\n", + l, ip, r, port, strerror(errno)); + return 1; + } + } else if (errno==EADDRINUSE) { + if (--i <= 0) { + mlogf(M_ERROR, M_SHOW, + "--- Cannot bind to socket %s%s%s:%d after %d attempts. (%s)\n", + l, ip, r, port, maxtries, strerror(errno)); + return 1; + } + mlogf(M_ERROR, M_SHOW, + "--- Socket %s%s%s:%d not ready (%s), retrying...\n", l, ip, r, port, strerror(errno)); - sleep(1); - return 1; + sleep(1); + } else { + mlogf(M_ERROR, M_SHOW, "--- Cannot bind to socket %s%s%s:%d (%s)\n", + l, ip, r, port, strerror(errno)); + return 1; + } } - + mlogf(M_ERROR, M_SHOW, "--- Listening on socket %s%s%s:%d\n", l, ip, r, port); return 0; } - - + #ifdef HAVE_UDS static int bindUDS(int fd, char *path, struct sockaddr_un *sun, socklen_t sun_len) @@ -2087,7 +2118,7 @@ httpDaemon(int argc, char *argv[], int sslMode) } #endif - int bindrc = 0; + int bindrc = 0; if (enableHttp) { bindrc = bindToPort(httpListenFd, httpPort, &httpSin, &httpSin_len); } @@ -2105,8 +2136,7 @@ httpDaemon(int argc, char *argv[], int sslMode) #endif if (bindrc > 0) - return 1; /* if can't bind to port, return 1 to - * shutdown sfcb */ + return 1; /* if can't bind to port, return 1 */ if (!debug) { int rc = fork(); @@ -2125,6 +2155,7 @@ httpDaemon(int argc, char *argv[], int sslMode) setSignal(SIGINT, SIG_IGN, 0); setSignal(SIGTERM, SIG_IGN, 0); setSignal(SIGHUP, SIG_IGN, 0); + setSignal(SIGUSR2, SIG_IGN, 0); setSignal(SIGPIPE, handleSigPipe,0); #if defined USE_SSL diff --git a/mlog.c b/mlog.c index a30ec24..fdebf78 100644 --- a/mlog.c +++ b/mlog.c @@ -107,6 +107,7 @@ startLogging(int level, int thread) setSignal(SIGINT, SIG_IGN, 0); setSignal(SIGTERM, SIG_IGN, 0); setSignal(SIGHUP, SIG_IGN, 0); + setSignal(SIGUSR2, SIG_IGN, 0); runLogger(logfds[0], level); diff --git a/msgqueue.c b/msgqueue.c index 3c5288d..1ea77d5 100644 --- a/msgqueue.c +++ b/msgqueue.c @@ -689,14 +689,14 @@ closeSocket(ComSockets * sp, ComCloseOpt o, char *by) if ((o == cRcv || o == cAll) && sp->receive != 0) { _SFCB_TRACE(1, - ("--- %s closing: %d - %d %d\n", by, sp->receive, + ("--- %s closing: %d - %d %d", by, sp->receive, getInode(sp->receive), currentProc)); close(sp->receive); sp->receive = 0; } if ((o == cSnd || o == cAll) && sp->send != 0) { _SFCB_TRACE(1, - ("--- %s closing: %d - %d %d\n", by, sp->send, + ("--- %s closing: %d - %d %d", by, sp->send, getInode(sp->send), currentProc)); close(sp->send); sp->send = 0; diff --git a/providerDrv.c b/providerDrv.c index d078fa8..edd68a5 100644 --- a/providerDrv.c +++ b/providerDrv.c @@ -942,6 +942,7 @@ getProcess(ProviderInfo * info, ProviderProcess ** proc) setSignal(SIGHUP, SIG_IGN, 0); setSignal(SIGPIPE, handleSigPipe,0); setSignal(SIGUSR1, handleSigUsr1, 0); + setSignal(SIGUSR2, SIG_IGN,0); setSignal(SIGSEGV, handleSigSegv, SA_ONESHOT); diff --git a/sfcBroker.c b/sfcBroker.c index a1229e0..eadb338 100644 --- a/sfcBroker.c +++ b/sfcBroker.c @@ -100,7 +100,11 @@ static char **restartArgv; static int restartArgc; static int adaptersStopped = 0, providersStopped = 0, - restartBroker = 0; + restartBroker = 0, + inaHttpdRestart=0; + +long sslMode=0; +static int startHttpd(int argc, char *argv[], int sslMode); extern char *configfile; @@ -226,6 +230,7 @@ stopBroker(void *p) * no adapters found */ adaptersStopped = 1; + fprintf(stderr, "--- All adapters stopped.\n"); } pthread_mutex_unlock(&sdMtx); } @@ -359,6 +364,7 @@ handleSigChld(int sig) if (left == 0) { fprintf(stderr, "--- Adapters stopped\n"); adaptersStopped = 1; + if (!stopping && !inaHttpdRestart) kill(getpid(),SIGQUIT); } pthread_attr_init(&tattr); pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED); @@ -378,6 +384,38 @@ handleSigChld(int sig) } static void +handleSigUsr2(int sig) +{ +#ifndef LOCAL_CONNECT_ONLY_ENABLE + struct timespec waitTime; + int rc, sa=0; + + inaHttpdRestart=1; + while(!adaptersStopped) { + pthread_mutex_lock(&sdMtx); + waitTime.tv_sec=time(NULL)+1; //5 + waitTime.tv_nsec=0; + if (sa==0) fprintf(stderr,"--- Stopping http adapters\n"); + sa++; + if (stopNextAdapter()) { + rc=pthread_cond_timedwait(&sdCnd,&sdMtx,&waitTime); + } + else { + /* no adapters found */ + fprintf(stderr,"--- All http adapters stopped.\n"); + adaptersStopped=1; + } + pthread_mutex_unlock(&sdMtx); + } + + fprintf(stderr,"--- Restarting http adapters...\n"); + startHttpd(restartArgc, restartArgv, sslMode); + adaptersStopped=0; + inaHttpdRestart=0; +#endif // LOCAL_CONNECT_ONLY_ENABLE +} + +static void handleSigSegv(int sig) { fprintf(stderr, "-#- %s - %d exiting due to a SIGSEGV signal\n", @@ -446,14 +484,15 @@ startHttpd(int argc, char *argv[], int sslMode) } if (httpDaemon(argc, argv, sslMode)) { - kill(sfcPid, 3); /* if port in use, shutdown */ + //kill(sfcPid, 3); /* if port in use, shutdown */ + /* (don't do this anymore - 3597805) */ } closeSocket(&sfcbSockets, cRcv, "startHttpd"); closeSocket(&resultSockets, cAll, "startHttpd"); + exit(0); } else { addStartedAdapter(pid); - return 0; } return 0; } @@ -575,7 +614,7 @@ main(int argc, char *argv[]) int c, i; long tmask = 0, - sslMode = 0, + //sslMode = 0, /* 3597805 */ sslOMode = 0, tracelevel = 0; char *tracefile = NULL; @@ -871,7 +910,6 @@ main(int argc, char *argv[]) setSignal(SIGQUIT, handleSigquit, 0); setSignal(SIGINT, handleSigquit, 0); - setSignal(SIGTERM, handleSigquit, 0); setSignal(SIGHUP, handleSigHup, 0); @@ -907,6 +945,7 @@ mlogf(M_INFO, M_SHOW, "--- Request handlers enabled:%s\n",rtmsg); setSignal(SIGSEGV, handleSigSegv, SA_ONESHOT); setSignal(SIGCHLD, handleSigChld, 0); + setSignal(SIGUSR2, handleSigUsr2, 0); processProviderMgrRequests(); hooks/post-receive -- SFCB - Small Footprint CIM Broker |