<cmd/cgr-rater> Introducing synchronicity for config phase to avoid concurrency issues

This commit is contained in:
DanB
2013-05-10 12:16:41 +02:00
parent e5ad2bd09b
commit 25cbad0a90

View File

@@ -167,14 +167,14 @@ func startSessionManager(responder *rater.Responder, loggerDb rater.DataStorage)
exitChan <- true
}
func checkConfigSanity() {
func checkConfigSanity() error {
if cfg.SMEnabled && cfg.RaterEnabled && cfg.RaterBalancer != DISABLED {
rater.Logger.Crit("The session manager must not be enabled on a worker rater (change [rater]/balancer to disabled)!")
exitChan <- true
return errors.New("SessionManager on Worker")
}
if cfg.BalancerEnabled && cfg.RaterEnabled && cfg.RaterBalancer != DISABLED {
rater.Logger.Crit("The balancer is enabled so it cannot connect to anatoher balancer (change [rater]/balancer to disabled)!")
exitChan <- true
return errors.New("Improperly configured balancer")
}
// check if the session manager or mediator is connectting via loopback
@@ -185,13 +185,13 @@ func checkConfigSanity() {
if cfg.BalancerEnabled {
if cfg.BalancerRPCEncoding != cfg.SMRPCEncoding {
rater.Logger.Crit("If you are connecting the session manager via the loopback to the balancer use the same type of rpc encoding!")
exitChan <- true
return errors.New("Balancer and SessionManager using different encoding")
}
}
if cfg.RaterEnabled {
if cfg.RaterRPCEncoding != cfg.SMRPCEncoding {
rater.Logger.Crit("If you are connecting the session manager via the loopback to the arter use the same type of rpc encoding!")
exitChan <- true
return errors.New("Rater and SessionManager using different encoding")
}
}
}
@@ -199,16 +199,17 @@ func checkConfigSanity() {
if cfg.BalancerEnabled {
if cfg.BalancerRPCEncoding != cfg.MediatorRPCEncoding {
rater.Logger.Crit("If you are connecting the mediator via the loopback to the balancer use the same type of rpc encoding!")
exitChan <- true
return errors.New("Balancer and Mediator using different encoding")
}
}
if cfg.RaterEnabled {
if cfg.RaterRPCEncoding != cfg.MediatorRPCEncoding {
rater.Logger.Crit("If you are connecting the mediator via the loopback to the arter use the same type of rpc encoding!")
exitChan <- true
return errors.New("Rater and Mediator using different encoding")
}
}
}
return nil
}
func configureDatabase(db_type, host, port, name, user, pass string) (getter rater.DataStorage, err error) {
@@ -218,7 +219,7 @@ func configureDatabase(db_type, host, port, name, user, pass string) (getter rat
db_nb, err = strconv.Atoi(name)
if err != nil {
rater.Logger.Crit("Redis db name must be an integer!")
exitChan <- true
return nil, err
}
if port != "" {
host += ":" + port
@@ -231,14 +232,14 @@ func configureDatabase(db_type, host, port, name, user, pass string) (getter rat
default:
err = errors.New("unknown db")
rater.Logger.Crit("Unknown db type, exiting!")
exitChan <- true
return nil, err
}
if err != nil {
rater.Logger.Crit(fmt.Sprintf("Could not connect to db: %v, exiting!", err))
exitChan <- true
return nil, err
}
return
return getter, nil
}
func main() {
@@ -255,7 +256,11 @@ func main() {
return
}
// some consitency checks
go checkConfigSanity()
errCfg := checkConfigSanity()
if errCfg != nil {
rater.Logger.Crit( errCfg.Error() )
return
}
var getter, loggerDb rater.DataStorage
getter, err = configureDatabase(cfg.DataDBType, cfg.DataDBHost, cfg.DataDBPort, cfg.DataDBName, cfg.DataDBUser, cfg.DataDBPass)
@@ -269,10 +274,10 @@ func main() {
loggerDb = getter
} else {
loggerDb, err = configureDatabase(cfg.LogDBType, cfg.LogDBHost, cfg.LogDBPort, cfg.LogDBName, cfg.LogDBUser, cfg.LogDBPass)
}
if err != nil { // Cannot configure logger database, show stopper
rater.Logger.Crit(fmt.Sprintf("Could not configure logger database: %s exiting!", err))
return
if err != nil { // Cannot configure logger database, show stopper
rater.Logger.Crit(fmt.Sprintf("Could not configure logger database: %s exiting!", err))
return
}
}
defer loggerDb.Close()
rater.SetStorageLogger(loggerDb)
@@ -283,6 +288,7 @@ func main() {
}
}
// Async starts here
if cfg.RaterEnabled && cfg.RaterBalancer != DISABLED && !cfg.BalancerEnabled {
go registerToBalancer()
go stopRaterSingnalHandler()