Комментарии 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)
Оснащение чего(чем)?
> 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)
0
Какое ужасное качество перевода. Я ничего не смог понять, пришлось лезть в оригинал. Вот причина проблемы:
- для обработки всех запросов используется один общий объект "env", который хранит параметры запроса. То есть при поступлении нового запроса не создается новый env, а просто меняются значения в существующем.
- в главном потоке сначала обрабатывается запрос №1 от анонимного пользователя, и он регистрирует какие-то коллбеки для библиотеки обработки ошибок.
- в фоновом потоке происходит исключение. Он начинает собирать информацию об исключении и для этого вызывает зарегистрированные коллбеки. Один из коллбеков должен вернуть данные сессии. Для этого он обращается к объекту env. Так как сессии в запросе №1 нет, запускается процедура аутентификации.
- тем временем в основном потоке обрабатывается запрос №2 от авторизованного пользователя
- в фоновом потоке продолжается аутентификация. Читается кука из объекта env, но так как в нем уже лежат данные от запроса №2, то читается кука второго пользователя.
- тем временем в основном потоке обрабатывается запрос №3 от еще одного пользователя
- в фоновом потоке завершается процедура аутентификации. Пользователю ставится авторизационная кука, но так как в объекте env лежат данные от запроса №3, то эта кука (дающая логин под пользователем №2) попадает пользователю №3.
Получается, во всем виновата кривая архитектура:
- в фоновом потоке доступен объект env, который нужен только в главном потоке
- в фоновом потоке используется обработчик ошибок из главного потока, который собирает ненужные данные (вроде идентификатора сессии, которой в фоновом потоке быть не может).
- вместо простого чтения идентификатора сессии в фоновом потоке запускается бессмысленная процедура аутентификации, которая в итоге выставляет куки случайному пользователю
+36
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Как мы устранили редкую ошибку, из-за которой пришлось разлогинить всех пользователей Github