Merge unary RPC info and streaming RPC info

This commit is contained in:
Menghan Li
2016-07-11 13:09:50 -07:00
parent 0ea9f970c0
commit bc8885608f
3 changed files with 26 additions and 35 deletions

View File

@ -214,20 +214,9 @@ func (s *serverReflectionServer) serviceMetadataForSymbol(name string) (interfac
return nil, fmt.Errorf("unknown symbol: %v", name) return nil, fmt.Errorf("unknown symbol: %v", name)
} }
// Search for method in info.Methods. // Search for method name in info.Methods.
var found bool var found bool
for _, m := range info.Methods { for _, m := range info.Methods {
if m == name[pos+1:] {
found = true
break
}
}
if found {
return info.Metadata, nil
}
// Search for stream in info.Streams.
for _, m := range info.Streams {
if m.Name == name[pos+1:] { if m.Name == name[pos+1:] {
found = true found = true
break break

View File

@ -245,9 +245,9 @@ func (s *Server) register(sd *ServiceDesc, ss interface{}) {
s.m[sd.ServiceName] = srv s.m[sd.ServiceName] = srv
} }
// StreamInfo contains information about a streaming RPC. // MethodInfo contains information about an RPC.
type StreamInfo struct { type MethodInfo struct {
// Name is the RPC name only, without the service name or package name. // Name is the method name only, without the service name or package name.
Name string Name string
// IsClientStream indicates whether the RPC is a client streaming RPC. // IsClientStream indicates whether the RPC is a client streaming RPC.
IsClientStream bool IsClientStream bool
@ -255,12 +255,9 @@ type StreamInfo struct {
IsServerStream bool IsServerStream bool
} }
// ServiceInfo contains unary RPC names, streaming RPC infos and metadata for a service. // ServiceInfo contains unary RPC method info, streaming RPC methid info and metadata for a service.
type ServiceInfo struct { type ServiceInfo struct {
// Methods are unary RPC names only, without the service name or package name. Methods []MethodInfo
Methods []string
// Streams are streaming RPC names and streaming types.
Streams []*StreamInfo
// Metadata is the metadata specified in ServiceDesc when registering service. // Metadata is the metadata specified in ServiceDesc when registering service.
Metadata interface{} Metadata interface{}
} }
@ -270,14 +267,17 @@ type ServiceInfo struct {
func (s *Server) GetServiceInfo() map[string]*ServiceInfo { func (s *Server) GetServiceInfo() map[string]*ServiceInfo {
ret := make(map[string]*ServiceInfo) ret := make(map[string]*ServiceInfo)
for n, srv := range s.m { for n, srv := range s.m {
methods := make([]string, 0, len(srv.md)) methods := make([]MethodInfo, 0, len(srv.md)+len(srv.sd))
for m := range srv.md { for m := range srv.md {
methods = append(methods, m) methods = append(methods, MethodInfo{
Name: m,
IsClientStream: false,
IsServerStream: false,
})
} }
streams := make([]*StreamInfo, 0, len(srv.sd)) for m, d := range srv.sd {
for s, d := range srv.sd { methods = append(methods, MethodInfo{
streams = append(streams, &StreamInfo{ Name: m,
Name: s,
IsClientStream: d.ClientStreams, IsClientStream: d.ClientStreams,
IsServerStream: d.ServerStreams, IsServerStream: d.ServerStreams,
}) })
@ -285,7 +285,6 @@ func (s *Server) GetServiceInfo() map[string]*ServiceInfo {
ret[n] = &ServiceInfo{ ret[n] = &ServiceInfo{
Methods: methods, Methods: methods,
Streams: streams,
Metadata: srv.mdata, Metadata: srv.mdata,
} }
} }

View File

@ -92,14 +92,17 @@ func TestGetServiceInfo(t *testing.T) {
info := server.GetServiceInfo() info := server.GetServiceInfo()
want := map[string]*ServiceInfo{ want := map[string]*ServiceInfo{
"grpc.testing.EmptyService": &ServiceInfo{ "grpc.testing.EmptyService": &ServiceInfo{
Methods: []string{ Methods: []MethodInfo{
"EmptyCall", MethodInfo{
}, Name: "EmptyCall",
Streams: []*StreamInfo{&StreamInfo{ IsClientStream: false,
Name: "EmptyStream", IsServerStream: false,
IsClientStream: true, },
IsServerStream: false, MethodInfo{
}}, Name: "EmptyStream",
IsClientStream: true,
IsServerStream: false,
}},
Metadata: []int{0, 2, 1, 3}, Metadata: []int{0, 2, 1, 3},
}, },
} }