11package main
22
33import (
4+ "context"
45 "flag"
56 "fmt"
67 "math/rand"
78 "os"
9+ "os/signal"
810 "path/filepath"
911 "sync"
1012 "syscall"
1113 "time"
1214
1315 "github.com/BurntSushi/toml"
14- "github.com/judwhite/go-svc/svc "
16+ "github.com/judwhite/go-svc"
1517 "github.com/mreiferson/go-options"
1618 "github.com/nsqio/nsq/internal/lg"
1719 "github.com/nsqio/nsq/internal/version"
@@ -25,7 +27,8 @@ type program struct {
2527
2628func main () {
2729 prg := & program {}
28- if err := svc .Run (prg , syscall .SIGINT , syscall .SIGTERM ); err != nil {
30+ // SIGTERM handling is in Start()
31+ if err := svc .Run (prg , syscall .SIGINT ); err != nil {
2932 logFatal ("%s" , err )
3033 }
3134}
@@ -62,6 +65,7 @@ func (p *program) Start() error {
6265 cfg .Validate ()
6366
6467 options .Resolve (opts , flagSet , cfg )
68+
6569 nsqd , err := nsqd .New (opts )
6670 if err != nil {
6771 logFatal ("failed to instantiate nsqd - %s" , err )
@@ -77,6 +81,17 @@ func (p *program) Start() error {
7781 logFatal ("failed to persist metadata - %s" , err )
7882 }
7983
84+ signalChan := make (chan os.Signal , 1 )
85+ go func () {
86+ // range over all term signals
87+ // we don't want to un-register our sigterm handler which would
88+ // cause default go behavior to apply
89+ for range signalChan {
90+ p .nsqd .TermSignal ()
91+ }
92+ }()
93+ signal .Notify (signalChan , syscall .SIGTERM )
94+
8095 go func () {
8196 err := p .nsqd .Main ()
8297 if err != nil {
@@ -95,6 +110,11 @@ func (p *program) Stop() error {
95110 return nil
96111}
97112
113+ // Context returns a context that will be canceled when nsqd initiates the shutdown
114+ func (p * program ) Context () context.Context {
115+ return p .nsqd .Context ()
116+ }
117+
98118func logFatal (f string , args ... interface {}) {
99119 lg .LogFatal ("[nsqd] " , f , args ... )
100120}
0 commit comments