rpc: fix megacheck warnings
This commit is contained in:
parent
43437806fb
commit
e063d538b8
@ -29,11 +29,7 @@ import (
|
||||
"gopkg.in/fatih/set.v0"
|
||||
)
|
||||
|
||||
const (
|
||||
notificationBufferSize = 10000 // max buffered notifications before codec is closed
|
||||
|
||||
MetadataApi = "rpc"
|
||||
)
|
||||
const MetadataApi = "rpc"
|
||||
|
||||
// CodecOption specifies which type of messages this codec supports
|
||||
type CodecOption int
|
||||
@ -49,10 +45,9 @@ const (
|
||||
// NewServer will create a new server instance with no registered handlers.
|
||||
func NewServer() *Server {
|
||||
server := &Server{
|
||||
services: make(serviceRegistry),
|
||||
subscriptions: make(subscriptionRegistry),
|
||||
codecs: set.New(),
|
||||
run: 1,
|
||||
services: make(serviceRegistry),
|
||||
codecs: set.New(),
|
||||
run: 1,
|
||||
}
|
||||
|
||||
// register a default service which will provide meta information about the RPC service such as the services and
|
||||
@ -124,16 +119,6 @@ func (s *Server) RegisterName(name string, rcvr interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// hasOption returns true if option is included in options, otherwise false
|
||||
func hasOption(option CodecOption, options []CodecOption) bool {
|
||||
for _, o := range options {
|
||||
if option == o {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// serveRequest will reads requests from the codec, calls the RPC callback and
|
||||
// writes the response to the given codec.
|
||||
//
|
||||
@ -148,13 +133,11 @@ func (s *Server) serveRequest(codec ServerCodec, singleShot bool, options CodecO
|
||||
const size = 64 << 10
|
||||
buf := make([]byte, size)
|
||||
buf = buf[:runtime.Stack(buf, false)]
|
||||
log.Error(fmt.Sprint(string(buf)))
|
||||
log.Error(string(buf))
|
||||
}
|
||||
s.codecsMu.Lock()
|
||||
s.codecs.Remove(codec)
|
||||
s.codecsMu.Unlock()
|
||||
|
||||
return
|
||||
}()
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
@ -246,7 +229,7 @@ func (s *Server) ServeSingleRequest(codec ServerCodec, options CodecOption) {
|
||||
// close all codecs which will cancel pending requests/subscriptions.
|
||||
func (s *Server) Stop() {
|
||||
if atomic.CompareAndSwapInt32(&s.run, 1, 0) {
|
||||
log.Debug(fmt.Sprint("RPC Server shutdown initiatied"))
|
||||
log.Debug("RPC Server shutdown initiatied")
|
||||
s.codecsMu.Lock()
|
||||
defer s.codecsMu.Unlock()
|
||||
s.codecs.Each(func(c interface{}) bool {
|
||||
|
@ -53,7 +53,6 @@ type notifierKey struct{}
|
||||
type Notifier struct {
|
||||
codec ServerCodec
|
||||
subMu sync.RWMutex // guards active and inactive maps
|
||||
stopped bool
|
||||
active map[ID]*Subscription
|
||||
inactive map[ID]*Subscription
|
||||
}
|
||||
|
@ -165,7 +165,7 @@ func TestNotifications(t *testing.T) {
|
||||
}
|
||||
|
||||
func waitForMessages(t *testing.T, in *json.Decoder, successes chan<- jsonSuccessResponse,
|
||||
failures chan<- jsonErrResponse, notifications chan<- jsonNotification) {
|
||||
failures chan<- jsonErrResponse, notifications chan<- jsonNotification, errors chan<- error) {
|
||||
|
||||
// read and parse server messages
|
||||
for {
|
||||
@ -177,12 +177,14 @@ func waitForMessages(t *testing.T, in *json.Decoder, successes chan<- jsonSucces
|
||||
var responses []map[string]interface{}
|
||||
if rmsg[0] == '[' {
|
||||
if err := json.Unmarshal(rmsg, &responses); err != nil {
|
||||
t.Fatalf("Received invalid message: %s", rmsg)
|
||||
errors <- fmt.Errorf("Received invalid message: %s", rmsg)
|
||||
return
|
||||
}
|
||||
} else {
|
||||
var msg map[string]interface{}
|
||||
if err := json.Unmarshal(rmsg, &msg); err != nil {
|
||||
t.Fatalf("Received invalid message: %s", rmsg)
|
||||
errors <- fmt.Errorf("Received invalid message: %s", rmsg)
|
||||
return
|
||||
}
|
||||
responses = append(responses, msg)
|
||||
}
|
||||
@ -216,7 +218,7 @@ func waitForMessages(t *testing.T, in *json.Decoder, successes chan<- jsonSucces
|
||||
}
|
||||
continue
|
||||
}
|
||||
t.Fatalf("Received invalid message: %s", msg)
|
||||
errors <- fmt.Errorf("Received invalid message: %s", msg)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -235,6 +237,8 @@ func TestSubscriptionMultipleNamespaces(t *testing.T) {
|
||||
successes = make(chan jsonSuccessResponse)
|
||||
failures = make(chan jsonErrResponse)
|
||||
notifications = make(chan jsonNotification)
|
||||
|
||||
errors = make(chan error, 10)
|
||||
)
|
||||
|
||||
// setup and start server
|
||||
@ -248,7 +252,7 @@ func TestSubscriptionMultipleNamespaces(t *testing.T) {
|
||||
defer server.Stop()
|
||||
|
||||
// wait for message and write them to the given channels
|
||||
go waitForMessages(t, in, successes, failures, notifications)
|
||||
go waitForMessages(t, in, successes, failures, notifications, errors)
|
||||
|
||||
// create subscriptions one by one
|
||||
n := 3
|
||||
@ -297,6 +301,8 @@ func TestSubscriptionMultipleNamespaces(t *testing.T) {
|
||||
}
|
||||
|
||||
select {
|
||||
case err := <-errors:
|
||||
t.Fatal(err)
|
||||
case suc := <-successes: // subscription created
|
||||
subids[namespaces[int(suc.Id.(float64))]] = suc.Result.(string)
|
||||
case failure := <-failures:
|
||||
|
13
rpc/types.go
13
rpc/types.go
@ -48,7 +48,6 @@ type callback struct {
|
||||
// service represents a registered object
|
||||
type service struct {
|
||||
name string // name for service
|
||||
rcvr reflect.Value // receiver of methods for the service
|
||||
typ reflect.Type // receiver type
|
||||
callbacks callbacks // registered handlers
|
||||
subscriptions subscriptions // available subscriptions/notifications
|
||||
@ -58,23 +57,19 @@ type service struct {
|
||||
type serverRequest struct {
|
||||
id interface{}
|
||||
svcname string
|
||||
rcvr reflect.Value
|
||||
callb *callback
|
||||
args []reflect.Value
|
||||
isUnsubscribe bool
|
||||
err Error
|
||||
}
|
||||
|
||||
type serviceRegistry map[string]*service // collection of services
|
||||
type callbacks map[string]*callback // collection of RPC callbacks
|
||||
type subscriptions map[string]*callback // collection of subscription callbacks
|
||||
type subscriptionRegistry map[string]*callback // collection of subscription callbacks
|
||||
type serviceRegistry map[string]*service // collection of services
|
||||
type callbacks map[string]*callback // collection of RPC callbacks
|
||||
type subscriptions map[string]*callback // collection of subscription callbacks
|
||||
|
||||
// Server represents a RPC server
|
||||
type Server struct {
|
||||
services serviceRegistry
|
||||
muSubcriptions sync.Mutex // protects subscriptions
|
||||
subscriptions subscriptionRegistry
|
||||
services serviceRegistry
|
||||
|
||||
run int32
|
||||
codecsMu sync.Mutex
|
||||
|
27
rpc/utils.go
27
rpc/utils.go
@ -119,21 +119,6 @@ func isHexNum(t reflect.Type) bool {
|
||||
return t == bigIntType
|
||||
}
|
||||
|
||||
var blockNumberType = reflect.TypeOf((*BlockNumber)(nil)).Elem()
|
||||
|
||||
// Indication if the given block is a BlockNumber
|
||||
func isBlockNumber(t reflect.Type) bool {
|
||||
if t == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
for t.Kind() == reflect.Ptr {
|
||||
t = t.Elem()
|
||||
}
|
||||
|
||||
return t == blockNumberType
|
||||
}
|
||||
|
||||
// suitableCallbacks iterates over the methods of the given type. It will determine if a method satisfies the criteria
|
||||
// for a RPC callback or a subscription callback and adds it to the collection of callbacks or subscriptions. See server
|
||||
// documentation for a summary of these criteria.
|
||||
@ -210,18 +195,12 @@ METHODS:
|
||||
}
|
||||
|
||||
switch mtype.NumOut() {
|
||||
case 0, 1:
|
||||
break
|
||||
case 2:
|
||||
if h.errPos == -1 { // method must one return value and 1 error
|
||||
case 0, 1, 2:
|
||||
if mtype.NumOut() == 2 && h.errPos == -1 { // method must one return value and 1 error
|
||||
continue METHODS
|
||||
}
|
||||
break
|
||||
default:
|
||||
continue METHODS
|
||||
callbacks[mname] = &h
|
||||
}
|
||||
|
||||
callbacks[mname] = &h
|
||||
}
|
||||
|
||||
return callbacks, subscriptions
|
||||
|
Loading…
Reference in New Issue
Block a user