From c2201cbc95cb7c16dd8dd3fa0f9366444c665411 Mon Sep 17 00:00:00 2001 From: Dimitri Roche Date: Mon, 11 Dec 2017 10:56:59 -0500 Subject: [PATCH 1/3] Clean up scheduler and rest of store on CTRL C --- services/store.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/services/store.go b/services/store.go index fbf1c13f75e..97d2d72dfda 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,7 @@ type Store struct { Scheduler *Scheduler Config Config KeyStore *KeyStore + sigs chan os.Signal } func NewStore(config Config) *Store { @@ -22,10 +28,18 @@ func NewStore(config Config) *Store { } 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() + os.Exit(0) + }() return self.Scheduler.Start() } func (self *Store) Close() { + logger.Info("Gracefully exiting...") self.Scheduler.Stop() self.ORM.Close() } From 6e050796a93a35f6a9e601ede24d442ebfacf586 Mon Sep 17 00:00:00 2001 From: Dimitri Roche Date: Mon, 11 Dec 2017 11:23:26 -0500 Subject: [PATCH 2/3] Change exit code on SIGINT to 1 --- services/store.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/store.go b/services/store.go index 97d2d72dfda..26381059cf0 100644 --- a/services/store.go +++ b/services/store.go @@ -33,7 +33,7 @@ func (self *Store) Start() error { go func() { <-self.sigs self.Close() - os.Exit(0) + os.Exit(1) }() return self.Scheduler.Start() } From 173fc45815d5c41e0a2df3211ae7860bf559c67d Mon Sep 17 00:00:00 2001 From: Dimitri Roche Date: Mon, 11 Dec 2017 11:50:42 -0800 Subject: [PATCH 3/3] add test for shutdown via signal handling Signed-off-by: Steve Ellis --- Gopkg.lock | 2 +- services/store.go | 4 +++- services/store_test.go | 28 ++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 services/store_test.go 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 26381059cf0..301fc276776 100644 --- a/services/store.go +++ b/services/store.go @@ -15,6 +15,7 @@ type Store struct { Config Config KeyStore *KeyStore sigs chan os.Signal + Exiter func(int) } func NewStore(config Config) *Store { @@ -24,6 +25,7 @@ func NewStore(config Config) *Store { Scheduler: NewScheduler(orm), Config: config, KeyStore: NewKeyStore(config.KeysDir()), + Exiter: os.Exit, } } @@ -33,7 +35,7 @@ func (self *Store) Start() error { go func() { <-self.sigs self.Close() - os.Exit(1) + self.Exiter(1) }() return self.Scheduler.Start() } 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()) +}