Updated caps for birpc server

This commit is contained in:
Trial97
2021-07-13 17:15:49 +03:00
committed by Dan Christian Bogos
parent 50efbf4451
commit 4fe51d4d05
24 changed files with 245 additions and 239 deletions

View File

@@ -23,6 +23,8 @@ import (
"net/rpc"
"net/rpc/jsonrpc"
"github.com/cenkalti/rpc2"
jsonrpc2 "github.com/cenkalti/rpc2/jsonrpc"
"github.com/cgrates/cgrates/analyzers"
"github.com/cgrates/cgrates/engine"
"github.com/cgrates/cgrates/utils"
@@ -106,3 +108,88 @@ func (c *capsServerCodec) WriteResponse(r *rpc.Response, x interface{}) error {
return c.sc.WriteResponse(r, x)
}
func (c *capsServerCodec) Close() error { return c.sc.Close() }
func newCapsBiRPCGOBCodec(conn conn, caps *engine.Caps, anz *analyzers.AnalyzerService) (r rpc2.Codec) {
r = newCapsBiRPCCodec(rpc2.NewGobCodec(conn), caps)
if anz != nil {
from := conn.RemoteAddr()
var fromstr string
if from != nil {
fromstr = from.String()
}
to := conn.LocalAddr()
var tostr string
if to != nil {
tostr = to.String()
}
return analyzers.NewAnalyzerBiRPCCodec(r, anz, utils.MetaGOB, fromstr, tostr)
}
return
}
func newCapsBiRPCJSONCodec(conn conn, caps *engine.Caps, anz *analyzers.AnalyzerService) (r rpc2.Codec) {
r = newCapsBiRPCCodec(jsonrpc2.NewJSONCodec(conn), caps)
if anz != nil {
from := conn.RemoteAddr()
var fromstr string
if from != nil {
fromstr = from.String()
}
to := conn.LocalAddr()
var tostr string
if to != nil {
tostr = to.String()
}
return analyzers.NewAnalyzerBiRPCCodec(r, anz, utils.MetaJSON, fromstr, tostr)
}
return
}
func newCapsBiRPCCodec(sc rpc2.Codec, caps *engine.Caps) rpc2.Codec {
return &capsBiRPCCodec{
sc: sc,
caps: caps,
}
}
type capsBiRPCCodec struct {
sc rpc2.Codec
caps *engine.Caps
}
// ReadHeader must read a message and populate either the request
// or the response by inspecting the incoming message.
func (c *capsBiRPCCodec) ReadHeader(req *rpc2.Request, resp *rpc2.Response) (err error) {
return c.sc.ReadHeader(req, resp)
}
// ReadRequestBody into args argument of handler function.
func (c *capsBiRPCCodec) ReadRequestBody(x interface{}) (err error) {
if err = c.caps.Allocate(); err != nil {
return
}
return c.sc.ReadRequestBody(x)
}
// ReadResponseBody into reply argument of handler function.
func (c *capsBiRPCCodec) ReadResponseBody(x interface{}) error {
return c.sc.ReadResponseBody(x)
}
// WriteRequest must be safe for concurrent use by multiple goroutines.
func (c *capsBiRPCCodec) WriteRequest(req *rpc2.Request, x interface{}) error {
return c.sc.WriteRequest(req, x)
}
// WriteResponse must be safe for concurrent use by multiple goroutines.
func (c *capsBiRPCCodec) WriteResponse(r *rpc2.Response, x interface{}) error {
if r.Error == utils.ErrMaxConcurentRPCExceededNoCaps.Error() {
r.Error = utils.ErrMaxConcurentRPCExceeded.Error()
} else {
defer c.caps.Deallocate()
}
return c.sc.WriteResponse(r, x)
}
// Close is called when client/server finished with the connection.
func (c *capsBiRPCCodec) Close() error { return c.sc.Close() }

View File

@@ -40,7 +40,6 @@ import (
"github.com/cgrates/cgrates/utils"
"github.com/cenkalti/rpc2"
jsonrpc2 "github.com/cenkalti/rpc2/jsonrpc"
"golang.org/x/net/websocket"
)
@@ -262,14 +261,14 @@ func (s *Server) ServeBiRPC(addrJSON, addrGOB string, onConn func(*rpc2.Client),
s.birpcSrv.OnDisconnect(onDis)
if addrJSON != utils.EmptyString {
var ljson net.Listener
if ljson, err = s.listenBiRPC(s.birpcSrv, addrJSON, utils.JSONCaps, jsonrpc2.NewJSONCodec); err != nil {
if ljson, err = s.listenBiRPC(s.birpcSrv, addrJSON, utils.JSONCaps, newCapsBiRPCJSONCodec); err != nil {
return
}
defer ljson.Close()
}
if addrGOB != utils.EmptyString {
var lgob net.Listener
if lgob, err = s.listenBiRPC(s.birpcSrv, addrGOB, utils.GOBCaps, rpc2.NewGobCodec); err != nil {
if lgob, err = s.listenBiRPC(s.birpcSrv, addrGOB, utils.GOBCaps, newCapsBiRPCGOBCodec); err != nil {
return
}
defer lgob.Close()
@@ -278,7 +277,7 @@ func (s *Server) ServeBiRPC(addrJSON, addrGOB string, onConn func(*rpc2.Client),
return
}
func (s *Server) listenBiRPC(srv *rpc2.Server, addr, codecName string, newCodec func(io.ReadWriteCloser) rpc2.Codec) (lBiRPC net.Listener, err error) {
func (s *Server) listenBiRPC(srv *rpc2.Server, addr, codecName string, newCodec func(conn conn, caps *engine.Caps, anz *analyzers.AnalyzerService) rpc2.Codec) (lBiRPC net.Listener, err error) {
if lBiRPC, err = net.Listen(utils.TCP, addr); err != nil {
log.Printf("ServeBi%s listen error: %s \n", codecName, err)
return
@@ -288,7 +287,7 @@ func (s *Server) listenBiRPC(srv *rpc2.Server, addr, codecName string, newCodec
return
}
func (s *Server) acceptBiRPC(srv *rpc2.Server, l net.Listener, codecName string, newCodec func(io.ReadWriteCloser) rpc2.Codec) {
func (s *Server) acceptBiRPC(srv *rpc2.Server, l net.Listener, codecName string, newCodec func(conn conn, caps *engine.Caps, anz *analyzers.AnalyzerService) rpc2.Codec) {
for {
conn, err := l.Accept()
if err != nil {
@@ -299,7 +298,7 @@ func (s *Server) acceptBiRPC(srv *rpc2.Server, l net.Listener, codecName string,
utils.Logger.Crit(fmt.Sprintf("Stoped Bi%s server beacause %s", codecName, err))
return // stop if we get Accept error
}
go srv.ServeCodec(newCodec(conn))
go srv.ServeCodec(newCodec(conn, s.caps, s.anz))
}
}

View File

@@ -43,7 +43,6 @@ import (
sessions2 "github.com/cgrates/cgrates/sessions"
"github.com/cenkalti/rpc2"
jsonrpc2 "github.com/cenkalti/rpc2/jsonrpc"
"github.com/cgrates/cgrates/config"
@@ -93,7 +92,7 @@ func TestServerIT(t *testing.T) {
utils.Logger.SetLogLevel(7)
for _, test := range sTestsServer {
log.SetOutput(io.Discard)
t.Run("Running IT serve tests", test)
t.Run("TestServerIT", test)
}
}
@@ -759,7 +758,7 @@ func testAcceptBiRPC(t *testing.T) {
l := &mockListener{
p1: p1,
}
go server.acceptBiRPC(server.birpcSrv, l, utils.JSONCaps, jsonrpc2.NewJSONCodec)
go server.acceptBiRPC(server.birpcSrv, l, utils.JSONCaps, newCapsBiRPCJSONCodec)
rpc := jsonrpc.NewClient(p2)
var reply string
expected := "rpc2: can't find method AttributeSv1.Ping"
@@ -780,14 +779,14 @@ func (mK *mockListenError) Accept() (net.Conn, error) {
}
func testAcceptBiRPCError(t *testing.T) {
caps := engine.NewCaps(0, utils.MetaBusy)
caps := engine.NewCaps(10, utils.MetaBusy)
server := NewServer(caps)
server.RpcRegister(new(mockRegister))
server.birpcSrv = rpc2.NewServer()
//it will contain "use of closed network connection"
l := new(mockListenError)
go server.acceptBiRPC(server.birpcSrv, l, utils.JSONCaps, jsonrpc2.NewJSONCodec)
go server.acceptBiRPC(server.birpcSrv, l, utils.JSONCaps, newCapsBiRPCJSONCodec)
runtime.Gosched()
}