LinuxForum.Fans
Тема

Проблема sql-счетчика

Автор: dobriivoin 19 сообщений 2371 просмотров
#283079

Система Ubuntu server 10.04 на которой имеется хотспот (контроллер доступа chillispot+freeradius+msql БД) Все отлично работает. Кроме счетчика лимитов для клиентов. Клиентам выделено 10ГБ трафика, но при достижении 4ГБ трафика клиенты получают сообщение" активация не удалась. вы израсходовали лимит времени и/или объема данных"

Фрирадиус выдает в логах: Auth: Invalid user (rlm_sqlcounter: Maximum never usage time reached): [xuctoc7/<CHAP-Password>] (from client hotspot port 1 cli 00-13-D3-3A-7C-50)

Как сделать так, чтоб фрирадиус отключал клиентов при достижении указанного трафика, а не ограничивался 4ГБ. Почему упорно только 4ГБ? Где можно снять эти ограничения. В мускуле не силен. Если можете подскажите!!!

#283083
dobriivoin написал:

Как сделать так, чтоб фрирадиус отключал клиентов при достижении указанного трафика, а не ограничивался 4ГБ. Почему упорно только 4ГБ? Где можно снять эти ограничения. В мускуле не силен. Если можете подскажите!!!

А в каких попугаях этот трафик хранится? Может просто тривиальное переполнение разрядности? Цифра 4Гб навевает именно эти мысли...

#283085

"Cruiser78" написал:
А в каких попугаях этот трафик хранится?
в байтах :-)
#283090

у вопрос не совсем про попугаев. А про тип поля в котором это значение хранится. А может и в коде где то режется. Ключевой момент: на каком то этапе идет работа как с четырехбайтовым значением

#283091

да в байтах

mysql> select sum(acctinputoctets)+sum(acctoutputoctets) from radacct where username='xuctoc7';
+--------------------------------------------+
| sum(acctinputoctets)+sum(acctoutputoctets) |
+--------------------------------------------+
| 4295594010 |
+--------------------------------------------+
1 row in set (0.00 sec)

как разрешить проблему переполнения разрядности????

#283092

возможно в counter.conf хранятся данные

#283095

Проверьте поля acctinputoctets, acctoutputoctet должны быть bigint. Еще надо доку глянуть - sum умеет ли работать с bigint.

#283097

Тип поля в котором хранится значение установленного трафика - varchar254

#283099

80
Это вот эти вот два поля имеют тип varchar ?

Жесть.
1. Если чар зачем 254... Это вообще супер анлим?
2. Как к этому типу применима sum? (я так ни когда не делал, попробую, но имхо бред какой то)

#283100

попробовал на тесте.. .ЭТО работает...... Я в шоке.

А вот как работает хз. На док копать. Могу только предположить. Происходит ошибка при автоматическом приведении типов. Например первый клиент скачал всего 10кб и залил 10кб. Преобразование считает что типа 8байтов вполне хватает и чешет все остальное под одну гребенку. Попробуйте сделать насильное приведение типов

text
 select sum(cast(acctinputoctets as bigint))+sum(cast(acctoutputoctets as bigint)) from radacct where username='xuctoc7';
#283102
"dobriivoin" написал:
   4295594010 |

В прочем здесь уже за 4 байта вылезло.....

#283114

Логин Пароль Тарифный пакет Времени прошло: Времени осталось: Трафика израсходовано: Трафика осталось: Инкассирован? Еще годен? Действия
veclic12 nipgucod student 2930 --- 4096 6143 Нет Годен
rikvok6 nitdupak student 3888 --- 4096 6143 Нет Годен
wesxag6 pitkesun student 2151 --- 4096 6143 Нет Годен

Это данные из веб интерфейса у всех трафика израсходовано как на подбор 4096

#283117

4096 * 1024 * 1024 = 4 294 967 296 храниться в байтах. Т.е. операция идет обратная - деление с округлением. т.е. до округления 4 294 967 295 т.е. 0xFFFFFFFF. Переполнение типа однозначно. Судя по тому, что вы выше приводили пример результата 4295594010. Который не вписывается в 4 байта. Значит ошибка на стадии вычисления значения "Трафика израсходовано" при переводе из байтов в мегабайты. Там идет приведение к четырехбайтовому int.

#283256

вы правы voral! Для наглядности установил phpmyadmin. Тип поля трафика
был amount int(255). Изменил тип поля на bigint- проблема так и осталась. Что еще надо поменять??? Может длину значения, у меня она была 255.

#283349
text
ALTER TABLE  `yourtable` CHANGE  `amount`  `amount` BIGINT

если нужны дефолтное значение как всегда

text
ALTER TABLE  `yourtable` CHANGE  `amount`  `amount` BIGINT NOT NULL DEFAULT 0
#283350
"dobriivoin" написал:
Изменил тип поля на bigint- проблема так и осталась. Что еще надо поменять??? Может длину значения, у меня она была 255.

упс.. не дочитал :) ЩАс проверю

После замены на bigint. В SQL консоли руками сами попробовали запросом сложить? Там тоже обрезается?

PS Версий мускуля какая?

#283438
voral написал:

После замены на bigint. В SQL консоли руками сами попробовали запросом сложить? Там тоже обрезается?

А может стоит хранить траффик не в байтах а в килобайтах? Или в сотнях килобайт? И манипулировать в расчетах-сравнениях именно этим попугаем?

#283530

В SQL консоли руками сами попробовали запросом сложить? Там тоже обрезается? Я не совсем знаю как это сделать! Если подскажите буду вам благодарен. Версия мускула
| 5.1.63-0ubuntu0.10.04.1

#283557

[console]
$mysql -D <database_name> -u <username> -p -e "select sum(acount) from <table_name>"
Enter password:
[/console]

Войдите или зарегистрируйтесь, чтобы ответить.