Commit b0648008 authored by unknown's avatar unknown
Browse files

bug#7690 - ndb startup with shm, use sigaction to escape SA_RESETHAND


configure.in:
  Check for sigaction used in SHM_Transporter
ndb/src/common/transporter/SHM_Transporter.cpp:
  remove unused variable
ndb/src/common/transporter/TransporterRegistry.cpp:
  1) remove unused variable
  2) Use sigaction instead of signal to install signal handler
     This as signal uses SA_RESETHAND
parent 51cae387
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -1924,7 +1924,7 @@ AC_CHECK_FUNCS(alarm bcmp bfill bmove bzero chsize cuserid fchmod fcntl \
  pthread_key_delete pthread_rwlock_rdlock pthread_setprio \
  pthread_setprio_np pthread_setschedparam pthread_sigmask readlink \
  realpath rename rint rwlock_init setupterm \
  shmget shmat shmdt shmctl \
  shmget shmat shmdt shmctl sigaction \
  sighold sigset sigthreadmask \
  snprintf socket stpcpy strcasecmp strerror strnlen strpbrk strstr strtol \
  strtoll strtoul strtoull tell tempnam thr_setconcurrency vidattr)
@@ -3097,7 +3097,8 @@ ndb_transporter_opt_objs=""
if test "$ac_cv_func_shmget" = "yes" &&
   test "$ac_cv_func_shmat" = "yes" &&
   test "$ac_cv_func_shmdt" = "yes" &&
   test "$ac_cv_func_shmctl" = "yes"
   test "$ac_cv_func_shmctl" = "yes" &&
   test "$ac_cv_func_sigaction" = "yes"
then
   AC_DEFINE([NDB_SHM_TRANSPORTER], [1],
             [Including Ndb Cluster DB shared memory transporter])
+0 −2
Original line number Diff line number Diff line
@@ -26,8 +26,6 @@
#include <InputStream.hpp>
#include <OutputStream.hpp>

extern int g_shm_pid;

SHM_Transporter::SHM_Transporter(TransporterRegistry &t_reg,
				 const char *lHostName,
				 const char *rHostName, 
+16 −3
Original line number Diff line number Diff line
@@ -50,8 +50,6 @@
#include <EventLogger.hpp>
extern EventLogger g_eventLogger;

int g_shm_pid = 0;

SocketServer::Session * TransporterService::newSession(NDB_SOCKET_TYPE sockfd)
{
  DBUG_ENTER("SocketServer::Session * TransporterService::newSession");
@@ -1322,7 +1320,22 @@ TransporterRegistry::startReceiving()

#ifdef NDB_SHM_TRANSPORTER
  m_shm_own_pid = getpid();
  signal(SIGUSR1, shm_sig_handler);
  struct sigaction sa;
  sa.sa_handler = shm_sig_handler;
  sigemptyset(&sa.sa_mask);
  sa.sa_flags = 0;
  int ret;
  while((ret = sigaction(SIGUSR1, &sa, 0)) == -1 && errno == EINTR);
  if(ret != 0)
  {
    g_eventLogger.error("Failed to install signal handler for SHM transporter"
			" errno: %d (%s)", errno, 
#ifdef HAVE_STRERROR
			strerror(errno));
#else
                        "");
#endif
  }
#endif
}