From ed29e928353669ffde4361705d8eb74224f28ba9 Mon Sep 17 00:00:00 2001 From: TeoV Date: Tue, 24 Sep 2019 13:34:39 +0300 Subject: [PATCH] Add max_increments option in config in rals section --- config/config_defaults.go | 1 + config/config_json_test.go | 1 + config/config_test.go | 3 +++ config/libconfig_json.go | 1 + config/ralscfg.go | 4 ++++ data/conf/samples/httpagent/cgrates.json | 1 + data/conf/samples/httpagenttls/cgrates.json | 1 + data/conf/samples/tutmongo/cgrates.json | 1 + engine/timespans.go | 6 ++++++ utils/errors.go | 1 + 10 files changed, 20 insertions(+) diff --git a/config/config_defaults.go b/config/config_defaults.go index 89a646421..a73d2ffe2 100755 --- a/config/config_defaults.go +++ b/config/config_defaults.go @@ -175,6 +175,7 @@ const CGRATES_CFG_JSON = ` "*data": "107374182400", "*sms": "10000" }, + "max_increments": 1000000, "balance_rating_subject":{ // default rating subject in case that balance rating subject is empty "*any": "*zero1ns", "*voice": "*zero1s", diff --git a/config/config_json_test.go b/config/config_json_test.go index b00e11b71..40ebaef76 100755 --- a/config/config_json_test.go +++ b/config/config_json_test.go @@ -238,6 +238,7 @@ func TestDfRalsJsonCfg(t *testing.T) { utils.VOICE: "72h", utils.DATA: "107374182400", utils.SMS: "10000"}, + Max_increments: utils.IntPointer(1000000), Balance_rating_subject: &map[string]string{ utils.ANY: "*zero1ns", utils.VOICE: "*zero1s", diff --git a/config/config_test.go b/config/config_test.go index ecde14170..f23b6c424 100755 --- a/config/config_test.go +++ b/config/config_test.go @@ -473,6 +473,9 @@ func TestCgrCfgJSONDefaultsRALs(t *testing.T) { if !reflect.DeepEqual(eMaxCU, cgrCfg.RalsCfg().RALsMaxComputedUsage) { t.Errorf("Expecting: %+v , received: %+v", eMaxCU, cgrCfg.RalsCfg().RALsMaxComputedUsage) } + if cgrCfg.RalsCfg().RALsMaxIncrements != int(1000000) { + t.Errorf("Expecting: 1000000 , received: %+v", cgrCfg.RalsCfg().RALsMaxIncrements) + } eBalRatingSbj := map[string]string{ utils.ANY: "*zero1ns", utils.VOICE: "*zero1s", diff --git a/config/libconfig_json.go b/config/libconfig_json.go index 8411f3268..6ad117278 100755 --- a/config/libconfig_json.go +++ b/config/libconfig_json.go @@ -105,6 +105,7 @@ type RalsJsonCfg struct { Rp_subject_prefix_matching *bool Remove_expired *bool Max_computed_usage *map[string]string + Max_increments *int Balance_rating_subject *map[string]string } diff --git a/config/ralscfg.go b/config/ralscfg.go index 27e94fed3..178994cc3 100644 --- a/config/ralscfg.go +++ b/config/ralscfg.go @@ -33,6 +33,7 @@ type RalsCfg struct { RemoveExpired bool RALsMaxComputedUsage map[string]time.Duration RALsBalanceRatingSubject map[string]string + RALsMaxIncrements int } //loadFromJsonCfg loads Rals config from JsonCfg @@ -70,6 +71,9 @@ func (ralsCfg *RalsCfg) loadFromJsonCfg(jsnRALsCfg *RalsJsonCfg) (err error) { } } } + if jsnRALsCfg.Max_increments != nil { + ralsCfg.RALsMaxIncrements = *jsnRALsCfg.Max_increments + } if jsnRALsCfg.Balance_rating_subject != nil { for k, v := range *jsnRALsCfg.Balance_rating_subject { ralsCfg.RALsBalanceRatingSubject[k] = v diff --git a/data/conf/samples/httpagent/cgrates.json b/data/conf/samples/httpagent/cgrates.json index e66403a92..b24995005 100644 --- a/data/conf/samples/httpagent/cgrates.json +++ b/data/conf/samples/httpagent/cgrates.json @@ -22,6 +22,7 @@ "rals": { "enabled": true, + "max_increments":3000000, }, diff --git a/data/conf/samples/httpagenttls/cgrates.json b/data/conf/samples/httpagenttls/cgrates.json index a8db893be..467c40387 100755 --- a/data/conf/samples/httpagenttls/cgrates.json +++ b/data/conf/samples/httpagenttls/cgrates.json @@ -33,6 +33,7 @@ "rals": { "enabled": true, + "max_increments":3000000, }, diff --git a/data/conf/samples/tutmongo/cgrates.json b/data/conf/samples/tutmongo/cgrates.json index eedf38330..491f0376b 100644 --- a/data/conf/samples/tutmongo/cgrates.json +++ b/data/conf/samples/tutmongo/cgrates.json @@ -34,6 +34,7 @@ "thresholds_conns": [ {"address": "*internal"} ], + "max_increments":3000000, }, diff --git a/engine/timespans.go b/engine/timespans.go index 5057f8e65..763f84768 100644 --- a/engine/timespans.go +++ b/engine/timespans.go @@ -19,9 +19,11 @@ along with this program. If not, see package engine import ( + "fmt" "reflect" "time" + "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/utils" ) @@ -461,6 +463,10 @@ func (ts *TimeSpan) createIncrementsSlice() { // because ts cost is rounded //incrementCost := rate / rateUnit.Seconds() * rateIncrement.Seconds() nbIncrements := int(ts.GetDuration() / rateIncrement) + if nbIncrements > config.CgrConfig().RalsCfg().RALsMaxIncrements { + utils.Logger.Warning(fmt.Sprintf("error: <%s with %+v>, when creating increments slice", utils.ErrMaxIncrementsExceeded, nbIncrements)) + return + } incrementCost := ts.CalculateCost() / float64(nbIncrements) incrementCost = utils.Round(incrementCost, globalRoundingDecimals, utils.ROUNDING_MIDDLE) for s := 0; s < nbIncrements; s++ { diff --git a/utils/errors.go b/utils/errors.go index a40546aca..cf293508c 100644 --- a/utils/errors.go +++ b/utils/errors.go @@ -79,6 +79,7 @@ var ( DispatcherErrorPrefix = "DISPATCHER_ERROR" ErrUnsupportedFormat = errors.New("UNSUPPORTED_FORMAT") ErrNoDatabaseConn = errors.New("NO_DATA_BASE_CONNECTION") + ErrMaxIncrementsExceeded = errors.New("MAX_INCREMENTS_EXCEEDED") ) // NewCGRError initialises a new CGRError