diff --git a/src/cmd/inquirer.go b/src/cmd/inquirer.go index 9515172bf..a99f40928 100644 --- a/src/cmd/inquirer.go +++ b/src/cmd/inquirer.go @@ -25,6 +25,14 @@ func (rl *RaterList) RegisterRater(clientAddress string, replay *byte) error { return nil } +func (rl *RaterList) UnRegisterRater(clientAddress string, replay *byte) error { + client := rl.clients[clientAddress] + client.Close() + delete(rl.clients, clientAddress) + log.Print(fmt.Sprintf("Server %v unregistered succesfully", clientAddress)) + return nil +} + func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "
    ") for addr, _ := range raterList.clients { diff --git a/src/cmd/rater.go b/src/cmd/rater.go index 98db19486..4fa43f736 100644 --- a/src/cmd/rater.go +++ b/src/cmd/rater.go @@ -6,6 +6,9 @@ import ( "math" "net" "net/rpc" + "os" + "os/signal" + "syscall" ) var ( @@ -20,6 +23,31 @@ func (t *Sumer) Square(n float64, reply *float64) error { return nil } +func stopSingnalHandler() { + sig := <-signal.Incoming + if usig, ok := sig.(os.UnixSignal); ok { + switch usig { + case syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT: + log.Printf("Caught signal %v, unregistering from server\n", usig) + unregisterFromServer() + os.Exit(1) + } + } +} + +func unregisterFromServer() { + client, err := rpc.DialHTTP("tcp", *server) + if err != nil { + log.Panic("Cannot register to server!") + } + var reply byte + log.Print("Unregistering from server ", *server) + client.Call("RaterList.UnRegisterRater", *listen, &reply) + if err := client.Close(); err != nil { + log.Panic("Could not close server unregistration!") + } +} + func registerToServer() { client, err := rpc.DialHTTP("tcp", *server) if err != nil { @@ -39,6 +67,7 @@ func main() { rpc.Register(arith) rpc.HandleHTTP() go registerToServer() + go stopSingnalHandler() addr, err1 := net.ResolveTCPAddr("tcp", *listen) l, err2 := net.ListenTCP("tcp", addr) if err1 != nil || err2 != nil {