Одноклассники corporate blog
Java
Comments 16
+4
Oops. Тут должна была быть надпись «Класс!», подкреплённая unicode-символом с вытянутым вверх большим пальцем. Но что-то пошло не так :)
+2
Как теперь с этим знанием жить, вот в чем вопрос?
0
Вообще, это позор для Гуавы — не прогонять код перед релизом через статические анализаторы.

Наверняка, FindBugs нашел бы эту ошибку влёт.

Или я не прав? Не найдет? Или умрет в False Positives?
+4
Проверил — не находит. Вот, вызов Thread.start() из статического инициализатора FindBugs считает ошибкой, а просто создание дочернего объекта — нет.

Все ошибаются, ничего позорного в этом нет. Коллегам из Google, на самом деле, респект, что отнеслись с пониманием и оперативно исправили.
+1
да, наверное жестковато я.

Знаешь, это даже не конкретно к гуглу претензия, а к… к состоянию дел, что ли. Миллионы людей используют гуаву и другие библиотеки — а там такое. Иногда я сижу и не понимаю, как все это вообще не разваливается к чертовой матери…
+2
Поймать этот баг в продакшне ещё постараться надо. Опять же, нам «повезло» лишь благодаря высоким нагрузкам: сервер только поднимается, а на него сразу тысяча одновременных запросов прилетает с участием разных классов: RegularImmutableList, SingletonImmutableList и т.д., и все они начинают конкурентно инициализироваться. Много ли где такое встречается?
0
С одной стороны, да. Больше ворклоады и все такое. С другой стороны, иногда становится реально страшно. Особенно когда думаешь, сколько там еще не пойманных подобных багов.
+3
Реально страшно за что?
Ну да, бывают баги в любом коде, в любых либах. Мы ж на этом не самолеты запускаем с реакторами, а лишь в интернете чатики, да картинки показываем.
0
ну много финансового софта написано, вдруг что нибудь подобное вылезет во время тока как кто нибудь все свои сбережения переводит и сколько потом банк будет расследовать сбой этой транзакции и возвращать бабки )
0
В банках используются transactional rdbms(обычно Oracle)
И если у вас случился адский deadlock, то и не случится commit для вашей transaction.

apangin
у меня возник вопрос, т.е. при первом обращении к ImmutableList в теории мы должны получить deadlock, но к примеру у нас в приложении ни разу такой ситуации вроде как не было. Андрей, опиши примерно case, который случился у вас в production, потому что пример в guava issue tracker уж больно нереален на мой взгляд.
0
Так я писал: сразу после запуска сервера, когда он входит в кластер, на него прилетает несколько тысяч запросов, содержащих разные дочерние классы ImmutableList. Во время десериализации запросов происходит инициализация классов (поскольку до этого они не использовались). Дедлок происходит, когда несколько разных классов из одной иерархии начинают одновременно инициализироваться. Одного обращения к ImmutableList недостаточно.
+1
Загляни в исходники netbeans profiler и jvisualvm. После этого вообще плакать хочется)
0
Таки я пропустил этот пост. Очень круто, спасибо! Стоит добавить диагностику в FindBugs на вызов parallel из clinit? :-)
+1
Да, возможно. Только там куча вариантов, все запаришься перечислять: Stream.parallel(), Collection.parallelStream(), Arrays.parallelSort(), Arrays.parallelSetAll() и т.д.
Only those users with full accounts are able to leave comments., please.