инверсия вне
Мне тут подумалось, что раз пока что всё равно 97% времени и мыслей занимает работа, напишу чего-нибудь про неё.
Прекрасная, блин непонятность тут всплыла:
Есть некий код (Java). В нём с периодичностью примерно раз в минуту вызывается некий метод. Метод мониторит расшаренную папку, и если место кончается - шлёт письма админам. В целом, код работает без нареканий. Но в последнее время метод стал примерно раз в сутки засылать ложное сообщение. То есть и место в папке есть и письмо уходит.
В целом выглядит код вот так:
По логам при этом может быть минутой ранее - всё_отлично, вот прям щас - всё_пропало_пишу_письмо, а через минуту уже всё_отлично_живём_дальше.
И ладно бы разница в размере места на харде была маленькая, так тут примерно 300Гб появляются и исчезают.
А до этого пробовала вариацию метода, где и в ифе, и в выводе в лог пользовалась не переменная, а file.getFreeSpace() напрямую. И перед ифом ещё был вывод в лог просто текста. Получалось примерно так: 300 < 10 = true по логам. Т.е. по факту я так понимаю, на момент проверки в ифе было 0, а при выводе в лог уже стало +300Гб, и судя по времени в логах, между ифом и выводом в лог тормозов не было. Т.е. вариант "getFreeSpace долго выполняется и за это время состояние успевает измениться" - тоже не вариант.
Вот. Пока идей чтобы это могло быть нет особо(( Может антивирусы какие или реально внезапно расшаренная папка становится недоступной... Только вот не особо понятно как это всё отлавливать..
Прекрасная, блин непонятность тут всплыла:
Есть некий код (Java). В нём с периодичностью примерно раз в минуту вызывается некий метод. Метод мониторит расшаренную папку, и если место кончается - шлёт письма админам. В целом, код работает без нареканий. Но в последнее время метод стал примерно раз в сутки засылать ложное сообщение. То есть и место в папке есть и письмо уходит.
В целом выглядит код вот так:
По логам при этом может быть минутой ранее - всё_отлично, вот прям щас - всё_пропало_пишу_письмо, а через минуту уже всё_отлично_живём_дальше.
И ладно бы разница в размере места на харде была маленькая, так тут примерно 300Гб появляются и исчезают.
А до этого пробовала вариацию метода, где и в ифе, и в выводе в лог пользовалась не переменная, а file.getFreeSpace() напрямую. И перед ифом ещё был вывод в лог просто текста. Получалось примерно так: 300 < 10 = true по логам. Т.е. по факту я так понимаю, на момент проверки в ифе было 0, а при выводе в лог уже стало +300Гб, и судя по времени в логах, между ифом и выводом в лог тормозов не было. Т.е. вариант "getFreeSpace долго выполняется и за это время состояние успевает измениться" - тоже не вариант.
Вот. Пока идей чтобы это могло быть нет особо(( Может антивирусы какие или реально внезапно расшаренная папка становится недоступной... Только вот не особо понятно как это всё отлавливать..
if (space < minDiskSize && space>0) должно пофиксить
Т.е. хочется именно гарантированный способ устранения косяка найти, а не обходные ситуации, типа не отсылать когда 0 или если ноль, то подождать и попробовать ещё раз.
Второй вариант - делать n замеров раз в секунду во время прохода и брать максимальное из них как верный результат.
Ну или искать корень проблемы, но я лично не вижу смысла в этом в подобной задаче
N замеров это как один из вариантов обхода проблемы.
Но мне вот именно что интересно корень всех зол найти. Во-первых заказчик спросит "а что было?" (отвечать-то не мне, а манагеру, но тем не менее, хочется какой-нибудь хороший ответ иметь, а не "сами не в курсе, но вот что-то намутили"), во-вторых недетерминированная проблема может где-нибудь ещё проявиться или через какое-то время тут же с новыми особенностями. И тогда тоже не хорошо получится.
Если найдёшь причину, отпишись тут, интересно )
1. Найти и убедиться в том что проблема не на стороне программы. Описать в чём суть проблемы админам заказчика, возможно согласовать с ними использование "хака" и объяснить в чем могут быть последствия (а-ля нет гарантии, что всегда так будет работать), или же вместо этого они починят неисправность со своей стороны. То есть если так происходит из-за микро-обрывов связи - то надо им об этом сообщить, а дальше пусть сами решают чинить они будут или нет.
2. Либо что хуже найти что бага в программе. И либо починить нормально, либо описать почему будет использоваться хак (например починка требует перехода на новую версию чего-нибудь, а заказчик категорически не может).
Если найдёшь причину, отпишись тут, интересно )
Ага, отпишусь)
http://stackoverflow.com/questions/5865735/how-to-get-free-space-of-unc-path-in-java-code
(Если кратко: UNC пути.)
https://bugs.openjdk.java.net/browse/JDK-7036346
http://www.tutorialspoint.com/java/io/file_getfreespace.htm (Тут меня заинтересовало, что проверяют существования файла после того, как узнали размер. Опечатка, или сокральный смысл?)
300Гб - это много, но учитывая, что у гипотетического процесса есть, по сути, две минуты (ок-мин-не_ок-мин-ок), если он локален и вызывается, скажем, по крону (раз в сутки, проблема не всегда была), гипотетически, при быстром диске есть шанс создать за это время кэш или своп из темпов и удалить, и если проверка синхронна с операцией удаления, то фокус про 300 < 10 = true при последовательном выполнении инструкций - возможен.
Отсюда вопрос: Ты точно уверена, что у них там не может что-то такое быть недавно настроено?
Контр-аргументы вида "фиг 300Гб так быстро запишутся даже локально", "с чего именно в эту папку", "да что это за процесс такой" и им подобные - понимаю, но просто для исключения заведомо "неожиданно бредовых ситуаций". Сталкивался с подобным.
void-dragon, я не уверена, но они говорили, что ничего не меняли) Т.е. да, такое тоже возможно, то что ты выше описал. Но диск этот (папка) теоретически отдан на работу импорта\экспорта, где файлы порциями приходят, обрабатываются, потом удаляются разными компонентами софта (по части из него я знаю только что он есть и с файлами взаимодействует).
void-dragon, Юрий Рэйн, Kakou ECTb, Я вот тут пока что корень проблемы не нашла, но прихожу к выводу, что мне не нравится реализация метода freeSpace =)
Написала тут небольшой тест, который имитирует рандомное подключение и отключение папки:
1. Первая программка монотонно создаёт и удаляет одну и ту же папку:
2. Вторая постоянно, но с рандомным слипом, мониторит ту же папку и пишет логи:
В логах видим в итоге все 4 возможных состояниячитать дальше
Вот такая вот фигня, в итоге вот эти 2 состояния шизокрылые:
freeSpace = {0}, isExists = {true}
freeSpace = {991182094336}, isExists = {false}
А в JDK 7 уже есть нормальное решение проблемы: тык. При таком же постоянном удалении\создании папки и рандомных проверках, если папки нет, вылетает exception . Что как-то однозначнее.
"Замечание: Результаты этой функции кэшируются. Более подробную информацию смотрите в разделе clearstatcache()."
Отсюда: http://php.net/manual/ru/function.file-exists.php
Соответственно, считать результат проверки этим методом в php "надежным" - нельзя.
Если в джаве похожий механизм, это бы объяснило "шизокрылые состояния".
Соответственно, "велосипеды" - наше все
Тогда получаются варианты:
1) использовать isFile()
2) добавлять Sleep
3) Пытаться открывать файл на чтение.