Как стать автором
Обновить

Как мы устранили редкую ошибку, из-за которой пришлось разлогинить всех пользователей Github

Время на прочтение9 мин
Количество просмотров8.7K
Всего голосов 29: ↑27 и ↓2+25
Комментарии5

Комментарии 5

> Также мы хотим повысить потокобезопасность всей кодовой базы в таких областях, как обработка исключений и оснащение.

Оснащение чего(чем)?

> Lastly, we’re looking at also improving the thread safety across our codebase in areas such as exception handling and instrumentation.

https://en.m.wikipedia.org/wiki/Instrumentation_(computer_programming)
Спасибо, исправил.

Какое ужасное качество перевода. Я ничего не смог понять, пришлось лезть в оригинал. Вот причина проблемы:


  • для обработки всех запросов используется один общий объект "env", который хранит параметры запроса. То есть при поступлении нового запроса не создается новый env, а просто меняются значения в существующем.
  • в главном потоке сначала обрабатывается запрос №1 от анонимного пользователя, и он регистрирует какие-то коллбеки для библиотеки обработки ошибок.
  • в фоновом потоке происходит исключение. Он начинает собирать информацию об исключении и для этого вызывает зарегистрированные коллбеки. Один из коллбеков должен вернуть данные сессии. Для этого он обращается к объекту env. Так как сессии в запросе №1 нет, запускается процедура аутентификации.
  • тем временем в основном потоке обрабатывается запрос №2 от авторизованного пользователя
  • в фоновом потоке продолжается аутентификация. Читается кука из объекта env, но так как в нем уже лежат данные от запроса №2, то читается кука второго пользователя.
  • тем временем в основном потоке обрабатывается запрос №3 от еще одного пользователя
  • в фоновом потоке завершается процедура аутентификации. Пользователю ставится авторизационная кука, но так как в объекте env лежат данные от запроса №3, то эта кука (дающая логин под пользователем №2) попадает пользователю №3.

Получается, во всем виновата кривая архитектура:


  • в фоновом потоке доступен объект env, который нужен только в главном потоке
  • в фоновом потоке используется обработчик ошибок из главного потока, который собирает ненужные данные (вроде идентификатора сессии, которой в фоновом потоке быть не может).
  • вместо простого чтения идентификатора сессии в фоновом потоке запускается бессмысленная процедура аутентификации, которая в итоге выставляет куки случайному пользователю
Статью можно не читать, достаточно этого комментария, мерси!

Кр-сть — с-а т.!
Вот теперь всё понятно.
А то в статье развели воду на десять страниц...

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории