diff --git a/src/cmd/inquirer.go b/src/cmd/inquirer.go index a99f40928..00a01d0ad 100644 --- a/src/cmd/inquirer.go +++ b/src/cmd/inquirer.go @@ -6,52 +6,30 @@ import ( "net/http" "net/rpc" "time" + "registration" ) -type RaterList struct { - clients map[string]*rpc.Client -} - -var raterList *RaterList - -func (rl *RaterList) RegisterRater(clientAddress string, replay *byte) error { - time.Sleep(1 * time.Second) // wait a second for Rater to start serving - client, err := rpc.Dial("tcp", clientAddress) - if err != nil { - log.Panic("Could not connect to client!") - } - rl.clients[clientAddress] = client - log.Print(fmt.Sprintf("Server %v registered succesfully", clientAddress)) - 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 -} +var raterList *registration.RaterList func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "
    ") - for addr, _ := range raterList.clients { + for addr, _ := range raterList.Clients { fmt.Fprint(w, fmt.Sprintf("
  1. %s
  2. ", addr)) } fmt.Fprint(w, "
") } -func callRater(rl *RaterList) { +func callRater(rl *registration.RaterList) { var reply float64 arg := 9.0 log.Print("Starting client polling.") for { - for addr, client := range rl.clients { + for addr, client := range rl.Clients { err := client.Call("Sumer.Square", arg, &reply) if err != nil { log.Print("Closing client!") - delete(rl.clients, addr) + delete(rl.Clients, addr) } fmt.Println(fmt.Sprintf("Result from rater(%v): %v", addr, reply)) } @@ -60,7 +38,7 @@ func callRater(rl *RaterList) { } func main() { - raterList = &RaterList{clients: make(map[string]*rpc.Client)} + raterList = ®istration.RaterList{Clients: make(map[string]*rpc.Client)} go callRater(raterList) rpc.Register(raterList) rpc.HandleHTTP() diff --git a/src/cmd/rater.go b/src/cmd/rater.go index 4fa43f736..68bbfa723 100644 --- a/src/cmd/rater.go +++ b/src/cmd/rater.go @@ -6,9 +6,7 @@ import ( "math" "net" "net/rpc" - "os" - "os/signal" - "syscall" + "registration" ) var ( @@ -23,51 +21,13 @@ 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 { - log.Panic("Cannot register to server!") - } - var reply byte - log.Print("Registering to server ", *server) - client.Call("RaterList.RegisterRater", *listen, &reply) - if err := client.Close(); err != nil { - log.Panic("Could not close server registration!") - } -} - func main() { flag.Parse() arith := new(Sumer) rpc.Register(arith) rpc.HandleHTTP() - go registerToServer() - go stopSingnalHandler() + go registration.RegisterToServer(server, listen) + go registration.StopSingnalHandler(server, listen) addr, err1 := net.ResolveTCPAddr("tcp", *listen) l, err2 := net.ListenTCP("tcp", addr) if err1 != nil || err2 != nil { diff --git a/src/pkg/registration/inquirerregistration.go b/src/pkg/registration/inquirerregistration.go new file mode 100644 index 000000000..03202e685 --- /dev/null +++ b/src/pkg/registration/inquirerregistration.go @@ -0,0 +1,31 @@ +package registration + +import ( + "fmt" + "log" + "net/rpc" + "time" +) + +type RaterList struct { + Clients map[string]*rpc.Client +} + +func (rl *RaterList) RegisterRater(clientAddress string, replay *byte) error { + time.Sleep(1 * time.Second) // wait a second for Rater to start serving + client, err := rpc.Dial("tcp", clientAddress) + if err != nil { + log.Panic("Could not connect to client!") + } + rl.Clients[clientAddress] = client + log.Print(fmt.Sprintf("Server %v registered succesfully", clientAddress)) + 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 +} \ No newline at end of file diff --git a/src/pkg/registration/raterregistration.go b/src/pkg/registration/raterregistration.go new file mode 100644 index 000000000..1ff12afa7 --- /dev/null +++ b/src/pkg/registration/raterregistration.go @@ -0,0 +1,47 @@ +package registration + +import ( + "log" + "net/rpc" + "os" + "os/signal" + "syscall" +) + +func StopSingnalHandler(server, listen *string) { + 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(server, listen) + os.Exit(1) + } + } +} + +func unregisterFromServer(server, listen *string) { + 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(server, listen *string) { + client, err := rpc.DialHTTP("tcp", *server) + if err != nil { + log.Panic("Cannot register to server!") + } + var reply byte + log.Print("Registering to server ", *server) + client.Call("RaterList.RegisterRater", *listen, &reply) + if err := client.Close(); err != nil { + log.Panic("Could not close server registration!") + } +} \ No newline at end of file