Добрый день

Наткнулся на следующую неприятность, при большом размере
дискового 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:

Дати відповідь електронним листом