From 84738404467c85aa104646bffbea9359a0587f62 Mon Sep 17 00:00:00 2001 From: DanB Date: Fri, 10 May 2013 13:07:20 +0200 Subject: [PATCH] Adding reconnect to both Mediator and SessionManager --- cmd/cgr-rater/cgr-rater.go | 36 ++++++++++++++++++++++++++++++------ config/config.go | 10 ++++++++++ data/conf/cgrates.cfg | 2 ++ 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/cmd/cgr-rater/cgr-rater.go b/cmd/cgr-rater/cgr-rater.go index 8d54fdc59..dbb78fc55 100644 --- a/cmd/cgr-rater/cgr-rater.go +++ b/cmd/cgr-rater/cgr-rater.go @@ -98,9 +98,21 @@ func startMediator(responder *rater.Responder, loggerDb rater.DataStorage) { var client *rpc.Client var err error if cfg.MediatorRPCEncoding == JSON { - client, err = jsonrpc.Dial("tcp", cfg.MediatorRater) + for i := 0; i < cfg.MediatorRaterReconnects; i++ { + client, err = jsonrpc.Dial("tcp", cfg.MediatorRater) + if err == nil { //Connected so no need to reiterate + break + } + time.Sleep(time.Duration(i/2) * time.Second) + } } else { - client, err = rpc.Dial("tcp", cfg.MediatorRater) + for i := 0; i < cfg.MediatorRaterReconnects; i++ { + client, err = rpc.Dial("tcp", cfg.MediatorRater) + if err == nil { //Connected so no need to reiterate + break + } + time.Sleep(time.Duration(i/2) * time.Second) + } } if err != nil { rater.Logger.Crit(fmt.Sprintf("Could not connect to rater: %v", err)) @@ -142,9 +154,23 @@ func startSessionManager(responder *rater.Responder, loggerDb rater.DataStorage) var client *rpc.Client var err error if cfg.SMRPCEncoding == JSON { - client, err = jsonrpc.Dial("tcp", cfg.SMRater) + // We attempt to reconnect more times + for i := 0; i < cfg.SMRaterReconnects; i++ { + client, err = jsonrpc.Dial("tcp", cfg.SMRater) + if err == nil { //Connected so no need to reiterate + break + } + time.Sleep(time.Duration(i/2) * time.Second) + } } else { - client, err = rpc.Dial("tcp", cfg.SMRater) + for i := 0; i < cfg.SMRaterReconnects; i++ { + client, err = rpc.Dial("tcp", cfg.SMRater) + if err == nil { //Connected so no need to reiterate + break + } + time.Sleep(time.Duration(i/2) * time.Second) + } + } if err != nil { rater.Logger.Crit(fmt.Sprintf("Could not connect to rater: %v", err)) @@ -231,12 +257,10 @@ func configureDatabase(db_type, host, port, name, user, pass string) (getter rat getter, err = rater.NewPostgresStorage(host, port, name, user, pass) default: err = errors.New("unknown db") - rater.Logger.Crit("Unknown db type, exiting!") return nil, err } if err != nil { - rater.Logger.Crit(fmt.Sprintf("Could not connect to db: %v, exiting!", err)) return nil, err } return getter, nil diff --git a/config/config.go b/config/config.go index 7ebe573e1..c1bad7d44 100644 --- a/config/config.go +++ b/config/config.go @@ -61,6 +61,7 @@ type CGRConfig struct { SMEnabled bool SMSwitchType string SMRater string // address where to access rater. Can be internal, direct rater address or the address of a balancer + SMRaterReconnects int // Number of reconnect attempts to rater SMDebitInterval int // the period to be debited in advanced during a call (in seconds) SMRPCEncoding string // use JSON for RPC encoding SMDefaultReqType string // Use this request type if not defined on top @@ -72,6 +73,7 @@ type CGRConfig struct { MediatorCDRInDir string // Freeswitch Master CSV CDR path. MediatorCDROutDir string // Freeswitch Master CSV CDR output path. MediatorRater string // address where to access rater. Can be internal, direct rater address or the address of a balancer + MediatorRaterReconnects int // Number of reconnect attempts to rater MediatorRPCEncoding string // use JSON for RPC encoding MediatorSkipDB bool MediatorPseudoprepaid bool @@ -193,6 +195,10 @@ func NewCGRConfig(cfgPath *string) (*CGRConfig, error) { if hasOpt = c.HasOption("mediator", "rater"); hasOpt { cfg.MediatorRater, _ = c.GetString("mediator", "rater") } + cfg.MediatorRaterReconnects = 3 + if hasOpt = c.HasOption("mediator", "rater_reconnects"); hasOpt { + cfg.MediatorRaterReconnects, _ = c.GetInt("mediator", "rater_reconnects") + } cfg.MediatorRPCEncoding = GOB if hasOpt = c.HasOption("mediator", "rpc_encoding"); hasOpt { cfg.MediatorRPCEncoding, _ = c.GetString("mediator", "rpc_encoding") @@ -221,6 +227,10 @@ func NewCGRConfig(cfgPath *string) (*CGRConfig, error) { if hasOpt = c.HasOption("session_manager", "rater"); hasOpt { cfg.SMRater, _ = c.GetString("session_manager", "rater") } + cfg.SMRaterReconnects = 3 + if hasOpt = c.HasOption("session_manager", "rater_reconnects"); hasOpt { + cfg.SMRaterReconnects, _ = c.GetInt("session_manager", "rater_reconnects") + } cfg.SMDebitInterval = 10 if hasOpt = c.HasOption("session_manager", "debit_interval"); hasOpt { cfg.SMDebitInterval, _ = c.GetInt("session_manager", "debit_interval") diff --git a/data/conf/cgrates.cfg b/data/conf/cgrates.cfg index 5c36ee900..8ad86999b 100644 --- a/data/conf/cgrates.cfg +++ b/data/conf/cgrates.cfg @@ -35,6 +35,7 @@ [mediator] # enabled = false # Starts Mediator service: . # rater = 127.0.0.1:2012 # Address where to reach the Rater. +# rater_reconnects = 3 # Number of reconnects to rater before giving up. # rpc_encoding = gob # RPC encoding used when talking to Rater: . # skipdb = false # Skips database checks for previous recorded prices: . # pseudoprepaid = false # Execute debits together with pricing: . @@ -46,6 +47,7 @@ # enabled = false # Starts SessionManager service: . # switch_type = freeswitch # Defines the type of switch behind: . # rater = 127.0.0.1:2012 # Address where to reach the Rater. +# rater_reconnects = 3 # Number of reconnects to rater before giving up. # debit_interval = 5 # Interval to perform debits on. # rpc_encoding = gob # RPC encoding used when talking to Rater: . # default_reqtype = # Default request type to consider when missing from requests: <""|prepaid|postpaid>.