|
From: Dave H. <hel...@us...> - 2013-01-09 00:02:19
|
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_1.3 has been updated
via 47b55037ce7513f90db8da85ca29eb26344e905c (commit)
from dd9304f041e14c7704c9c2961497c6c79192e325 (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 47b55037ce7513f90db8da85ca29eb26344e905c
Author: Dave Heller <hel...@us...>
Date: Tue Jan 8 18:55:18 2013 -0500
[ 3597805 ] Restart HTTP daemon without restarting SFCB
-----------------------------------------------------------------------
Summary of changes:
diff --git a/ChangeLog b/ChangeLog
index 7c59263..6e95fe2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2013-01-08 Dave Heller <hel...@us...>
+
+ * cimXmlRequest.c httpAdapter.c mlog.c msgqueue.c providerDrv.c
+ sfcBroker.c
+ [ 3597805 ] Restart HTTP daemon without restarting SFCB
+
2013-01-07 Dave Heller <hel...@us...>
* support.c
diff --git a/NEWS b/NEWS
index b7e9fc1..d75c182 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,7 @@
Changes in 1.3.17
=================
New features:
+- 3597805 Restart HTTP daemon without restarting SFCB
Bugs fixed:
- 3599329 dlopen failed for sfcbCustomLib
diff --git a/cimXmlRequest.c b/cimXmlRequest.c
index 6ea0100..57a9180 100644
--- a/cimXmlRequest.c
+++ b/cimXmlRequest.c
@@ -52,10 +52,12 @@
#define SFCB_ASM(x)
#endif
+#ifdef NEEDS_CLEANUP
#ifdef LOCAL_CONNECT_ONLY_ENABLE
// from httpAdapter.c
int chunkMode = CHUNK_NEVER;
#endif // LOCAL_CONNECT_ONLY_ENABLE
+#endif
typedef struct handler {
RespSegments(*handler) (CimXmlRequestContext *, RequestHdr * hdr);
diff --git a/httpAdapter.c b/httpAdapter.c
index d63cd8f..7b28435 100644
--- a/httpAdapter.c
+++ b/httpAdapter.c
@@ -1498,7 +1498,6 @@ getSocket()
return fd;
}
-
#ifdef USE_INET6
static struct sockaddr *
prepSockAddr6(int port, void *ssin, socklen_t * sin_len)
@@ -1527,7 +1526,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";
@@ -1539,7 +1538,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)
{
@@ -1551,20 +1549,48 @@ bindToPort(int sock, int port, void *ssin, socklen_t * sin_len)
if (getControlBool("httpLocalOnly", &httpLocalOnly))
httpLocalOnly = 0;
+ char *ip = httpLocalOnly ? "127.0.0.1" : "0.0.0.0";
+
#ifdef USE_INET6
- if (!fallback_ipv4)
- sin = prepSockAddr6(port, ssin, sin_len);
+ if (!fallback_ipv4) {
+ 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:%d (%s)\n",
+ ip, port, strerror(errno));
+ return 1;
+ }
+ } else if (errno==EADDRINUSE) {
+ if (--i <= 0) {
+ mlogf(M_ERROR, M_SHOW,
+ "--- Cannot bind to socket %s:%d after %d attempts. (%s)\n",
+ ip, port, maxtries, strerror(errno));
+ return 1;
+ }
+ mlogf(M_ERROR, M_SHOW,
+ "--- Socket %s:%d not ready (%s), retrying...\n", ip, port,
strerror(errno));
- sleep(1);
- return 1;
+ sleep(1);
+ } else {
+ mlogf(M_ERROR, M_SHOW, "--- Cannot bind to socket %s:%d (%s)\n",
+ ip, port, strerror(errno));
+ return 1;
+ }
}
-
+ mlogf(M_ERROR, M_SHOW, "--- Listening on socket %s:%d\n", ip, port);
return 0;
}
@@ -1908,7 +1934,7 @@ int httpDaemon(int argc, char *argv[], int sslMode, int sfcbPid)
}
#endif
- int bindrc = 0;
+ int bindrc = 0;
if (enableHttp) {
bindrc = bindToPort(httpListenFd, httpPort, &httpSin, &httpSin_len);
}
@@ -1926,8 +1952,7 @@ int httpDaemon(int argc, char *argv[], int sslMode, int sfcbPid)
#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();
@@ -1946,6 +1971,7 @@ int httpDaemon(int argc, char *argv[], int sslMode, int sfcbPid)
setSignal(SIGINT, SIG_IGN, 0);
setSignal(SIGTERM, SIG_IGN, 0);
setSignal(SIGHUP, SIG_IGN, 0);
+ setSignal(SIGUSR2, SIG_IGN, 0);
#if defined USE_SSL
if (sslMode) {
diff --git a/mlog.c b/mlog.c
index 8fb78b2..a44f865 100644
--- a/mlog.c
+++ b/mlog.c
@@ -109,6 +109,7 @@ void 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 825562d..003b44a 100644
--- a/msgqueue.c
+++ b/msgqueue.c
@@ -633,12 +633,12 @@ void closeSocket(ComSockets *sp, ComCloseOpt o,char *by)
_SFCB_ENTER(TRACE_MSGQUEUE | TRACE_SOCKETS, "closeSocket");
if ((o==cRcv || o==cAll) && sp->receive!=0) {
- _SFCB_TRACE(1,("--- %s closing: %d - %d %d\n",by,sp->receive,getInode(sp->receive),currentProc));
+ _SFCB_TRACE(1,("--- %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,getInode(sp->send),currentProc));
+ _SFCB_TRACE(1,("--- %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 a072454..4e6b5b6 100644
--- a/providerDrv.c
+++ b/providerDrv.c
@@ -809,6 +809,7 @@ static int 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 8e555d6..7bb5bb7 100644
--- a/sfcBroker.c
+++ b/sfcBroker.c
@@ -102,6 +102,10 @@ extern void dumpTiming(int pid);
static char **restartArgv;
static int restartArgc;
static int adaptersStopped=0,providersStopped=0,restartBroker=0;
+static int inaHttpdRestart=0;
+
+long sslMode=0;
+static int startHttpd(int argc, char *argv[], int sslMode);
int trimws=1;
@@ -217,9 +221,10 @@ static void stopBroker(void *p)
rc=pthread_cond_timedwait(&sdCnd,&sdMtx,&waitTime);
}
else {
- /* no adapters found */
- adaptersStopped=1;
- }
+ fprintf(stderr,"-- All adapters stopped.\n");
+ /* no adapters found */
+ adaptersStopped=1;
+ }
pthread_mutex_unlock(&sdMtx);
}
@@ -343,6 +348,7 @@ static void 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);
@@ -362,6 +368,37 @@ static void handleSigChld(int sig)
errno = oerrno;
}
+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
+}
+
#ifdef NEEDS_CLEANUP
static void handleSigterm(int sig)
{
@@ -423,32 +460,32 @@ static int startHttpd(int argc, char *argv[], int sslMode)
}
}
- pid= fork();
+ pid = fork();
if (pid < 0) {
- char *emsg=strerror(errno);
- mlogf(M_ERROR,M_SHOW, "-#- http fork: %s",emsg);
- exit(2);
+ char *emsg = strerror(errno);
+ mlogf(M_ERROR, M_SHOW, "-#- http fork: %s", emsg);
+ exit(2);
}
if (pid == 0) {
- currentProc=getpid();
- if (!httpSFCB) {
- // Set the real and effective uids
- rc=setreuid(httpuid,httpuid);
- if (rc == -1) {
- mlogf(M_ERROR,M_SHOW,"--- Changing uid for http failed.\n");
- exit(2);
- }
- }
-
- if (httpDaemon(argc, argv, sslMode)) {
- kill(sfcPid, 3); /* if port in use, shutdown */
- }
- closeSocket(&sfcbSockets,cRcv,"startHttpd");
- closeSocket(&resultSockets,cAll,"startHttpd");
+ currentProc = getpid();
+ if (!httpSFCB) {
+ // Set the real and effective uids
+ rc = setreuid(httpuid, httpuid);
+ if (rc == -1) {
+ mlogf(M_ERROR, M_SHOW, "--- Changing uid for http failed.\n");
+ exit(2);
+ }
+ }
+ if (httpDaemon(argc, argv, sslMode)) {
+ //kill(sfcPid, 3); /* if port in use, shutdown */
+ /* (don't do this anymore - xxxxxxx) */
+ }
+ closeSocket(&sfcbSockets,cRcv,"startHttpd");
+ closeSocket(&resultSockets,cAll,"startHttpd");
+ exit(0);
}
else {
- addStartedAdapter(pid);
- return 0;
+ addStartedAdapter(pid);
}
return 0;
}
@@ -564,7 +601,7 @@ static void version()
int main(int argc, char *argv[])
{
int c, i;
- long tmask = 0, sslMode=0,sslOMode=0, tracelevel=0;
+ long tmask = 0, sslOMode=0, tracelevel=0;
char * tracefile = NULL;
#ifdef HAVE_UDS
int enableUds=0;
@@ -603,7 +640,7 @@ int main(int argc, char *argv[])
{ "syslog-level", required_argument, 0, 'l' },
{ "trace-components", required_argument, 0, 't' },
{ "version", no_argument, 0, 'v' },
- { "disable-repository-default-inst-provider", no_argument, 0, 'i' },
+ { "disable-repository-default-inst-provider", no_argument, 0, 'i' },
{ 0, 0, 0, 0 }
};
@@ -651,9 +688,9 @@ int main(int argc, char *argv[])
case 'v':
version();
- case 'i':
- disableDefaultProvider=1;
- break;
+ case 'i':
+ disableDefaultProvider=1;
+ break;
case 'l':
if (strcmp(optarg,"LOG_ERR")==0) {
@@ -830,7 +867,7 @@ int main(int argc, char *argv[])
exit(1);
}
-
+
initSem(dSockets,sSockets,pSockets);
initProvProcCtl(pSockets);
init_sfcBroker();
@@ -838,7 +875,6 @@ int main(int argc, char *argv[])
setSignal(SIGQUIT, handleSigquit,0);
setSignal(SIGINT, handleSigquit,0);
-
setSignal(SIGTERM, handleSigquit,0);
setSignal(SIGHUP, handleSigHup,0);
@@ -865,6 +901,7 @@ int main(int argc, char *argv[])
setSignal(SIGSEGV, handleSigSegv,SA_ONESHOT);
setSignal(SIGCHLD, handleSigChld,0);
+ setSignal(SIGUSR2, handleSigUsr2,0);
processProviderMgrRequests();
hooks/post-receive
--
SFCB - Small Footprint CIM Broker
|