Comment to task #5647 in hc-cron: hc-cron czasami odpala dwukrotnie zadania

Flyspray - The bug killer! btsadmin at pld-linux.org
Fri May 27 14:47:15 CEST 2005


Project: PLD 2.x (Ac)
  
  Package: hc-cron
  Summary: hc-cron czasami odpala dwukrotnie zadania
  Commented by: Marcin Kaminski (maxiu)
  Comment: Z analizy kodu hc-crona w wesji stable, development oraz z
vixie-cron wynika że wszystkie opierają się w czekaniu na tym samym
kodzie. Kodzie wg mnie nieprawidłowym, bo sleep() zaokrągla czas i
może podać w wyniku mniejszy czas niż faktyczny, a te crony
zakładają że poda czas równy lub większy. Wystarczy że chociaż
raz zadanie skończy się w drugiej połowie sekundy sleepa i sleep
zostanie przerwany sygnałem, i przy najbliższym obudzeniu crona
wykona on zadania podwójnie (raz za wcześnie i raz o czasie).
Dziwi mnie że ten błąd nie został nigdzie znaleziony czy
przedyskutowany. Nie mogę niestety znaleźć znaleźć dokładnej
specyfikacji POSIXowego sleepa, ale zakładam że działa prawidłowo
(sprawdzałem zachowanie na PLD, fedorze i SuSe, wszędzie tak samo,
test załączony na końcu).
Niestety hc-cron zakończył development w 2002 roku.
Błąd nie występuje gdy nie jest ustawione makro USE_SIGCHLD, w
przypadku linuksa jest.
Prosiłbym o sprawdzenie u siebie czy występują czasem zduplikowane
zadania, najprościej tak:
egrep :5.- /var/log/cron                
Sprawdza to czy były uruchamiane zadania w ostatnich 10 sekundach
minuty, normalnie nie powinny.

Program testujący sleepa:
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>
#include <signal.h>
void handler(int sig) {
 int i = 0;
 i++; // DUMMY
}
int main(int argc, char **argv) {
 time_t t;
 struct timeval tv;
 signal(SIGCHLD, handler);
 time(&t);
 while(time(NULL) == t);
 if(!fork()) {
  usleep(100000);
  exit(0);
 }
 printf("nnAfter ~100ms: %dnn", sleep(10));
 fflush(stdout);
 time(&t);
 while(time(NULL) == t);
 if(!fork()) {
  usleep(600000);
  exit(0);
 }
 printf("nnAfter ~500ms: %dnn", sleep(10));
 fflush(stdout);
 return 0;
}

Wynik u mnie:


After ~100ms: 10



After ~500ms: 9



W przypadku sleepa który nie zaokrągla wyników byłoby to 10 i 10.

For more further see:
http://bugs.pld-linux.org/index.php?do=details&id=5647&area=comments#tabs}

------------------------------------------------------------------------
THIS IS AN AUTOMATICALLY GENERATED MESSAGE, DO NOT REPLY




More information about the pld-bugs mailing list