aboutsummaryrefslogtreecommitdiff
path: root/weed/util/grace
diff options
context:
space:
mode:
authorwuyuxiang <wuyuxiang@corp.netease.com>2020-04-28 14:10:23 +0800
committerwuyuxiang <wuyuxiang@corp.netease.com>2020-04-28 14:10:23 +0800
commit6850d28d6b99155dca2da8fa8bbf76124f528fa4 (patch)
tree2a6eb0dd50a530dfb72496a69715438c9aa15a44 /weed/util/grace
parent2a7957b4ca83fdb5232d761074e81dce6b99648f (diff)
downloadseaweedfs-6850d28d6b99155dca2da8fa8bbf76124f528fa4.tar.xz
seaweedfs-6850d28d6b99155dca2da8fa8bbf76124f528fa4.zip
refacotr: move signal handling and pprof to grace package
Diffstat (limited to 'weed/util/grace')
-rw-r--r--weed/util/grace/pprof.go34
-rw-r--r--weed/util/grace/signal_handling.go46
-rw-r--r--weed/util/grace/signal_handling_notsupported.go6
3 files changed, 86 insertions, 0 deletions
diff --git a/weed/util/grace/pprof.go b/weed/util/grace/pprof.go
new file mode 100644
index 000000000..14686bfc8
--- /dev/null
+++ b/weed/util/grace/pprof.go
@@ -0,0 +1,34 @@
+package grace
+
+import (
+ "os"
+ "runtime"
+ "runtime/pprof"
+
+ "github.com/chrislusf/seaweedfs/weed/glog"
+)
+
+func SetupProfiling(cpuProfile, memProfile string) {
+ if cpuProfile != "" {
+ f, err := os.Create(cpuProfile)
+ if err != nil {
+ glog.Fatal(err)
+ }
+ pprof.StartCPUProfile(f)
+ OnInterrupt(func() {
+ pprof.StopCPUProfile()
+ })
+ }
+ if memProfile != "" {
+ runtime.MemProfileRate = 1
+ f, err := os.Create(memProfile)
+ if err != nil {
+ glog.Fatal(err)
+ }
+ OnInterrupt(func() {
+ pprof.WriteHeapProfile(f)
+ f.Close()
+ })
+ }
+
+}
diff --git a/weed/util/grace/signal_handling.go b/weed/util/grace/signal_handling.go
new file mode 100644
index 000000000..7cca46764
--- /dev/null
+++ b/weed/util/grace/signal_handling.go
@@ -0,0 +1,46 @@
+// +build !plan9
+
+package grace
+
+import (
+ "os"
+ "os/signal"
+ "sync"
+ "syscall"
+)
+
+var signalChan chan os.Signal
+var hooks = make([]func(), 0)
+var hookLock sync.Mutex
+
+func init() {
+ signalChan = make(chan os.Signal, 1)
+ signal.Ignore(syscall.SIGHUP)
+ signal.Notify(signalChan,
+ os.Interrupt,
+ os.Kill,
+ syscall.SIGALRM,
+ // syscall.SIGHUP,
+ syscall.SIGINT,
+ syscall.SIGTERM,
+ // syscall.SIGQUIT,
+ )
+ go func() {
+ for _ = range signalChan {
+ for _, hook := range hooks {
+ hook()
+ }
+ os.Exit(0)
+ }
+ }()
+}
+
+func OnInterrupt(fn func()) {
+ // prevent reentry
+ hookLock.Lock()
+ defer hookLock.Unlock()
+
+ // deal with control+c,etc
+ // controlling terminal close, daemon not exit
+ hooks = append(hooks, fn)
+}
diff --git a/weed/util/grace/signal_handling_notsupported.go b/weed/util/grace/signal_handling_notsupported.go
new file mode 100644
index 000000000..5335915a1
--- /dev/null
+++ b/weed/util/grace/signal_handling_notsupported.go
@@ -0,0 +1,6 @@
+// +build plan9
+
+package grace
+
+func OnInterrupt(fn func()) {
+}