From 6681450947d5d66b6459ccaf805c2f2dc55ea063 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Tue, 7 Apr 2015 16:20:37 +0900 Subject: [PATCH 1/4] implement ABitOfEverythingService --- examples/server/main.go | 82 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 3 deletions(-) diff --git a/examples/server/main.go b/examples/server/main.go index 99b2a9be8ec..8f6320d1851 100644 --- a/examples/server/main.go +++ b/examples/server/main.go @@ -1,23 +1,98 @@ package main import ( + "errors" "flag" + "fmt" "net" examples "github.com/gengo/grpc-gateway/examples" + sub "github.com/gengo/grpc-gateway/examples/sub" "github.com/golang/glog" + "github.com/rogpeppe/fastuuid" "golang.org/x/net/context" "google.golang.org/grpc" ) +// Implements of EchoServiceServer + type echoServer struct{} -func (s echoServer) Echo(ctx context.Context, msg *examples.SimpleMessage) (*examples.SimpleMessage, error) { +func newEchoServer() examples.EchoServiceServer { + return new(echoServer) +} + +func (s *echoServer) Echo(ctx context.Context, msg *examples.SimpleMessage) (*examples.SimpleMessage, error) { + glog.Info(msg) + return msg, nil +} + +func (s *echoServer) EchoBody(ctx context.Context, msg *examples.SimpleMessage) (*examples.SimpleMessage, error) { glog.Info(msg) return msg, nil } -func (s echoServer) EchoBody(ctx context.Context, msg *examples.SimpleMessage) (*examples.SimpleMessage, error) { +// Implements of ABitOfEverythingServiceServer + +var uuidgen = fastuuid.MustNewGenerator() + +type _ABitOfEverythingServer struct { + m map[string]*examples.ABitOfEverything +} + +func newABitOfEverythingServer() examples.ABitOfEverythingServiceServer { + return &_ABitOfEverythingServer{ + m: make(map[string]*examples.ABitOfEverything), + } +} + +func (s *_ABitOfEverythingServer) Create(ctx context.Context, msg *examples.ABitOfEverything) (*examples.ABitOfEverything, error) { + glog.Info(msg) + var uuid string + for { + uuid = fmt.Sprintf("%x", uuidgen.Next()) + if _, ok := s.m[uuid]; !ok { + break + } + } + s.m[uuid] = msg + s.m[uuid].Uuid = uuid + return s.m[uuid], nil +} + +func (s *_ABitOfEverythingServer) CreateBody(ctx context.Context, msg *examples.ABitOfEverything) (*examples.ABitOfEverything, error) { + return s.Create(ctx, msg) +} + +func (s *_ABitOfEverythingServer) Lookup(ctx context.Context, msg *examples.IdMessage) (*examples.ABitOfEverything, error) { + glog.Info(msg) + if a, ok := s.m[msg.Uuid]; ok { + return a, nil + } + return nil, errors.New("not found") +} + +func (s *_ABitOfEverythingServer) Update(ctx context.Context, msg *examples.ABitOfEverything) (*examples.EmptyMessage, error) { + glog.Info(msg) + if _, ok := s.m[msg.Uuid]; ok { + s.m[msg.Uuid] = msg + } else { + return nil, errors.New("not found") + } + return new(examples.EmptyMessage), nil +} + +func (s *_ABitOfEverythingServer) Delete(ctx context.Context, msg *examples.IdMessage) (*examples.EmptyMessage, error) { + glog.Info(msg) + if _, ok := s.m[msg.Uuid]; ok { + delete(s.m, msg.Uuid) + } else { + return nil, errors.New("not found") + } + return new(examples.EmptyMessage), nil +} + +func (s *_ABitOfEverythingServer) Echo(ctx context.Context, msg *sub.StringMessage) (*sub.StringMessage, error) { glog.Info(msg) return msg, nil } @@ -32,7 +107,8 @@ func run() error { return err } s := grpc.NewServer() - examples.RegisterEchoServiceServer(s, echoServer{}) + examples.RegisterEchoServiceServer(s, newEchoServer()) + examples.RegisterABitOfEverythingServiceServer(s, newABitOfEverythingServer()) s.Serve(l) return nil } From 145a8eb9d28123e756042707b98e5f5383c10abc Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Tue, 7 Apr 2015 16:39:49 +0900 Subject: [PATCH 2/4] use grpc.Errorf(codes.NotFound, "not found") --- examples/server/main.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/server/main.go b/examples/server/main.go index 8f6320d1851..99495143a86 100644 --- a/examples/server/main.go +++ b/examples/server/main.go @@ -1,7 +1,6 @@ package main import ( - "errors" "flag" "fmt" "net" @@ -12,6 +11,7 @@ import ( "github.com/rogpeppe/fastuuid" "golang.org/x/net/context" "google.golang.org/grpc" + "google.golang.org/grpc/codes" ) // Implements of EchoServiceServer @@ -69,7 +69,7 @@ func (s *_ABitOfEverythingServer) Lookup(ctx context.Context, msg *examples.IdMe if a, ok := s.m[msg.Uuid]; ok { return a, nil } - return nil, errors.New("not found") + return nil, grpc.Errorf(codes.NotFound, "not found") } func (s *_ABitOfEverythingServer) Update(ctx context.Context, msg *examples.ABitOfEverything) (*examples.EmptyMessage, error) { @@ -77,7 +77,7 @@ func (s *_ABitOfEverythingServer) Update(ctx context.Context, msg *examples.ABit if _, ok := s.m[msg.Uuid]; ok { s.m[msg.Uuid] = msg } else { - return nil, errors.New("not found") + return nil, grpc.Errorf(codes.NotFound, "not found") } return new(examples.EmptyMessage), nil } @@ -87,7 +87,7 @@ func (s *_ABitOfEverythingServer) Delete(ctx context.Context, msg *examples.IdMe if _, ok := s.m[msg.Uuid]; ok { delete(s.m, msg.Uuid) } else { - return nil, errors.New("not found") + return nil, grpc.Errorf(codes.NotFound, "not found") } return new(examples.EmptyMessage), nil } From 62000f7e3bf9a8791ee05710e87b4d518d76f155 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Tue, 7 Apr 2015 16:44:04 +0900 Subject: [PATCH 3/4] fix race conditions --- examples/server/main.go | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/examples/server/main.go b/examples/server/main.go index 99495143a86..0dafa4e76b1 100644 --- a/examples/server/main.go +++ b/examples/server/main.go @@ -4,6 +4,7 @@ import ( "flag" "fmt" "net" + "sync" examples "github.com/gengo/grpc-gateway/examples" sub "github.com/gengo/grpc-gateway/examples/sub" @@ -37,27 +38,31 @@ func (s *echoServer) EchoBody(ctx context.Context, msg *examples.SimpleMessage) var uuidgen = fastuuid.MustNewGenerator() type _ABitOfEverythingServer struct { - m map[string]*examples.ABitOfEverything + v map[string]*examples.ABitOfEverything + m sync.Mutex } func newABitOfEverythingServer() examples.ABitOfEverythingServiceServer { return &_ABitOfEverythingServer{ - m: make(map[string]*examples.ABitOfEverything), + v: make(map[string]*examples.ABitOfEverything), } } func (s *_ABitOfEverythingServer) Create(ctx context.Context, msg *examples.ABitOfEverything) (*examples.ABitOfEverything, error) { + s.m.Lock() + defer s.m.Unlock() + glog.Info(msg) var uuid string for { uuid = fmt.Sprintf("%x", uuidgen.Next()) - if _, ok := s.m[uuid]; !ok { + if _, ok := s.v[uuid]; !ok { break } } - s.m[uuid] = msg - s.m[uuid].Uuid = uuid - return s.m[uuid], nil + s.v[uuid] = msg + s.v[uuid].Uuid = uuid + return s.v[uuid], nil } func (s *_ABitOfEverythingServer) CreateBody(ctx context.Context, msg *examples.ABitOfEverything) (*examples.ABitOfEverything, error) { @@ -65,17 +70,23 @@ func (s *_ABitOfEverythingServer) CreateBody(ctx context.Context, msg *examples. } func (s *_ABitOfEverythingServer) Lookup(ctx context.Context, msg *examples.IdMessage) (*examples.ABitOfEverything, error) { + s.m.Lock() + defer s.m.Unlock() + glog.Info(msg) - if a, ok := s.m[msg.Uuid]; ok { + if a, ok := s.v[msg.Uuid]; ok { return a, nil } return nil, grpc.Errorf(codes.NotFound, "not found") } func (s *_ABitOfEverythingServer) Update(ctx context.Context, msg *examples.ABitOfEverything) (*examples.EmptyMessage, error) { + s.m.Lock() + defer s.m.Unlock() + glog.Info(msg) - if _, ok := s.m[msg.Uuid]; ok { - s.m[msg.Uuid] = msg + if _, ok := s.v[msg.Uuid]; ok { + s.v[msg.Uuid] = msg } else { return nil, grpc.Errorf(codes.NotFound, "not found") } @@ -83,9 +94,12 @@ func (s *_ABitOfEverythingServer) Update(ctx context.Context, msg *examples.ABit } func (s *_ABitOfEverythingServer) Delete(ctx context.Context, msg *examples.IdMessage) (*examples.EmptyMessage, error) { + s.m.Lock() + defer s.m.Unlock() + glog.Info(msg) - if _, ok := s.m[msg.Uuid]; ok { - delete(s.m, msg.Uuid) + if _, ok := s.v[msg.Uuid]; ok { + delete(s.v, msg.Uuid) } else { return nil, grpc.Errorf(codes.NotFound, "not found") } From 78d3b25e8fab1242340aca5df4aea6600bbe775b Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Tue, 7 Apr 2015 16:52:16 +0900 Subject: [PATCH 4/4] ditto --- examples/server/main.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/server/main.go b/examples/server/main.go index 0dafa4e76b1..cebe63df5ba 100644 --- a/examples/server/main.go +++ b/examples/server/main.go @@ -107,6 +107,9 @@ func (s *_ABitOfEverythingServer) Delete(ctx context.Context, msg *examples.IdMe } func (s *_ABitOfEverythingServer) Echo(ctx context.Context, msg *sub.StringMessage) (*sub.StringMessage, error) { + s.m.Lock() + defer s.m.Unlock() + glog.Info(msg) return msg, nil }