Дефект ценой в 440 миллионов долларов

Вы никогда не задумывались к каким серьезным последствиям могут привести ошибки? Какова цена старого и не поддерживаемого кода? Сколько стоит не протестировать устаревшую и казалось бы ненужную функциональность? И сколько раз мы слышали, что этот код никогда не вызовется потому что ....? Это грустная история взаимодействия IT профессионалов, разработчиков, администраторов и тестировщиков.

Предыстория

Knight Capital Group (далее KCG) - американская глобальная финансовая компания, оперирующая на рынке финансовых услуг. В 2012 году Knight Capital Group был крупнейшим игроком на рынке электронной высокочастотной торговли, с долей рынка 17.3% NYSE, и 16.9% NASDAQ на тот момент. Объем торговли превышал в среднем 21 млрд долларов ежедневно!!

NYSE - в тот период времени планировала к запуску 1 августа 2012 года, новую программу ликвидности (Retail Liquidity Program - в дальнейшем RLP), эта программа предлагала продвинутую оценку розничным инвесторам работающим через брокеров, таких как Knight Capital Group(KCG). Для подготовки к этому событию KCG обновила свои автоматические алгоритмические маршрутизаторы высокочастотной торговли известных как SMARS. Одной из ключевых особенностей SMARS - это получение заявок от других компонентов торговой платформы Knight ("родительских"" заявок), и, по мере необходимости на основе имеющейся ликвидности, отправка одного или нескольких представительских (или "дочерних") заявок внешним службам на исполнение. Другими словами SMARS получал "большую" заявку, разбивал ее на мелкие части и отсылал их продавцам/покупателям на исполнение, в пределах "большой" заявки. Чем больше была заявка, на тем больше мелких частей она разбивалась.

При развертывании новый RLP код в SMARS должен был заменить неиспользуемый код в соответствующей части маршрутизатора. Этот неиспользуемый код ранее был нужен для функции Power Peg (эту функциональность компания не применяла 8 лет!!). Несмотря на это, она оставалась рабочей и вызываемой во время развертывания RLP. Новый RLP код использовал флаг, который ранее был привязан к Power Peg. Knight хотела удалить код Power Peg, чтобы при активации этого флага использовалась новая функциональность RLP, а не Power Peg.

Что-то пошло не так

В период с 27 по 31 июля 2012 года KCG в ручном режиме обновляла ограниченное количество своих серверов в день - всего 8 серверов.

в ходе деплоемента один из специалистов KCG не залил новый код на одну из машин SMARS. Второго специалиста который бы контролировал действия первого и перепроверил работу, не было. Никто в KCG не понял, что старый код Power Peg не был удален с восьмого сервера, а код поддерживающий RPL не был добавлен. В KCG не существовал письменного регламента данной процедуры проверки. (из отчета Комиссии по ценным бумагам. | Release No. 70694 | October 16, 2013)

В 9.30 утра 1 августа 2012 года рынки открылись и KCG начала процессить заявки своих брокеров от имени заказчиков через RPL. Семь серверов обрабатывали заявки правильно. Но заявки, отправленные на 8 сервер с установленным флагом запуска, запустили дефектный код Power Peg, который всё ещё присутствовал на этом сервере. В результате сервер воспринял заявки как родительские и начал отправлять дочерние заявки в трейдинговые центры.

Атака зомби-кода

Важно понимать, что делал код Power Peg. Эта функциональность помимо прочего подсчитывала купленные/проданные ценные бумаги в выполняемых дочерних заявках и сигнализировала о необходимости прекращения размещения дочерних заявках после того, как родительская заявка была выполнена (так называемый трекинг заявок). Этот трекинг заявок был в 2005 году перемещен на более раннюю стадию выполнения кода. И когда на восьмой сервер приходили заявки с флагом который предназначался для RPL, Power Peg начал их процессить, но так-как функции трекинга не было, начался так называемый бесконечный цикл купли-продажи.

1 августа Knight также получала заявки, которые относились к RPL, но предназначались для торговли до открытия рынка. Сервера SMARS обрабатывали эти заявки и, начиная примерно с 8:01 утра, внутренние системы генерировали автоматические сообщения (под названием «отказ BNET»), которые ссылались на SMARS и описывали ошибку как «Power Peg отключен». Система Knight отправила 97 таких сообщений до 9:30 утра, когда открылся рынок. Сообщения подобного типа не расценивались системой, как опасные, а персонал вообще не читал их. (из отчета Комиссии по ценным бумагам. | Release No. 70694 | October 16, 2013)

45 минут ада

Можете себе представить систему высокочастотной торговли ценными бумагами которая способная отсылать и исполнять тысячи заявок в минуту, функция трекинга исполнения заявок у которой отключена? Да, это было примерно так все плохо.

В 9.30 когда рынки открылись люди начали быстро догадываться, что что-то не так. В 9.31 для многих людей на Уолл-Стрит стало очевидно, что происходит что-то серьезное. Рынок наводнили заявки, неординарной стоимости для обычных объемов торгов на определенные ценные бумаги. В 9.32 трейдеры недоумевали почему это не заканчивается. Для высокочастотных торгов этот период времени был равноценен вечности. В течении 45 минут Knight создала более 50% всего объема торгов, повышая стоимость определенных бумаг на 10%. Как результат стоимость остальных ценных бумаг была снижена в ответ на ошибочные торги.

В течении 45 минут KCG пыталась оценить обстановку и остановить ошибочные торги. У KCG не было рубильника останавливающего торги, равно как и документированного регламента как действовать в случае подобной нештатной ситуации. Они пытались диагностировать проблему в живом окружении обслуживающем 8 миллионов операций каждую минуту. Так как они не понимали причину возникновения проблемных заявок, они начали откатывать изменения. Откатывать те изменения которые работали корректно. Что только усугубило положение, так как Power Peg начал работать на всех серверах, а не на одном как ранее. В конце концов они смогли остановить работу системы через 45 минут после ее старта.

За те 45 минут, что рынок был открыт, Power Peg код получил и отпроцесиил 212 родительских заявок. Как результат SMARS сгенерировал 4 миллиона транзакций по 154 ценным бумагам для 397 миллионов акций. Knight приняла $3.5 миллиардов длинных позиций и $3.15 миллиарда коротких. Проще говоря, Knight спустила 450 миллионов долларов за 45 минут. За 45 минут Knight Capital Group, крупнейший игрок на рынке, стал банкротом.