Вскоре после запуска EVE Online: Trinity в 22:04 GMT в среду 5 декабря, мы начали получать сообщения о том, что переходный пакет Classic -> Premium (с новой графикой) удалял файл C:\boot.ini, который является загрузочным файлом Windows. В некоторых случаях Windows не могла восстановить резервную копию этого файла, и отказывалась загружаться. В этом девблоге я расскажу вам, в чём была проблема.
В последние недели подготовки обновления Trinity одной из наших основных задач было создание обновления, которое могли бы быстро скачать все игроки, даже те, у которых не очень широкий интернет-канал. Посему мы прилагали существенные усилия к подкотовке переходного патча от Classic-клиента к Premium-клиенту (Classic to Premium graphics content upgrade), и старались сделать этот переходных пакет настолько компактным, насколько это возможно.
Сначала мы собирались использовать наш обычный установщик патчей для создания пакета; но, как выяснилось, он (установщик) хорошо подходит для создания "обычных" патчей, т.е. для правки существующих файлов, но совершенно не годится для упаковки новых файлов. Так как переходных пакет обновлял только 2 файла - boot.ini и manifest.dat - а затем копировал аж 1.43 гигабайт новых файлов (resDX9*.stuff), мы использовали другую программу для создания пакетов обновлений, которая позволила нам ужать все файлы в 584 мегабайта. Установочный скрипт для развёртывания переходного пакета был написан 30 ноября в 14:59 GMT. Первый бета-релиз пакета увидел свет на сервере Singularity в воскресение 2 декабря, а финальный релиз - 45017 - был выложен вместе с открытием сервера Tranquility в 22:04 GMT 5 декабря.
Из сообщений во время установки вам могло показаться, что наша ошибка была в указании удаляемого файла как "\boot.ini" вместо простого "boot.ini" (первый вариант удалит файл из корня текущего диска, второй - только из рабочей директории). Так вот - это не совсем верное заключение; нашей ошибкой было то, что мы подразумевали, что файл будет удалён из текущей директории, и посему не указали полный путь к файлу. Вот полный код установочного скрипта, вызвавший проблему:
Section "EVE-ONLINE"
SetOutPath "$INSTDIR"
Delete "boot.ini"
Delete "manifest.dat"
File "boot.ini"
File "manifest.dat"
File "resDX9*.stuff"
SectionEnd
Мы думали, что после строки SetOutPath "$INSTDIR" все последующие комманды будут автоматически выполняться в папке с установленной игрой.
Комманда File действительно подхватывала нужную директорию; а вот комманда Delete - нет. В документации к системе создания установщика было сказано, что Delete может использовать полный путь к файлу; как выяснилось, Delete должна использовать полный путь (иначе файл удаляется из корны диска), и корректный код для Delete-секции должен быть таким:
Delete "$INSTDIR\boot.ini"
Delete "$INSTDIR\manifest.dat"
Мы исправлили процедуру установки таким образом, что файлы boot.ini и manifest.dat не удаляются, а перезаписываются. Пакет с ошибочной процедурой установки был удалён через несколько часов после релиза, около 03:40 GMT. Правки в скрипт были внесены утром 6 декабря, в 06:08 GMT, и, после тестирования, переходный пакет снова был выложен.
Вы можете задаться вопросами:
Почему файл boot.ini называется также, как и системный файл Windows?
Ответ - в унаследованном коде. Файл впервые появился в серверном коде игры в 2001 году, а в 2002 перекочевал на клиент - 6 лет прошло. Сейчас мы пересматриваем имена всех файлов, и изменяем те из них, которые названы также, как и системные файлы Windows.
Почему Windows не защищает свои системные файлы?
Хороший вопрос, который я задавал себе уже несколько раз в течение последних пары дней - хотел бы я знать ответ. Мы не станем винить Microsoft - это была наша ошибка. Впредь будем аккуратнее.
Почему (потенциальную) ошибку не увидели раньше?
Скриптовый язык установщика сложен. К тому же, последние несколько недель перед релизом Trinity мы работали днями и ночами, и ошибка просто ускользнула от нас.
Почему ошибка не проявилась во время тестирования?
Отчасти по той же причине - были так заняты проверкой графического движка, что не заметили что файл удаляется. К тому же, мы увидели, что на наших тестовых машинах мы не могли увидеть эту ошибку - на всех Windows установлена на 1м разделе (а Windows восстанавливает boot.ini если она установлена на 1м разделе диска). Мы, естественно, уже пересмотрели наши процедуры тестирования таким образом, чтобы ловить подобные промахи в будущем.
Когда проблема была обнаружена, многие программисты были вызваны на работу посреди ночи, и работали до тех пор, пока ошибка не была выявлена и исправлена. Затем мы сделали всё, чтобы помочь пользователям справится с проблемой (через петиции и по телефону). К нам обратилось 215 человек (170 по петициям, 45 по телефону).
Мы искренне сожалеем о возникновении этой проблемы, и благодарим вас за терпение и поддержку."
Оригинал девблога.
Сообщение отредактировал AllSeeingI: 12 December 2007 - 12:28