aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--weed/command/volume.go2
-rw-r--r--weed/server/volume_server.go5
-rw-r--r--weed/storage/store.go6
-rw-r--r--weed/util/grace/signal_handling.go42
4 files changed, 42 insertions, 13 deletions
diff --git a/weed/command/volume.go b/weed/command/volume.go
index 24945d0e3..4c6bb20c2 100644
--- a/weed/command/volume.go
+++ b/weed/command/volume.go
@@ -265,6 +265,8 @@ func (v VolumeServerOptions) startVolumeServer(volumeFolders, maxVolumeCounts, v
// starting the cluster http server
clusterHttpServer := v.startClusterHttpService(volumeMux)
+ grace.OnReload(volumeServer.LoadNewVolumes)
+
stopChan := make(chan bool)
grace.OnInterrupt(func() {
fmt.Println("volume server has been killed")
diff --git a/weed/server/volume_server.go b/weed/server/volume_server.go
index 8e20b0846..8c6c63c56 100644
--- a/weed/server/volume_server.go
+++ b/weed/server/volume_server.go
@@ -137,6 +137,11 @@ func (vs *VolumeServer) SetStopping() {
vs.store.SetStopping()
}
+func (vs *VolumeServer) LoadNewVolumes() {
+ glog.V(0).Infoln(" Loading new volume ids ...")
+ vs.store.LoadNewVolumes()
+}
+
func (vs *VolumeServer) Shutdown() {
glog.V(0).Infoln("Shutting down volume server...")
vs.store.Close()
diff --git a/weed/storage/store.go b/weed/storage/store.go
index 76be2fa9c..8dea7496d 100644
--- a/weed/storage/store.go
+++ b/weed/storage/store.go
@@ -361,6 +361,12 @@ func (s *Store) SetStopping() {
}
}
+func (s *Store) LoadNewVolumes() {
+ for _, location := range s.Locations {
+ location.loadExistingVolumes(s.NeedleMapKind)
+ }
+}
+
func (s *Store) Close() {
for _, location := range s.Locations {
location.Close()
diff --git a/weed/util/grace/signal_handling.go b/weed/util/grace/signal_handling.go
index 8146668be..14b998796 100644
--- a/weed/util/grace/signal_handling.go
+++ b/weed/util/grace/signal_handling.go
@@ -11,39 +11,55 @@ import (
)
var signalChan chan os.Signal
-var hooks = make([]func(), 0)
-var hookLock sync.RWMutex
+var interruptHooks = make([]func(), 0)
+var interruptHookLock sync.RWMutex
+var reloadHooks = make([]func(), 0)
+var reloadHookLock sync.RWMutex
func init() {
signalChan = make(chan os.Signal, 1)
- signal.Ignore(syscall.SIGHUP)
signal.Notify(signalChan,
os.Interrupt,
os.Kill,
syscall.SIGALRM,
- // syscall.SIGHUP,
+ syscall.SIGHUP,
syscall.SIGINT,
syscall.SIGTERM,
// syscall.SIGQUIT,
)
go func() {
- for range signalChan {
- hookLock.RLock()
- for _, hook := range hooks {
- hook()
+ for s := range signalChan {
+ if s.String() == syscall.SIGHUP.String() {
+ reloadHookLock.RLock()
+ for _, hook := range reloadHooks {
+ hook()
+ }
+ reloadHookLock.RUnlock()
+ } else {
+ interruptHookLock.RLock()
+ for _, hook := range interruptHooks {
+ hook()
+ }
+ interruptHookLock.RUnlock()
+ os.Exit(0)
}
- hookLock.RUnlock()
- os.Exit(0)
}
}()
}
+func OnReload(fn func()) {
+ // prevent reentry
+ reloadHookLock.Lock()
+ defer reloadHookLock.Unlock()
+ reloadHooks = append(reloadHooks, fn)
+}
+
func OnInterrupt(fn func()) {
// prevent reentry
- hookLock.Lock()
- defer hookLock.Unlock()
+ interruptHookLock.Lock()
+ defer interruptHookLock.Unlock()
// deal with control+c,etc
// controlling terminal close, daemon not exit
- hooks = append(hooks, fn)
+ interruptHooks = append(interruptHooks, fn)
}