У нас были настроены и метрики а алёрты и балансировщики нагрузки, а в итоге получилась смешная и страшная ситуация:
Клиент присылает запрос на огромное количество данных.
Сервер падает с OutOfMemoryException, но пишет дамп на диск. Но увы не успевает записать логи из-за буферизации.
Клиент не получает ответ и отправляет запрос снова, который благодаря load balancer кладёт уже другой сервер.
Сервера по очереди поднимаются и регистрируются на load balancer, но клиент продолжает их класть один за другим. Каждый heap dump сжирает 64 гигабайта на диске.
В итоге выгрузили один из дампов памяти, нашли в нём плохой запрос, нашли клиента, попросили его так не делать - потому что других протоколов на тот момент не было.
Ну и как postmortem
Настроили приложение даже не пытаться обрабатывать запросы которые требуют аномально большого объёма памяти
Настроили параметры JVM чтобы дампы памяти писались в один и тот же файл и переписывали друг друга.
В сервисе что сейчас пишу - логи пишутся на отдельный раздел, и в худшем случае останемся без логов на какое-то время.
Имеются расчётные данные, что температура внутри пузырьков может достигать 1500 °C.
четыре тысячи градусов это как-то многовато, и немного бессмысленно если не указывать количество воды нагретой до такой температуры. Иначе можно сказать что нас периодически пронзают нейтрино высоких энергий с "температурой" аж 10^15 °C (что в 100_000_000_000 горячее чем лава)
Например, если брокер обанкротится, потеряет лицензию или будет испытывать финансовые сложности, его клиенты не пострадают – использовать активы клиентов запрещено на законодательном уровне.
Например, если вы напились и заснули на улице, у вас ничего не украдут - воровать запрещено на законодательном уровне.
И я думаю что "на работе" никому никогда не надо было понимать как работают регулярные выражения, и разницу между НКА и ДКА. И многие комментаторы из прошлой статьи на вопрос "как работает сборщик мусора регулярное выражение", обиделись бы и ушли со словами что на работе это не нужно. Но тут компании Cloudflare повезло, что в штате есть люди которые понимают стоимость выражений вида ...=. и считают что программисту полезно это знать.
Ну тогда не стоит удивляться что плохой код можно тестировать только с помощью костылей.
Идеальный вариант (если позволяет время и бюджет) сначала переписать этот код и покрыть тестами, затем добавить флаг и покрыть флаг тестами.
Я думаю что у каждого есть свой говнокод, который без костылей не протестировать. Применять ли тут паттерн «паблик морозов» я не знаю. Стоит ли рассказывать как тестировать говнокод с помощью костылей я тоже не знаю)
Есть мнение что плохой код сложно тестировать. В данном случае код плохой и он был плохим ДО добавления флага.
Почему есть метод Start() но нет метода Stop()? Зачем странно используемый lockObject?
Если всё это исправить(ну и многое другое) и сделать аккуратно и красиво то после 3) вызывается синхронный Stop() после которого проверяются все побочные эффекты
Он отбрасывается, но у него по-прежнему есть parent commit. На него теперь никто не ссылается, но он сам то указывает! И из reflog его всегда можно восстановить.
Отличная статья. Спасибо!
Как я понимаю, в картинке под фразой «Вот как будет выглядеть ваше дерево после soft reset и нового коммита» пропущена стрелочка от зеленого кружка к красному.
Видел несколько раз следующий код с ненужным промежуточным collect. Часто получается в процессе рефакторинга.
List<T> temp = collection.stream().filter(...).map(...).collect(Collectors.toList());
... some unrelated to "temp" stuff...
List<T> result = temp.stream().filter(...).map(...).collect(Collectors.toList());
Вместо
List<T> result = collection.stream().filter(...).map(...).filter(...).map(...).collect(Collectors.toList());
В свое время, когда надо было отлавливать много всяких событий мыши — mouseover, dragover и т.д., просто запускал свое приложение под отладчиком на виртуальной машине, и подключался к нему снаружи. Тогда было легко ходить по шагам и делать что угодно, при этом приложение думало что мышь не двигается.
Следует уточнить, что для индексов используются не то что понимается под B-tree, а B* или B+ -tree. В обычных B-tree информация может храниться в узлах дерева, а в B+ — только в листьях, что дает некоторый простор для оптимизаций.
А в чем проблема с SHA512? В случае с мытьем посуды — если я каким-то образом добыл NIST private key и умею менять SEED, то я просто перебираю SEED-ы пока не получится нужный мне результат(с вероятностью 50% он будет получаться на каждой итерации).
Если посуду выпало мыть мне — увеличиваем SEED на единицу и пропускаем через мясорубку. Если снова выпало мне — то продолжаем и.т.д.
Для этого необходимо и достаточно чтобы преподаватель информатики в школе заранее озаботился(лась) и позвал(а) кого-нибудь на этакий открытый урок. Не всем везет с «проактивными» учителями информатики.
Впрочем, никто не мешает Вам, прочитав методические пособия на сайте, рассказать все своему ребенку.
У нас были настроены и метрики а алёрты и балансировщики нагрузки, а в итоге получилась смешная и страшная ситуация:
Клиент присылает запрос на огромное количество данных.
Сервер падает с OutOfMemoryException, но пишет дамп на диск. Но увы не успевает записать логи из-за буферизации.
Клиент не получает ответ и отправляет запрос снова, который благодаря load balancer кладёт уже другой сервер.
Сервера по очереди поднимаются и регистрируются на load balancer, но клиент продолжает их класть один за другим. Каждый heap dump сжирает 64 гигабайта на диске.
В итоге выгрузили один из дампов памяти, нашли в нём плохой запрос, нашли клиента, попросили его так не делать - потому что других протоколов на тот момент не было.
Ну и как postmortem
Настроили приложение даже не пытаться обрабатывать запросы которые требуют аномально большого объёма памяти
Настроили параметры JVM чтобы дампы памяти писались в один и тот же файл и переписывали друг друга.
В сервисе что сейчас пишу - логи пишутся на отдельный раздел, и в худшем случае останемся без логов на какое-то время.
10м - это уже 2 атмосферы - одна "воздушная" плюс одна водная. Так что мне кажется что хватит и одного-двух метров
Ну хотя бы по калорийности, а не переводили креветку в чистую энергию по E=mc^2 - так креветка может пол города снести
А в википедии про кавитацию написано
четыре тысячи градусов это как-то многовато, и немного бессмысленно если не указывать количество воды нагретой до такой температуры. Иначе можно сказать что нас периодически пронзают нейтрино высоких энергий с "температурой" аж 10^15 °C (что в 100_000_000_000 горячее чем лава)
С одной стороны - хорошо, а с другой стороны - как скоро появятся Microsoft-специфичные PDF-файлы, которые только Edge и умеет отображать?
Например, если вы напились и заснули на улице, у вас ничего не украдут - воровать запрещено на законодательном уровне.
Очень интересно было читать эту статью сразу после https://habr.com/ru/post/460901/
И я думаю что "на работе" никому никогда не надо было понимать как работают регулярные выражения, и разницу между НКА и ДКА. И многие комментаторы из прошлой статьи на вопрос "как работает
сборщик мусорарегулярное выражение", обиделись бы и ушли со словами что на работе это не нужно. Но тут компании Cloudflare повезло, что в штате есть люди которые понимают стоимость выражений вида ...=. и считают что программисту полезно это знать.Идеальный вариант (если позволяет время и бюджет) сначала переписать этот код и покрыть тестами, затем добавить флаг и покрыть флаг тестами.
Я думаю что у каждого есть свой говнокод, который без костылей не протестировать. Применять ли тут паттерн «паблик морозов» я не знаю. Стоит ли рассказывать как тестировать говнокод с помощью костылей я тоже не знаю)
Почему есть метод Start() но нет метода Stop()? Зачем странно используемый lockObject?
Если всё это исправить(ну и многое другое) и сделать аккуратно и красиво то после 3) вызывается синхронный Stop() после которого проверяются все побочные эффекты
Как я понимаю, в картинке под фразой «Вот как будет выглядеть ваше дерево после soft reset и нового коммита» пропущена стрелочка от зеленого кружка к красному.
Вместо
Если посуду выпало мыть мне — увеличиваем SEED на единицу и пропускаем через мясорубку. Если снова выпало мне — то продолжаем и.т.д.
Впрочем, никто не мешает Вам, прочитав методические пособия на сайте, рассказать все своему ребенку.