go - Golang unix sockets: registering same type for RPC on different sockets? -
i'm working in go , bit new working unix sockets. tried searching similar question, couldn't find anything, apologies if has been answered before.
i want use unix sockets simulate cluster of machines testing. i'm testing implementation of raft, want register multiple objects of same type (a hefty struct) on different unix sockets. looking @ simple example wrote, effect seems not want: dialing different sockets same exported method seems collapse on single port:
package main import ( "net" "fmt" "net/rpc" "log" "sync" ) type server struct { name string } type speakargs struct { } type speakreply struct { success bool } type addargs struct { a, b int } type addreply struct { answer int success bool } func (s *server) add(args *addargs, reply *addreply) error { reply.answer = args.a + args.b reply.success = true return nil } func (s *server) speak(args *speakargs, reply *speakreply) error { fmt.printf("my name %v.\n", s.name) reply.success = true return nil } func main() { var wgmain, wgregister, wgcall sync.waitgroup wgmain.add(3) wgregister.add(2) wgcall.add(1) go func() { server := &server{name: "richard"} rpc.register(server) la, e := net.listen("unix", "/tmp/example1.sock") if e != nil { log.fatal("listen error:", e) } wgregister.done() go rpc.accept(la) wgcall.wait() la.close() wgmain.done() fmt.println("server exited.") }() go func() { server := &server{name: "benny"} rpc.register(server) lb, e := net.listen("unix", "/tmp/example2.sock") if e != nil { log.fatal("listen error:", e) } wgregister.done() go rpc.accept(lb) wgcall.wait() lb.close() wgmain.done() fmt.println("server exited.") }() go func() { wgregister.wait() oneclient, err1 := rpc.dial("unix", "/tmp/example1.sock") twoclient, err2 := rpc.dial("unix", "/tmp/example2.sock") if err1 != nil { log.fatal("listen error:", err1) } if err2 != nil { log.fatal("listen error:", err2) } addargs := &addargs{1, 2} addreply := &addreply{} speakargs := &speakargs{} speakreply := speakreply{} oneclient.call("server.add", addargs, addreply) oneclient.call("server.speak", speakargs, speakreply) twoclient.call("server.speak", speakargs, speakreply) fmt.printf("added numbers! %v + %v = %v.\n", addargs.a, addargs.b, addreply.answer) wgcall.done() oneclient.close() twoclient.close() wgmain.done() fmt.println("client exited.") }() wgmain.wait() } i expect print both richard , benny in console when speak() called on different clients, instead prints 1 of them twice, seemingly randomly. there i'm missing here? example output, time richard seemed come out, benny.
my name richard. name richard. added numbers! 1 + 2 = 3. client exited. server exited. server exited. edit: fix pavlo strokov! rpc.register defaults defaultserver if not specified, both getting registered on same rpc server: correction call rpc.newserver() , register each server on one.
package main import ( "net" "fmt" "net/rpc" "log" "sync" ) type server struct { name string } type speakargs struct { } type speakreply struct { success bool } type addargs struct { a, b int } type addreply struct { answer int success bool } func (s *server) add(args *addargs, reply *addreply) error { reply.answer = args.a + args.b reply.success = true return nil } func (s *server) speak(args *speakargs, reply *speakreply) error { fmt.printf("my name %v.\n", s.name) reply.success = true return nil } func main() { var wgmain, wgregister, wgcall sync.waitgroup wgmain.add(3) wgregister.add(2) wgcall.add(1) go func() { rpcserver := rpc.newserver() server := &server{name: "richard"} rpcserver.register(server) la, e := net.listen("unix", "/tmp/example1.sock") if e != nil { log.fatal("listen error:", e) } wgregister.done() go rpcserver.accept(la) wgcall.wait() la.close() wgmain.done() fmt.println("server exited.") }() go func() { rpcserver := rpc.newserver() server := &server{name: "benny"} rpcserver.register(server) lb, e := net.listen("unix", "/tmp/example2.sock") if e != nil { log.fatal("listen error:", e) } wgregister.done() go rpcserver.accept(lb) wgcall.wait() lb.close() wgmain.done() fmt.println("server exited.") }() go func() { wgregister.wait() oneclient, err1 := rpc.dial("unix", "/tmp/example1.sock") twoclient, err2 := rpc.dial("unix", "/tmp/example2.sock") if err1 != nil { log.fatal("listen error:", err1) } if err2 != nil { log.fatal("listen error:", err2) } addargs := &addargs{1, 2} addreply := &addreply{} speakargs := &speakargs{} speakreply := &speakreply{} oneclient.call("server.add", addargs, addreply) oneclient.call("server.speak", speakargs, speakreply) twoclient.call("server.speak", speakargs, speakreply) fmt.printf("added numbers! %v + %v = %v.\n", addargs.a, addargs.b, addreply.answer) wgcall.done() oneclient.close() twoclient.close() wgmain.done() fmt.println("client exited.") }() wgmain.wait() } which prints
my name richard. name benny. added numbers! 1 + 2 = 3. client exited. server exited. server exited.
i think because using defaultserver rpc server. instead should create different servers each: richard , benny. please take on code modified me work expected here: rpc calls on 1 machine
Comments
Post a Comment