DB Value Lookup Issue
Gabriel Marais
gabriel.j.marais at gmail.com
Mon Jun 15 13:05:15 CEST 2020
Hi Alan
Thanks for the feedback.
We tried all the suggestions below but unfortunately still receive a 0
value when the number is larger than 4 294 967 296.
We edited our query to cast values as a 64 bit integer. Also edited
the dictionary to make Acct-Diff a interger64.
Acct-Diff = "%{sql:SELECT greatest(0, ('%{Acct-Input-Octets}' +
'%{Acct-Output-Octets}') - (CAST(acctinputoctets AS SIGNED) +
CAST(acctoutputoctets AS SIGNED))) as diff from radacct where
acctsessionid = '%{Acct-Session-Id}'}"
We also tried a UNSIGNED value
Acct-Diff = "%{sql:SELECT greatest(0, ('%{Acct-Input-Octets}' +
'%{Acct-Output-Octets}') - (CAST(acctinputoctets AS UNSIGNED) +
CAST(acctoutputoctets AS UNSIGNED))) as diff from radacct where
acctsessionid = '%{Acct-Session-Id}'}"
The values in our SQL db are bigint.
Still unsure why we're getting a 0 :(
On Wed, Jun 10, 2020 at 10:59 PM Alan DeKok <aland at deployingradius.com> wrote:
>
> On Jun 10, 2020, at 3:22 PM, Gabriel Marais <gabriel.j.marais at gmail.com> wrote,
> >
> >
> > I am currently trying to resolve an issue with calculating the
> > difference between the value of acctinputoctets and acctoutputoctets
> > from a MySQL lookup and the latest interim update received from the
> > carrier.
> >
> > My calculation is currently in the preacct section which looks like this:-
> >
> > preacct {
> > preprocess
> > if("%{sql:SELECT count(*) from radacct where
> > acctsessionid = '%{Acct-Session-Id}'}" >= 1) {
> >
> > update request {
> >
> > Acct-Diff = "%{sql:SELECT greatest(0, ('%{Acct-Input-Octets}'
> > + '%{Acct-Output-Octets}') - (acctinputoctets + acctoutputoctets)) as
> > diff from radacct where acctsessionid = '%{Acct-Session-Id}'}"
>
> You're doing the math in an SQL statement which is fine, but it's likely to use 32-bit integers by default.
>
> > The query works fine, until the values from the radacct table
> > (acctinputoctets + acctoutputoctets) are greater than 4 294 967 296
> > for the particular acctsessionid. When the value is larger than that
> > we get 0. Under that we get the actual difference.
>
> Yes. The solution is to ensure that the integers are cast to 64 bits when doing the math. You'll have to check your SQL documentation to see how to do that.
>
> > I changed the dictionary entry for Acct-Diff from Integer to String.
> > The calculation works again until the number is greater than
> > 4294967296.
>
> Then the 4B limit is due to SQL. If you want Acct-Diff to *also* store more than 4G of counters, make it a "integer64" data type. That's 64 bits, and should be more than large enough.
>
> Alan DeKok.
>
>
> -
> List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html
More information about the Freeradius-Users
mailing list