#perl #rt
#perl #rt
Вопрос:
У нас есть отслеживание запросов 4.4.3. Там у нас есть автоматизированный скрипт, который использует распределение Business:: Hours. Вот важная часть:
sub IsApplicable {
my $self = shift;
my $bhours = $self->BusinessHours;
my $ticket = $self->TicketObj;
my $due = $ticket->DueObj->Unix;
my $bseconds = $bhours->between( time(), $due );
}
Иногда мы получаем ошибку в stderr:
[23406] [Wed Mar 13 07:40:09 2019] [critical]: Set::IntSpan::_copy_run_list: Bad order 2: 1552462809-1552462694
at /usr/local/share/perl5/Business/Hours.pm line 269. (/opt/rt4/bin/../lib/RT.pm:408)
Set::IntSpan::_copy_run_list: Bad order 2: 1552462809-1552462694
at /usr/local/share/perl5/Business/Hours.pm line 269.
Кажется, это не имеет смысла, 1552462809-1552462694 в значительной степени оценивается в 115.
Как проанализировать / исправить эту ошибку?
Ответ №1:
Согласно документации Business:: Hours:
между НАЧАЛОМ, окончанием
Возвращает количество рабочих секунд между НАЧАЛОМ и ОКОНЧАНИЕМ, как НАЧАЛО, так и ОКОНЧАНИЕ должны быть указаны в секундах с момента начала эпохи.
Возвращает -1, если НАЧАЛО или окончание выходят за пределы расчетных рабочих часов.
Так что, вероятно, END должно быть больше, чем START
Комментарии:
1. -1 — это не ошибка, это -1. Но, возможно, вы правы относительно того, что END должно быть больше, чем START, но откуда нам знать наверняка?
2. Это числа, поэтому используйте операторы числового сравнения.
my $now = time(); return ... if $now >= $due; my $bseconds = $bhours->between( $now, $due ); ...
3. Приведенный текст на самом деле не объясняет, почему он не работает. В вашем последнем предложении есть. Точнее, Business::Hours использует Set::IntSpan для вычисления продолжительности периода, а Set::IntSpan хочет, чтобы начало было больше конца (см. в источнике Set::IntSpan, который в какой-то момент был вызван Business::Hours).
4. Хорошо, спасибо всем, заменил $ due и time(), потому что помимо ошибки скрипт не работал так, как нужно.