LINUX.ORG.RU
ФорумTalks

[billing] Феерический косяк

 


0

0

Вчера узнал, что порядка 1-2 недели назад у местного крупного прова СибирьТелекома бОльшую часть абонентов их биллинг посчитал дважды и дважды списал у каждого со счета деньги. Было много ругани, скандалов, трупов, катаклизмов, бла-бла-бла.
Вчера с самого утра у меня в конторе UTM5 проделала то же (тогда про СибирьТелеком я еще был не в курсе). Написал разрабам - те, как партизаны.
В срочном порядке приходится переделывать просто кучу работы, ибо бОльшая часть клиентов просто залочеными (у некоторых в месяц нехреновые суммы набегают).
Сейчас буквально узнаю, что проблема у тучи контор. Связана с тем, что биллинги неправильно посчитали октябрьский переход с летнего времени на нормальное и оп! - по 2 раза как-то там всем насчитали расход.

На оф.форуме разрабы до сих пор молчат.
Это что, болезнь такая?

★★

>Это что, болезнь такая?

нет, это сраная проприетарщина. Вам надо срочно показаться Столлману :)

k0l0b0k ★★
()

Ну, надеюсь, до 5 числа они успеют исправить баг. Не хочу бегать за новыми квитанциями...

А в прошлом году такого не было?

wyldrodney
()

Да, криворукость.

Deleted
()
Ответ на: комментарий от lexxus-lex

последнее воскресенье октября обычно было.

k0l0b0k ★★
()
Ответ на: комментарий от Relan

>Ага, в открытых программах багов не бывает.

баги бывают везде. но не раз сталкивался с тем что авторы проприетарного софта намного болезненнее реагируют на баги:

>На оф.форуме разрабы до сих пор молчат.

k0l0b0k ★★
()

> Это что, болезнь такая?

Кстати о птичках. Я вчера реализовывал пересчет времени в человеческом формате в Unix time. Нарвался на очень странное поведение mktime(), похожее на баг. Для некоторых дат она накидывает лишний час. glibc 2.10.1. У вас биллинг на Линуксе?

Relan ★★★★★
()
Ответ на: комментарий от k0l0b0k

> баги бывают везде. но не раз сталкивался с тем что авторы проприетарного софта намного болезненнее реагируют на баги

Почему-то вспомнился Ульрих Дреппер. :)

Relan ★★★★★
()
Ответ на: комментарий от wyldrodney

В том-то и дело, что в прошлом году и пазапрошлом такого, само собой, не было. Иначе я, хотя бы, мог бы угадать проблему

vitroot ★★
() автор топика

БУ-го-го! Ну эт говорит о том, что если собрался провайдерить, то не лепи лисапет, а покупай решение целиком. Тогда и предъявы будет кому выставлять.

Да и ваще - помагабайтная тарификация - прошлый век, УГ, ископаемое Г мамонта и проч. проч. проч.

ужоснах.

Deleted
()
Ответ на: комментарий от Relan

>>Кстати о птичках. Я вчера реализовывал пересчет времени в человеческом формате в Unix time. Нарвался на очень странное поведение mktime(), похожее на баг. Для некоторых дат она накидывает лишний час. glibc 2.10.1. У вас биллинг на Линуксе?

именно. Только там Debian и я не очень помню, как в нем посмотреть версию установленной glibc

vitroot ★★
() автор топика

Биллинг abills такой же фигней страдает

Turbid ★★★★★
()
Ответ на: комментарий от Deleted

>>Да и ваще - помагабайтная тарификация - прошлый век, УГ, ископаемое Г мамонта и проч. проч. проч.

не говори чушь. Об этом спорили долго и можно еще дольше спорить. Клиентов полно, которые сами выбирают тарификация. Да и причем здесь вообще безлим или небезлим?? Абонентская плата за безлим берется. Она тоже посчиталась 2 раза, так что "лучше молчать и слыть за идиота, чем заговорить и развеять все сомнения" (с)

>>Ну эт говорит о том, что если собрался провайдерить, то не лепи лисапет, а покупай решение целиком. Тогда и предъявы будет кому выставлять.


Это ты к чему? И так есть, кому выставлять. Биллинг сертифицированный.

vitroot ★★
() автор топика
Ответ на: комментарий от vitroot

>Это ты к чему? И так есть, кому выставлять. Биллинг сертифицированный. vitroot ** (*) (02.10.2009 10:13:47)

Уже посмотрел на сертификаты. Значит надо трясти разрабов звонками в службу поддержки. А то получается косяк наисквернейший, но клиенты ищут решение на ЛОРе... :-)

Deleted
()
Ответ на: комментарий от Deleted

Какие-то странные ты вывод сегодня делаешь. Решения на ЛОРе никто не ищет. Я уж точно. Я это запостил не для этого, а для тех, у кого подобная проблема и они не могут до сих пор понять, с какого гейтса у них такое произошло

vitroot ★★
() автор топика
Ответ на: комментарий от wyldrodney

>Прости, а разве нет опенсорсных биллингов?

Более или менее живой один - abills, но и он со множеством недостатков.

Turbid ★★★★★
()
Ответ на: комментарий от vitroot

Только там Debian и я не очень помню, как в нем посмотреть версию установленной glibc

apt-cache show libc6

Вот пример демонстрирующий проблему с mktime(). Он выводит 3 даты, по идее все они должны быть одинаковыми. Однако 1 апреля 1981 года случается что-то странное. Более поздние даты не смотрел. У кого есть возможность, запустите этот пример и напишите результат с указанием версии glibc.

#define _XOPEN_SOURCE
#include <time.h>
#include <stdio.h>
#include <string.h>

int mktime_test(const char* str)
{
	struct tm local_tm, local_tm2;
	time_t local_time;
	char buffer[128];

	puts(str);
	if (strptime(str, "%Y-%m-%d %H:%M:%S", &local_tm) == NULL)
	{
		fprintf(stderr, "failed to convert `%s' to struct tm\n", str);
		return 1;
	}
	snprintf(buffer, sizeof(buffer), "%d-%02d-%02d %02d:%02d:%02d",
			local_tm.tm_year + 1900, local_tm.tm_mon + 1, local_tm.tm_mday,
			local_tm.tm_hour, local_tm.tm_min, local_tm.tm_sec);
	puts(buffer);
	if (strcmp(str, buffer) != 0)
	{
		fprintf(stderr, "strptime() failed\n");
		return 1;
	}
	local_time = mktime(&local_tm);
	localtime_r(&local_time, &local_tm2);
	snprintf(buffer, sizeof(buffer), "%d-%02d-%02d %02d:%02d:%02d",
			local_tm2.tm_year + 1900, local_tm2.tm_mon + 1, local_tm2.tm_mday,
			local_tm2.tm_hour, local_tm2.tm_min, local_tm2.tm_sec);
	puts(buffer);
	if (strcmp(str, buffer) != 0)
	{
		fprintf(stderr, "mktime() or localtime_r() failed\n");
		return 1;
	}
	return 0;
}

int main()
{
	return mktime_test("1981-04-01 00:00:00");
}
Relan ★★★★★
()
Ответ на: комментарий от Relan

apt-cache show libc6

Version: 2.3.6.ds1-13etch7
Provides: glibc-2.3.6.ds1-1, glibc-2.3.6-2

vitroot ★★
() автор топика
Ответ на: комментарий от Relan

wyldrodney@desktop /tmp $ gcc -o 1 1.c
1.c: В функции ‘mktime_test’:
1.c:18: предупреждение: несовместимая неявная декларация внутренней функции ‘snprintf’
wyldrodney@desktop /tmp $ ./1
1981-04-01 00:00:00
1981-04-01 00:00:00
1981-03-31 23:00:00
mktime() or localtime_r() failed
wyldrodney@desktop /tmp $

gcc версия 4.3.3 (Gentoo 4.3.3-r2 . . . )

wyldrodney
()
Ответ на: комментарий от wyldrodney

Забавно. У меня наоборот — на час вперед убегает:

1981-04-01 00:00:00
1981-04-01 00:00:00
1981-04-01 01:00:00
mktime() or localtime_r() failed

Кто код смотрел, ваше мнение?

Relan ★★★★★
()
Ответ на: комментарий от Relan

[code]
Version: 2.9-27
[/code]

[code]
1981-04-01 00:00:00
1981-04-01 00:00:00
1981-04-01 01:00:00
[/code]

run4way
()
Ответ на: комментарий от wyldrodney

Стоит списаться с разработчиками, возможно, это и баг. Быстрее напишешь - быстрее решишь проблему)

Да я вот сижу и думаю, то ли я дурак неправильно функцию использую, то ли действительно баг. :( Потому и хотелось бы чтобы кто-нибудь высказал свое мнение про код.

А вот так еще интереснее:

#define _XOPEN_SOURCE
#include <time.h>
#define __USE_UNIX98
#include <stdio.h>
#include <string.h>

int mktime_test(const char* str)
{
	struct tm local_tm, local_tm2;
	time_t local_time;
	char buffer[128];

	memset(buffer, 0, sizeof(buffer));
	puts(str);
	if (strptime(str, "%Y-%m-%d %H:%M:%S", &local_tm) == NULL)
	{
		fprintf(stderr, "failed to convert `%s' to struct tm\n", str);
		return 1;
	}
	snprintf(buffer, sizeof(buffer), "%d-%02d-%02d %02d:%02d:%02d",
			local_tm.tm_year + 1900, local_tm.tm_mon + 1, local_tm.tm_mday,
			local_tm.tm_hour, local_tm.tm_min, local_tm.tm_sec);
	puts(buffer);
	if (strcmp(str, buffer) != 0)
	{
		fprintf(stderr, "strptime() failed\n");
		return 1;
	}
	local_time = mktime(&local_tm);
	localtime_r(&local_time, &local_tm2);
	snprintf(buffer, sizeof(buffer), "%d-%02d-%02d %02d:%02d:%02d",
			local_tm2.tm_year + 1900, local_tm2.tm_mon + 1, local_tm2.tm_mday,
			local_tm2.tm_hour, local_tm2.tm_min, local_tm2.tm_sec);
	puts(buffer);
	if (strcmp(str, buffer) != 0)
	{
		fprintf(stderr, "mktime() or localtime_r() failed\n");
		return 1;
	}
	return 0;
}

int main()
{
	mktime_test("1981-07-01 00:00:00");
	mktime_test("1981-07-01 00:00:00");
	return 0;
}

Первый раз mktime() выдает неправильный результат, а второй раз — правильный.

Relan ★★★★★
()
Ответ на: комментарий от Relan

1981-04-01 00:00:00
1981-04-01 00:00:00
1981-04-01 01:00:00
mktime() or localtime_r() failed
k0l0b0k@kwork:/tmp$ apt-cache show libc6 | grep -i ver
Version: 2.9-26

k0l0b0k ★★
()
Ответ на: комментарий от Relan

у меня glibc-2.3.2-27.9.7 =)

выдало вот такое:

1981-07-01 00:00:00
1981-07-01 00:00:00
1981-07-01 00:00:00
1981-07-01 00:00:00
1981-07-01 00:00:00
1981-07-01 00:00:00

WerNA ★★★★★
()
Ответ на: комментарий от WerNA

Опа, а на glibc 2.3.2 (Red Hat 9?) всё нормально. Вот он, истинный stable. :)

Relan ★★★★★
()
Ответ на: комментарий от vitroot

>на сертификацию не только деньги нужны

Фирма-производитель? Ваш, уже зарегистрированный, ЛУГ этим не может заняться?..

wyldrodney
()
Ответ на: комментарий от Relan

fenrirko ~ # ./time
1981-07-01 00:00:00
1981-07-01 00:00:00
1981-07-01 00:00:00
1981-07-01 00:00:00
1981-07-01 00:00:00
1981-07-01 00:00:00

Latest version installed: 2.9_p20081201-r2


[iSage@exia ~]$ ./time
1981-07-01 00:00:00
1981-07-01 00:00:00
1981-07-01 00:00:00
1981-07-01 00:00:00
1981-07-01 00:00:00
1981-07-01 00:00:00

Name : glibc
Arch : x86_64
Version : 2.10.1


iSage ★★★★
()
Ответ на: комментарий от wyldrodney

>Фирма-производитель? Ваш, уже зарегистрированный, ЛУГ этим не может заняться?..

сертифицировать можно только одну конкретную версию, стоит наложить на нее какой-нибудь один патч и все, она уже не сертифицирована

HighwayStar ★★★★★
()
Ответ на: комментарий от wyldrodney

пока нет. И без этого проектов и планов слишком много

vitroot ★★
() автор топика
Ответ на: комментарий от Relan

Да я вот сижу и думаю, то ли я дурак неправильно функцию использую, то ли действительно баг. :( Потому и хотелось бы чтобы кто-нибудь высказал свое мнение про код.

Что-то странное...

$ ./test 
1981-07-01 00:00:00
1981-07-01 00:00:00
1981-07-01 01:00:00
mktime() or localtime_r() failed
1981-07-01 00:00:00
1981-07-01 00:00:00
1981-07-01 00:00:00

$ cmp /etc/localtime /usr/share/zoneinfo/Asia/Yekaterinburg && echo Совпадает
Совпадает

$ sudo mv /etc/localtime /etc/localtime.b

$ ./test 
1981-07-01 00:00:00
1981-07-01 00:00:00
1981-07-01 00:00:00
1981-07-01 00:00:00
1981-07-01 00:00:00
1981-07-01 00:00:00

Fedora 11 amd64 со всеми свежими обновлениями, glibc 2.10.1, gcc 4.4.1.

Deleted
()
Ответ на: комментарий от iSage

> первый - гента х86_64 > второй - федора11 х86_64

Любопытно. У меня тоже Федора 11 х86_64, но пример работает неправильно. С какими опциями вы его компилировали? Какая версия ядра и компилятора?

Relan ★★★★★
()
Ответ на: комментарий от Relan
Любопытно. У меня тоже Федора 11 х86_64, но пример работает неправильно. С какими опциями вы его компилировали? Какая версия ядра и компилятора? 

Похоже поведение зависит от настроек часового пояса (см. выше).

Deleted
()
Ответ на: комментарий от Deleted

Да, после удаления /etc/localtime у меня тоже пример заработал. видимо проблема в конвертации между временными поясами. Осталось понять, почему она есть 1 июля 1981 года и отсутствует, к примеру, для 1 июля 1980 года.

Relan ★★★★★
()
Ответ на: комментарий от Deleted

> Похоже поведение зависит от настроек часового пояса (см. выше).

У вас какой часовой пояс? У меня Москва и летнее время:

$ date '+%Z %:z'
MSD +04:00

Relan ★★★★★
()
Ответ на: комментарий от Relan

У вас какой часовой пояс? У меня Москва и летнее время:

Я выше написал: Asia/Yekaterinburg.

$ date '+%Z %:z'
YEKST +06:00

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.