diff --git a/Gopkg.lock b/Gopkg.lock index 5ef22c7d607..18a92f2415e 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -230,6 +230,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "193f08308fd1bec9f477ce650d933ef164c7f421bd51b9671787bdde830ba659" + inputs-digest = "1d7f75127d66bc8242db409c18dccf2735544dca5feb692b624ec011195ab26f" solver-name = "gps-cdcl" solver-version = 1 diff --git a/services/store.go b/services/store.go index fbf1c13f75e..301fc276776 100644 --- a/services/store.go +++ b/services/store.go @@ -1,6 +1,11 @@ package services import ( + "os" + "os/signal" + "syscall" + + "github.com/smartcontractkit/chainlink-go/logger" "github.com/smartcontractkit/chainlink-go/models" ) @@ -9,6 +14,8 @@ type Store struct { Scheduler *Scheduler Config Config KeyStore *KeyStore + sigs chan os.Signal + Exiter func(int) } func NewStore(config Config) *Store { @@ -18,14 +25,23 @@ func NewStore(config Config) *Store { Scheduler: NewScheduler(orm), Config: config, KeyStore: NewKeyStore(config.KeysDir()), + Exiter: os.Exit, } } func (self *Store) Start() error { + self.sigs = make(chan os.Signal, 1) + signal.Notify(self.sigs, syscall.SIGINT, syscall.SIGTERM) + go func() { + <-self.sigs + self.Close() + self.Exiter(1) + }() return self.Scheduler.Start() } func (self *Store) Close() { + logger.Info("Gracefully exiting...") self.Scheduler.Stop() self.ORM.Close() } diff --git a/services/store_test.go b/services/store_test.go new file mode 100644 index 00000000000..7d13ca82d7a --- /dev/null +++ b/services/store_test.go @@ -0,0 +1,28 @@ +package services_test + +import ( + "syscall" + "testing" + + . "github.com/onsi/gomega" + "github.com/smartcontractkit/chainlink-go/internal/cltest" +) + +func TestGracefulShutdown(t *testing.T) { + t.Parallel() + RegisterTestingT(t) + store := cltest.Store() + defer store.Close() + + var completed bool + store.Exiter = func(code int) { + completed = true + } + + store.Start() + syscall.Kill(syscall.Getpid(), syscall.SIGTERM) + + Eventually(func() bool { + return completed + }).Should(BeTrue()) +}