Merge pull request #665 from nats-io/turnoff_signal_handler_in_some_tests

Ensure sig handler routine returns on shutdown, turn it off in most tests
This commit is contained in:
Ivan Kozlovic
2018-04-09 09:22:31 -06:00
committed by GitHub
10 changed files with 58 additions and 33 deletions

View File

@@ -698,6 +698,7 @@ func TestTLSCloseClientConnection(t *testing.T) {
}
opts.TLSTimeout = 100
opts.NoLog = true
opts.NoSigs = true
s := RunServer(opts)
defer s.Shutdown()

View File

@@ -1108,6 +1108,9 @@ func TestMonitorRoutezRace(t *testing.T) {
}()
for i := 0; i < 10; i++ {
time.Sleep(10 * time.Millisecond)
// Reset ports
srvBOpts.Port = -1
srvBOpts.Cluster.Port = -1
srvB := RunServer(srvBOpts)
time.Sleep(20 * time.Millisecond)
srvB.Shutdown()

View File

@@ -570,8 +570,8 @@ func (s *Server) diffOptions(newOpts *Options) ([]option, error) {
}
}
diffOpts = append(diffOpts, &clientAdvertiseOption{newValue: cliAdv})
case "nolog":
// Ignore NoLog option since it's not parsed and only used in
case "nolog", "nosigs":
// Ignore NoLog and NoSigs options since they are not parsed and only used in
// testing.
continue
case "port":

View File

@@ -32,7 +32,7 @@ import (
// Ensure Reload returns an error when attempting to reload a server that did
// not start with a config file.
func TestConfigReloadNoConfigFile(t *testing.T) {
server := New(&Options{})
server := New(&Options{NoSigs: true})
loaded := server.ConfigTime()
if server.Reload() == nil {
t.Fatal("Expected Reload to return an error")
@@ -69,6 +69,7 @@ func TestConfigReloadUnsupported(t *testing.T) {
Host: "localhost",
Port: -1,
},
NoSigs: true,
}
processOptions(golden)
@@ -158,6 +159,7 @@ func TestConfigReloadInvalidConfig(t *testing.T) {
Host: "localhost",
Port: -1,
},
NoSigs: true,
}
processOptions(golden)
@@ -224,6 +226,7 @@ func TestConfigReload(t *testing.T) {
Host: "localhost",
Port: server.ClusterAddr().Port,
},
NoSigs: true,
}
processOptions(golden)
@@ -1306,6 +1309,7 @@ func TestConfigReloadClusterRoutes(t *testing.T) {
t.Fatalf("Error processing config file: %v", err)
}
srvcOpts.NoLog = true
srvcOpts.NoSigs = true
srvc := RunServer(srvcOpts)
defer srvc.Shutdown()
@@ -1410,6 +1414,7 @@ func TestConfigReloadClusterAdvertise(t *testing.T) {
t.Fatalf("Error processing config file: %v", err)
}
opts.NoLog = true
opts.NoSigs = true
s := RunServer(opts)
defer s.Shutdown()
@@ -1491,6 +1496,7 @@ func TestConfigReloadClusterNoAdvertise(t *testing.T) {
t.Fatalf("Error processing config file: %v", err)
}
opts.NoLog = true
opts.NoSigs = true
s := RunServer(opts)
defer s.Shutdown()
@@ -1545,6 +1551,7 @@ func TestConfigReloadClientAdvertise(t *testing.T) {
stackFatalf(t, "Error processing config file: %v", err)
}
opts.NoLog = true
opts.NoSigs = true
s := RunServer(opts)
defer s.Shutdown()
@@ -1767,11 +1774,13 @@ func TestConfigReloadRotateFiles(t *testing.T) {
func runServerWithSymlinkConfig(t *testing.T, symlinkName, configName string) (*Server, *Options, string) {
opts, config := newOptionsWithSymlinkConfig(t, symlinkName, configName)
opts.NoLog = true
opts.NoSigs = true
return RunServer(opts), opts, config
}
func newServerWithSymlinkConfig(t *testing.T, symlinkName, configName string) (*Server, *Options, string) {
opts, config := newOptionsWithSymlinkConfig(t, symlinkName, configName)
opts.NoSigs = true
return New(opts), opts, config
}
@@ -1786,6 +1795,7 @@ func newOptionsWithSymlinkConfig(t *testing.T, symlinkName, configName string) (
if err != nil {
t.Fatalf("Error processing config file: %v", err)
}
opts.NoSigs = true
return opts, config
}

View File

@@ -812,7 +812,7 @@ func (s *Server) connectToRoute(rURL *url.URL, tryForEver bool) {
}
}
select {
case <-s.rcQuit:
case <-s.quitCh:
return
case <-time.After(DEFAULT_ROUTE_CONNECT):
continue

View File

@@ -542,6 +542,7 @@ func TestTLSChainedSolicitWorks(t *testing.T) {
func TestRouteTLSHandshakeError(t *testing.T) {
optsSeed, _ := ProcessConfigFile("./configs/seed_tls.conf")
optsSeed.NoLog = true
optsSeed.NoSigs = true
srvSeed := RunServer(optsSeed)
defer srvSeed.Shutdown()

View File

@@ -83,7 +83,7 @@ type Server struct {
routeListener net.Listener
routeInfo Info
routeInfoJSON []byte
rcQuit chan bool
quitCh chan struct{}
grMu sync.Mutex
grTmpClients map[uint64]*client
grRunning bool
@@ -173,9 +173,9 @@ func New(opts *Options) *Server {
s.routes = make(map[uint64]*client)
s.remotes = make(map[string]*client)
// Used to kick out all of the route
// connect Go routines.
s.rcQuit = make(chan bool)
// Used to kick out all go routines possibly waiting on server
// to shutdown.
s.quitCh = make(chan struct{})
// Used to setup Authorization.
s.configureAuthorization()
@@ -381,8 +381,8 @@ func (s *Server) Shutdown() {
s.profiler.Close()
}
// Release the solicited routes connect go routines.
close(s.rcQuit)
// Release go routines that wait on that channel
close(s.quitCh)
s.mu.Unlock()

View File

@@ -37,21 +37,28 @@ func (s *Server) handleSignals() {
signal.Notify(c, syscall.SIGINT, syscall.SIGUSR1, syscall.SIGHUP)
s.grWG.Add(1)
go func() {
for sig := range c {
s.Debugf("Trapped %q signal", sig)
switch sig {
case syscall.SIGINT:
s.Noticef("Server Exiting..")
os.Exit(0)
case syscall.SIGUSR1:
// File log re-open for rotating file logs.
s.ReOpenLogFile()
case syscall.SIGHUP:
// Config reload.
if err := s.Reload(); err != nil {
s.Errorf("Failed to reload server configuration: %s", err)
defer s.grWG.Done()
for {
select {
case sig := <-c:
s.Debugf("Trapped %q signal", sig)
switch sig {
case syscall.SIGINT:
s.Noticef("Server Exiting..")
os.Exit(0)
case syscall.SIGUSR1:
// File log re-open for rotating file logs.
s.ReOpenLogFile()
case syscall.SIGHUP:
// Config reload.
if err := s.Reload(); err != nil {
s.Errorf("Failed to reload server configuration: %s", err)
}
}
case <-s.quitCh:
return
}
}
}()

View File

@@ -83,18 +83,21 @@ func TestSignalToReloadConfig(t *testing.T) {
s := RunServer(opts)
defer s.Shutdown()
loaded := s.ConfigTime()
// Repeat test to make sure that server services signals more than once...
for i := 0; i < 2; i++ {
loaded := s.ConfigTime()
// Wait a bit to ensure ConfigTime changes.
time.Sleep(5 * time.Millisecond)
// Wait a bit to ensure ConfigTime changes.
time.Sleep(5 * time.Millisecond)
// This should cause config to be reloaded.
syscall.Kill(syscall.Getpid(), syscall.SIGHUP)
// Wait a bit for action to be performed
time.Sleep(500 * time.Millisecond)
// This should cause config to be reloaded.
syscall.Kill(syscall.Getpid(), syscall.SIGHUP)
// Wait a bit for action to be performed
time.Sleep(500 * time.Millisecond)
if reloaded := s.ConfigTime(); !reloaded.After(loaded) {
t.Fatalf("ConfigTime is incorrect.\nexpected greater than: %s\ngot: %s", loaded, reloaded)
if reloaded := s.ConfigTime(); !reloaded.After(loaded) {
t.Fatalf("ConfigTime is incorrect.\nexpected greater than: %s\ngot: %s", loaded, reloaded)
}
}
}

View File

@@ -22,7 +22,7 @@ import (
)
func TestResolveRandomPort(t *testing.T) {
opts := &server.Options{Host: "127.0.0.1", Port: server.RANDOM_PORT}
opts := &server.Options{Host: "127.0.0.1", Port: server.RANDOM_PORT, NoSigs: true}
s := RunServer(opts)
defer s.Shutdown()