Добрый день
Наткнулся на следующую неприятность, при большом размере дискового cache выделенного для oops (в моем случае это 140G) некорестно отрабатывает кострукции (total_free*100)/total_blks в clean_disk.c.
int total_free=35888054 35888054*100=3588805400 это больше int ( 2147483647) И то что мы делим на total_blks уже роли не играет так кам мы уже переполнили int.
Все бы ничего, если бы такая конструкция использовалась только в выводе, но она же используется и для определения не пора ли удалять старые обьекты и как результат только положненные обьекты в storage тут же удаляются expire.
Пачт прилагается. Хотя возможно нужно просто перевести всех их
к uint64 и забыть. Но это уже решать автору, как с его точки зрения правильно.
FreeBSD 5.2.1-RELEASE, oops последний cvs.
# ./oops -V
oops version 1.5.23
CC=cc
CFLAGS=-O2 -pipe -mcpu=pentiumpro -fPIC -D_REENTRANT -DFREEBSD -D_THREAD_SAFE -DFD_SETSIZE=2048 -I. -DWITH_LARGE_FILES -I/usr/local/include -I/usr/local/include/db4 -export-dynamic
LIBS=-lc_r -lfl -lfl -lpam -lcrypt /usr/local/lib/libpcreposix.a /usr/local/lib/libpcre.a -L/usr/local/lib -ldb4
-- 20, Karl Marx Avenue, Phone: +7-3832-462484 Russia, Novosibirsk 630092 E-mail: [EMAIL PROTECTED]
--- src/clean_disk.c.orig Wed Dec 19 21:15:16 2001
+++ src/clean_disk.c Fri Aug 27 12:59:10 2004
@@ -182,7 +182,7 @@
{
if ( forced_cleanup )
return(1);
- if ( ( low_free > 0 ) && ((total_free*100)/total_blks < low_free) )
+ if ( ( low_free > 0 ) && ((total_free*100.)/total_blks < low_free) )
return(1);
if ( !low_free && ( total_free < 128 ) )
return(1);
@@ -192,7 +192,7 @@
static int
continue_cleanup(int total_blks, int total_free, int hi_free)
{
- if ( (hi_free > 0) && ((total_free*100)/total_blks < hi_free) )
+ if ( (hi_free > 0) && ((total_free*100.)/total_blks < hi_free) )
return(1);
if ( !hi_free && ( total_free < 512 ) )
return(1);
@@ -232,7 +232,7 @@
total_blks = count_total_blks();
LOCK_STATISTICS(oops_stat);
if ( total_blks <= 0 ) oops_stat.storages_free = -1;
- else oops_stat.storages_free = (total_free*100)/total_blks;
+ else oops_stat.storages_free = (total_free*100.)/total_blks;
UNLOCK_STATISTICS(oops_stat);
if ( total_blks <= 0 ) {
UNLOCK_CONFIG;
@@ -307,8 +307,8 @@
UNLOCK_DB ;
forced_cleanup = FALSE;
} else {
- my_xlog(OOPS_LOG_STOR|OOPS_LOG_DBG, "clean_disk(): Skip cleanup: %d out of
%d (%d%%) free.\n",
- total_free, total_blks, (total_free*100)/total_blks);
+ my_xlog(OOPS_LOG_STOR|OOPS_LOG_DBG, "clean_disk(): Skip cleanup: %d out of
%d (%u%%) free.\n",
+ total_free, total_blks, (unsigned)(total_free*100.)/total_blks);
}
done:
