Ситуация
Система для проведения лоторей. Непроданные билеты вводятся диапазонами - от и до путём сканирования штрихкодов.За час до игры (прямой эфир между прочим) выясняется, что активных билетов в базе данных раза в два меньше чем ожидалось.
Решение
Сразу возникло подозрение что были выкинуты лишние билеты. Беглый просмотр кода не выявил явных багов.Были скачаны журналы операций за последние два месяца (текстовый файл для каждого дня, генерируется log4net). Журнал был намеренно создан машиносчитываемым. Запись об отмене билета выглядит примерно как
[2010-11-11 12:51:54,126] [INFO] [Ticket_RevokeBulk] [12570] [12578]За пять минут была написана программа прогоняющая логи через регулярное выражение и проверяющая длину диапазона. Один из них оказался размером в несколько десятков тысяч билетов - явная ошибка ввода оператором. Были отсканированы билеты из разных пачек.
Ещё через пару минут программа была переписана для генерации кода SQL скрипта повторяющего операции из журнала - множество инструкций INSERT. Инструкция соответствующая ошибочному вводу была удалена вручную.
Все билеты были помечены как проданные (восстановлены), после был выполнен SQL скрипт сгенерированный по логам. На это ушло ещё минут пятнадцать.
1 коммент.:
Прикольно, молодец.
Отправить комментарий