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 {