ITS#6848 Add -w option to wait for DB startup before parent exits

This commit is contained in:
Howard Chu 2011-03-01 01:19:37 +00:00
parent d89b0d7604
commit 93da727d86
3 changed files with 55 additions and 8 deletions

View file

@ -48,7 +48,7 @@ lutil_b64_pton LDAP_P((
size_t)); size_t));
/* detach.c */ /* detach.c */
LDAP_LUTIL_F( void ) LDAP_LUTIL_F( int )
lutil_detach LDAP_P(( lutil_detach LDAP_P((
int debug, int debug,
int do_close)); int do_close));

View file

@ -49,10 +49,10 @@
#include "lutil.h" #include "lutil.h"
void int
lutil_detach( int debug, int do_close ) lutil_detach( int debug, int do_close )
{ {
int i, sd, nbits; int i, sd, nbits, pid;
#ifdef HAVE_SYSCONF #ifdef HAVE_SYSCONF
nbits = sysconf( _SC_OPEN_MAX ); nbits = sysconf( _SC_OPEN_MAX );
@ -71,10 +71,11 @@ lutil_detach( int debug, int do_close )
if ( debug == 0 ) { if ( debug == 0 ) {
for ( i = 0; i < 5; i++ ) { for ( i = 0; i < 5; i++ ) {
#ifdef HAVE_THR #ifdef HAVE_THR
switch ( fork1() ) pid = fork1();
#else #else
switch ( fork() ) pid = fork();
#endif #endif
switch ( pid )
{ {
case -1: case -1:
sleep( 5 ); sleep( 5 );
@ -84,7 +85,7 @@ lutil_detach( int debug, int do_close )
break; break;
default: default:
_exit( EXIT_SUCCESS ); return pid;
} }
break; break;
} }
@ -139,4 +140,5 @@ lutil_detach( int debug, int do_close )
#ifdef SIGPIPE #ifdef SIGPIPE
(void) SIGNAL( SIGPIPE, SIG_IGN ); (void) SIGNAL( SIGPIPE, SIG_IGN );
#endif #endif
return 0;
} }

View file

@ -346,6 +346,9 @@ usage( char *name )
#endif #endif
"\t-V\t\tprint version info (-VV exit afterwards, -VVV print\n" "\t-V\t\tprint version info (-VV exit afterwards, -VVV print\n"
"\t\t\tinfo about static overlays and backends)\n" "\t\t\tinfo about static overlays and backends)\n"
#ifndef HAVE_WINSOCK
"\t-w Wait for database startup before exiting\n"
#endif
); );
} }
@ -369,6 +372,9 @@ int main( int argc, char **argv )
int syslogUser = SLAP_DEFAULT_SYSLOG_USER; int syslogUser = SLAP_DEFAULT_SYSLOG_USER;
#endif #endif
#ifndef HAVE_WINSOCK
int pid, wait_for_start = 0, waitfds[2];
#endif
int g_argc = argc; int g_argc = argc;
char **g_argv = argv; char **g_argv = argv;
@ -472,6 +478,9 @@ int main( int argc, char **argv )
#endif #endif
#if defined(HAVE_SETUID) && defined(HAVE_SETGID) #if defined(HAVE_SETUID) && defined(HAVE_SETGID)
"u:g:" "u:g:"
#endif
#ifndef HAVE_WINSOCK
"w"
#endif #endif
)) != EOF ) { )) != EOF ) {
switch ( i ) { switch ( i ) {
@ -640,6 +649,12 @@ int main( int argc, char **argv )
version++; version++;
break; break;
#ifndef HAVE_WINSOCK
case 'w':
wait_for_start = 1;
break;
#endif
case 'T': case 'T':
if ( firstopt == 0 ) { if ( firstopt == 0 ) {
fprintf( stderr, "warning: \"-T %s\" " fprintf( stderr, "warning: \"-T %s\" "
@ -849,7 +864,7 @@ unhandled_option:;
if( rc != 0) { if( rc != 0) {
Debug( LDAP_DEBUG_ANY, Debug( LDAP_DEBUG_ANY,
"main: TLS init failed: %d\n", "main: TLS init failed: %d\n",
0, 0, 0 ); rc, 0, 0 );
rc = 1; rc = 1;
SERVICE_EXIT( ERROR_SERVICE_SPECIFIC_ERROR, 20 ); SERVICE_EXIT( ERROR_SERVICE_SPECIFIC_ERROR, 20 );
goto destroy; goto destroy;
@ -904,7 +919,30 @@ unhandled_option:;
#endif #endif
#ifndef HAVE_WINSOCK #ifndef HAVE_WINSOCK
lutil_detach( no_detach, 0 ); if ( wait_for_start ) {
if ( lutil_pair( waitfds ) < 0 ) {
Debug( LDAP_DEBUG_ANY,
"main: lutil_pair failed: %d\n",
0, 0, 0 );
rc = 1;
goto destroy;
}
}
pid = lutil_detach( no_detach, 0 );
if ( pid ) {
rc = EXIT_SUCCESS;
if ( wait_for_start ) {
char buf[4];
close( waitfds[1] );
if ( read( waitfds[0], buf, 1 ) != 1 )
rc = EXIT_FAILURE;
}
_exit( rc );
} else {
if ( wait_for_start ) {
close( waitfds[0] );
}
}
#endif /* HAVE_WINSOCK */ #endif /* HAVE_WINSOCK */
#ifdef CSRIMALLOC #ifdef CSRIMALLOC
@ -975,6 +1013,13 @@ unhandled_option:;
Debug( LDAP_DEBUG_ANY, "slapd starting\n", 0, 0, 0 ); Debug( LDAP_DEBUG_ANY, "slapd starting\n", 0, 0, 0 );
#ifndef HAVE_WINSOCK
if ( wait_for_start ) {
write( waitfds[1], "1", 1 );
close( waitfds[1] );
}
#endif
#ifdef HAVE_NT_EVENT_LOG #ifdef HAVE_NT_EVENT_LOG
if (is_NT_Service) if (is_NT_Service)
lutil_LogStartedEvent( serverName, slap_debug, configfile ? lutil_LogStartedEvent( serverName, slap_debug, configfile ?