mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 10:06:24 +05:00
Updated caps for birpc server
This commit is contained in:
committed by
Dan Christian Bogos
parent
50efbf4451
commit
4fe51d4d05
@@ -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() }
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user