Add sighup, sigusr2 into trapping code, to trap signals for reloading configuration.

Need to still figure out a way of graceful restarts - gave facebookgo/httpdown a shot,
but it is not suitable.
This commit is contained in:
Harshavardhana 2015-07-05 21:35:03 -07:00
parent a74a2db8f0
commit ba0a5ed416
3 changed files with 52 additions and 13 deletions

View File

@ -1,7 +1,10 @@
package main package main
import ( import (
"os"
"os/signal"
"os/user" "os/user"
"syscall"
"github.com/minio/cli" "github.com/minio/cli"
"github.com/minio/minio/pkg/controller" "github.com/minio/minio/pkg/controller"
@ -67,13 +70,33 @@ func getServerConfig(c *cli.Context) api.Config {
} }
} }
func trapServer(doneCh chan struct{}) {
// Go signal notification works by sending `os.Signal`
// values on a channel.
sigs := make(chan os.Signal, 1)
// `signal.Notify` registers the given channel to
// receive notifications of the specified signals.
signal.Notify(sigs, syscall.SIGHUP, syscall.SIGUSR2)
// This executes a blocking receive for signals.
// When it gets one it'll then notify the program
// that it can finish.
<-sigs
doneCh <- struct{}{}
}
func runServer(c *cli.Context) { func runServer(c *cli.Context) {
_, err := user.Current() _, err := user.Current()
if err != nil { if err != nil {
Fatalf("Unable to determine current user. Reason: %s\n", err) Fatalf("Unable to determine current user. Reason: %s\n", err)
} }
doneCh := make(chan struct{})
go trapServer(doneCh)
apiServerConfig := getServerConfig(c) apiServerConfig := getServerConfig(c)
if err := server.StartServices(apiServerConfig); err != nil { err = server.StartServices(apiServerConfig, doneCh)
if err != nil {
Fatalln(err) Fatalln(err)
} }
} }

View File

@ -23,6 +23,7 @@ type DonutService struct{}
// DonutArgs collections of disks and name to initialize donut // DonutArgs collections of disks and name to initialize donut
type DonutArgs struct { type DonutArgs struct {
MaxSize int64
Name string Name string
Disks []string Disks []string
} }

View File

@ -17,6 +17,7 @@
package server package server
import ( import (
"crypto/tls"
"fmt" "fmt"
"net" "net"
"net/http" "net/http"
@ -37,6 +38,20 @@ func startAPI(errCh chan error, conf api.Config, apiHandler http.Handler) {
MaxHeaderBytes: 1 << 20, MaxHeaderBytes: 1 << 20,
} }
if conf.TLS {
config := &tls.Config{}
if httpServer.TLSConfig != nil {
*config = *httpServer.TLSConfig
}
var err error
config.Certificates = make([]tls.Certificate, 1)
config.Certificates[0], err = tls.LoadX509KeyPair(conf.CertFile, conf.KeyFile)
if err != nil {
errCh <- iodine.New(err, nil)
}
}
host, port, err := net.SplitHostPort(conf.Address) host, port, err := net.SplitHostPort(conf.Address)
if err != nil { if err != nil {
errCh <- iodine.New(err, nil) errCh <- iodine.New(err, nil)
@ -62,18 +77,16 @@ func startAPI(errCh chan error, conf api.Config, apiHandler http.Handler) {
} }
} }
} }
switch {
default:
for _, host := range hosts { for _, host := range hosts {
if conf.TLS {
fmt.Printf("Starting minio server on: https://%s:%s\n", host, port)
} else {
fmt.Printf("Starting minio server on: http://%s:%s\n", host, port) fmt.Printf("Starting minio server on: http://%s:%s\n", host, port)
} }
}
errCh <- httpServer.ListenAndServe() errCh <- httpServer.ListenAndServe()
case conf.TLS == true:
for _, host := range hosts {
fmt.Printf("Starting minio server on: https://%s:%s\n", host, port)
}
errCh <- httpServer.ListenAndServeTLS(conf.CertFile, conf.KeyFile)
}
} }
// Start RPC listener // Start RPC listener
@ -99,7 +112,7 @@ func startTM(a api.Minio) {
} }
// StartServices starts basic services for a server // StartServices starts basic services for a server
func StartServices(conf api.Config) error { func StartServices(conf api.Config, doneCh chan struct{}) error {
apiErrCh := make(chan error) apiErrCh := make(chan error)
rpcErrCh := make(chan error) rpcErrCh := make(chan error)
@ -113,5 +126,7 @@ func StartServices(conf api.Config) error {
return iodine.New(err, nil) return iodine.New(err, nil)
case err := <-rpcErrCh: case err := <-rpcErrCh:
return iodine.New(err, nil) return iodine.New(err, nil)
case <-doneCh:
return nil
} }
} }