Ticket #45 (assigned defect)

Opened 3 years ago

Last modified 2 weeks ago

access.log больше 2Gb

Reported by: PavelVinogradov Owned by: PavelVinogradov
Priority: critical Milestone: sams-1.1.0
Component: demons Version: 1.0.5
Keywords: Cc:

Description (last modified by PavelVinogradov) (diff)

Когда размер файла access.log становится больше 2Gb - sams начинает вести себя неадекватно и перестает обсчитывать трафик. Есть подозрение что переполняется счетчик endvalue в БД.

Attachments

sams-1.0-long-log.patch Download (3.7 KB) - added by NStorm 2 years ago.
long access.log patch
sams-1.0-long-log-v2.patch Download (3.9 KB) - added by NStorm 2 years ago.
long access.log patch v2
sams-1.0-long-log-v3.patch Download (4.2 KB) - added by NStorm 2 years ago.
sams-1.0-freebsdfix.patch Download (17.1 KB) - added by NStorm 2 years ago.
FreeBSD fix for configure.in & logtool.c

Change History

  Changed 3 years ago by PavelVinogradov

  • description modified (diff)

follow-up: ↓ 3   Changed 2 years ago by mahoro_remove_this@…

Проблема вероятней всего в ФС ext2. Нужно убедиться, что на машине вообще можно создавать такие файлы и с ними можно нормально работать (без sams)

in reply to: ↑ 2   Changed 2 years ago by PavelVinogradov

Replying to mahoro_remove_this@nm.ru:

Проблема вероятней всего в ФС ext2. Нужно убедиться, что на машине вообще можно создавать такие файлы и с ними можно нормально работать (без sams)

Файлы более 2х гигабайт корректно создаются и работа с ними возможна.

  Changed 2 years ago by PavelVinogradov

  • milestone set to sams-1.2

in reply to: ↑ description   Changed 2 years ago by anonymous

Replying to PavelVinogradov:

Есть подозрение что переполняется счетчик endvalue в БД.

есть подозрение что в исходниках тоже придется поменять тип переменной например, с int на long или на long long

  Changed 2 years ago by NStorm

В базе для endvalue используюется bigint (-9223372036854775808-9223372036854775807). А вот в daemon.c singed long, откуда понятны глюки на 2Гб. Соотв. функции работы с файлами тоже используются с типом long (fseek). Там еще есть переменная ENDVALUE2, типа double. В неё копируется значение из ENDVALUE и вроде как дальше работа идет уже с ENDVALUE2. Однако функции работы с файлами все-равно принимают только 4х-байтовую (на i386) переменную в кач-ве аргумента.

Я не большой знаток C, но вроде чтобы работать с файлами больше 2Гб нужно использовать fseeko и подобные функции, со типами, подобными off_t. Вот:

On many architectures both off_t and long are 32-bit types, but compi- lation with

#define _FILE_OFFSET_BITS 64

will turn off_t into a 64-bit type.

Т.е. прийдется менять довольно-таки большую порцию кода для введения поддержки логов > 2Gb.

  Changed 2 years ago by NStorm

Пардон, файл demon.c

  Changed 2 years ago by NStorm

diff -ur sams-1.0/demon.c sams-1.0-patched/demon.c --- sams-1.0/demon.c 2007-10-22 00:27:54.000000000 +0400 +++ sams-1.0-patched/demon.c 2008-01-22 14:31:38.000000000 +0300 @@ -17,10 +17,11 @@

*/

#include "logtool.c"

+#include <inttypes.h>

int EMPTY;

-long ENDVALUE; -long NEWENDVALUE; +off_t ENDVALUE; +off_t NEWENDVALUE;

int RIPC; int ucount,rcount;

@@ -102,8 +103,8 @@

printf("Don't open file %s/%s\n",conf.logdir,conf.logfile); return(0);

}

- fseek(finp,0,SEEK_END); - value=ftell(finp); + fseeko(finp,0,SEEK_END); + value=ftello(finp);

fclose(finp); return(value);

}

@@ -145,7 +146,7 @@

int samsuser;

int userflag=0;

- double ENDVALUE2; + off_t ENDVALUE2;

sprintf(&path[0],"%s/%s",conf.logdir,conf.logfile); trim(&path[0]);

@@ -157,7 +158,7 @@

{

printf("open SQUID cache file: %s\n",&path[0]);

}

- fseek(finp,ENDVALUE,SEEK_SET); + fseeko(finp,ENDVALUE,SEEK_SET);

count=0; ENDVALUE2=ENDVALUE; while(ENDVALUE2<NEWENDVALUE)

@@ -168,7 +169,7 @@

{

if(DEBUG>0PRINT>0)

printf("input string: \n%s\n",&buf[0]);

- ENDVALUE2=ftell(finp); + ENDVALUE2=ftello(finp);

strcpy(&buf[0],"\0");

}

else

@@ -386,7 +387,7 @@

sprintf(&str[0],"UPDATE %s.cachesum SET size=size+'%s',hit=hit+'%lu' where date='%d-%d-%d'&&user='%s' && domain='%s'",conf.logdb,STR[4],hitsize,t->tm_year+1900,t->tm_mon+1,t->tm_mday,user,domain); flag=send_mysql_query(conn,&str[0]);

}

- ENDVALUE2=ftell(finp); + ENDVALUE2=ftello(finp);

SaveNewEndFileValue?(conn2, ENDVALUE2);

if(DEBUG>0)

@@ -397,7 +398,7 @@

}

}

- ENDVALUE2=ftell(finp); + ENDVALUE2=ftello(finp);

}

}

fclose(finp);

@@ -855,7 +856,7 @@

NEWENDVALUE=GetNewEndValue?();

if(DEBUG>0)

{

- printf("Reading file: start=%ld length=%ld\n",ENDVALUE,NEWENDVALUE); + printf("Reading file: start=%" PRId64 " length=% " PRId64 "\n",ENDVALUE,NEWENDVALUE);

}

sprintf(&real[0],"%4s",row[3]);

@@ -1109,7 +1110,7 @@

if(DEBUG==1)

{

- printf("end=%lu newend=%lu clear=%u loadfile=%u\n",ENDVALUE,NEWENDVALUE,CLEAR,LOADFILE); + printf("end=%" PRId64 " newend=%" PRId64 " clear=%u loadfile=%u\n",ENDVALUE,NEWENDVALUE,CLEAR,LOADFILE);

}

if(NEWENDVALUE>ENDVALUE&&CLEAR==0&&LOADFILE==0)

{

diff -ur sams-1.0/.deps/demon.P sams-1.0-patched/.deps/demon.P --- sams-1.0/.deps/demon.P 2007-12-14 12:45:50.000000000 +0300 +++ sams-1.0-patched/.deps/demon.P 2008-01-22 14:31:55.000000000 +0300 @@ -46,7 +46,7 @@

/usr/include/bits/syslog-path.h /usr/include/unistd.h \ /usr/include/bits/posix_opt.h /usr/include/bits/environments.h \ /usr/include/bits/confname.h /usr/include/getopt.h config.h define.h \

- tools.h + tools.h /usr/include/inttypes.h

demon.c : logtool.c : /usr/include/signal.h :

@@ -150,3 +150,4 @@

config.h : define.h : tools.h :

+/usr/include/inttypes.h : diff -ur sams-1.0/logtool.c sams-1.0-patched/logtool.c --- sams-1.0/logtool.c 2007-10-03 16:17:26.000000000 +0400 +++ sams-1.0-patched/logtool.c 2008-01-22 14:14:12.000000000 +0300 @@ -16,10 +16,14 @@

  • Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */

+#define _GNU_SOURCE 1 +#define _FILE_OFFSET_BITS 64 +

#include <signal.h> #include <string.h> #include <stdio.h> #include <stdlib.h>

+#include <features.h>

#include <netdb.h> #include <time.h> #include <ctype.h>

Changed 2 years ago by NStorm

long access.log patch

  Changed 2 years ago by NStorm

Случано сабмит нажал в прошлый раз :( Вобщем прикладываю патч, я его еще не проверял! Кто-нибудь может потестить?

  Changed 2 years ago by PavelVinogradov

  • status changed from new to assigned

Без исправлений патч не заработал, хотя лог sams -d изменился:

sudo sams -d [22:28]

Connected database: squidctrl:localhost user=sams Connected database: squidlog:localhost user=sams Starting process: pid = 14368 Cache 0 Reading file: start=0 length=-1633907399 disable user script = /usr/share/sams/src/script/none Administrator address: ISP Mb size=1048576, kb size=1024 Found 4 SAMS users

0: test workgroup 0.0.0.0.0.0./255.255.255.255.0.0. 1 4436 104857600 479c872e7add1 ncsa 1: test1 workgroup 0.0.0.0.0.0./255.255.255.255.0.0. 1 8306 104857600 479c8747473a2 ncsa 2: test2 workgroup 0.0.0.0.0.0./255.255.255.255.0.0. 1 6514 104857600 479c87805e03c ncsa 3: ad workgroup 0.0.0.0.0.0./255.255.255.255.0.0. 1 4458 104857600 479c87913ee9d ncsa

Found 4 localhosts sams 127.0.0.1 >> 127.0.0.1/255.255.255.255 jj.ru nixdev.net 2. SELECT count(*) FROM squidctrl.urlreplace end=0 newend=-1633907399 clear=0 loadfile=0 No new values...

Changed 2 years ago by NStorm

long access.log patch v2

  Changed 2 years ago by NStorm

Посмотрел. Нашел еще несколько мест, где требовалась правка. Выложил новый патч, опять-таки я его не проверял. Пробуйте :)

  Changed 2 years ago by NStorm

Такс... еще не все, патч пока еще не рабочий. Сейчас вобщем найду тестовую машинку и буду разбираться.

Changed 2 years ago by NStorm

  Changed 2 years ago by NStorm

end=2492061110 newend=2492061110 clear=0 loadfile=0

Вроде теперь работает, в базе корректное значение.

  Changed 2 years ago by PavelVinogradov

На Linux патч работает корректно. На FreeBSD есть проблемы со сборкой sams из-за отсутствия на машине features.h

Changed 2 years ago by NStorm

FreeBSD fix for configure.in & logtool.c

  Changed 2 years ago by NStorm

Добавил патч, патч накладывается поверх уже предыдущего. Проверил - на FreeBSD 6.3-STABLE компилится. Под линуксом компилится. Завтра проверю под линуксом на работоспособность как таковую после патча. На FreeBSD к сожалению у меня нет места столько чтобы проверить =)

  Changed 8 months ago by NStorm

Прошло уже больше года, а баг так и висит =/

  Changed 8 months ago by PavelVinogradov

  • version changed from devel to 1.0.5
  • milestone changed from sams-1.2.0 to sams-1.1.0

Она исправлена в версии 2.0

В рамках версии 1 мы никак не можем собраться и сделать релиз 1.1, т.к. в рамках верти 1.0.x такое изменение сделать нельзя.

  Changed 3 months ago by PavelVinogradov

  • milestone changed from sams-1.1.0 to sams-1.2.0

  Changed 2 months ago by PavelVinogradov

  • priority changed from major to critical
  • milestone changed from sams-1.2.0 to sams-1.1.0

  Changed 2 months ago by PavelVinogradov

В [759] для 1.1.x включено экспериментальное исправление проблемы 2х гиговых логов. К сожалению пока не протестировано.

  Changed 2 weeks ago by NStorm

Не увидел в [759] нужных изменений. В бранче 1.1.x вообще не было изменений с 758 до 759. Я не так смотрю или может ревизия другая? И какой вариант фикса? Свой или предложенный мною? Я его надо сказать еще ранее оттестил на Linux'e, на FreeBSD только компиляцию без ошибок проверил.

Add/Change #45 (access.log больше 2Gb)

Author


E-mail address and user name can be saved in the Preferences.


Action
as assigned
 
Note: See TracTickets for help on using tickets.