EVE online и как апгрейд графона сломал windows
Обновления в играх могут принести радость от нового и неизведанного,новые миссии, героев, улучшенную графику, исправление ошибок. А с другой стороны те же самые обновления могут испортить ваш компьютер, стереть фотографии вашего любимого кота или даже повредить ОС, сделав ПК неработоспособным.
Ниже я хочу рассказать о двух примерах того, как обновления игры и игрового ПО привели к серьезным проблемам у пользователей. И начну я с графического обновления для игры EVE Online.
CPP - команда разработчиков известной игры EVE Online
EVE Online - массовая многопользовательская онлайн-игра с научно-фантастическим сюжетом, действие которой разворачивается в космосе
Singularity - Публичный тестовый сервер игры EVE Online, используемый как разработчиками, так и игроками для тестирования нововведений перед их релизом на основном сервере.
Tranquility - Основной кластер серверов, на котором играют все пользователи( за исключением Китая)
Trinity - обновление игры от 5 декабря 2007 года
2 декабря, Воскресенье: первое проблемное обновление выпущено на тестовом сервере Singularity. Каких либо проблем во время его работы на тестовом сервере не обнаружено
5 декабря, 22:04, Среда: Обновление установлено на сервер Tranquility, после успешной обкатки. Сразу после обновления разработчики стали получать репорты, что последний апдейт игры приводит к проблемам - на ПК пользователей удаляется файл C:\boot.ini, без которого не запускается Windows.
6 декабря, 3:40: Проблемное обновление убрано с сервера Tranquility через пару часов, после обнаружения проблемы
6 декабря 3:40-6:08 Разработчиков вызвали ночью для поиска и исправления неисправности.
Всю ночь программисты усердно разбираются в ситуации и ищут корень всех зол.
6 декабря, 6:08: Проблема обнаружена и исправлена ранним утром после релиза. Вскоре после этого выпущен хот-фикс на боевой сервер
Итак, разберемся, как такое могло произойти. За несколько недель до выпуска обновления Trinity у разработчиков возникло две проблемы:
- как быстро доставить контент до игроков в короткий промежуток времени
- как это сделать для игроков с низкой скоростью интернета.
Большая часть усилий была направлена на то, чтобы сделать апгрейд графики настолько маленьким по объему, насколько это возможно.
Изначально планировалось использовать стороннюю библиотеку, чтобы создать файл с обновлением. Во время разработки выяснилось, что данная библиотека хорошо подходит для обновлений файлов, которые уже есть на компьютере пользователя, но практически не сжимает новые файлы, которые отсутствуют у игроков.
Обновление графики состояло из следующих файлов:
2 небольших текстовых файла boot.ini manifest.dat, которые уже были у игроков
и нового файла - resDX9*.stuff - объемом 1.43 GB.
Соответственно, старая библиотека не очень подходила - основной объем обновления приходился на новый файл.
Разработчики решили перейти на новый сторонний установщик, обладающий превосходным сжатием с помощью алгоритма LZMA( алгоритм сжатия данных, разрабатываемый с 1996 или 1998 года Игорем Павловым. Используется в архиваторе 7-Zip того же автора для создания сжатых архивов в формате 7z).
Благодаря такому решению загрузочный файл удалось уменьшить с 866 Mb до 584 Mb.
Разбор полетов и анализ проблемы
Из логов установщика может показаться, что допущена очевидная ошибка, когда в команде удаления указан путь до файла: “\boot.ini” вместо “boot.ini”.
Первый способ сотрет файл из корневой директории
Второй способ - из текущей директории
Однако, на самом деле не все так просто и ошибка заключалась в предположении, что файл будет удален из текущего рабочего каталога без указания полного пути файла.
Первый способ удалит файл из текущей директории, а вот если использовать вначале ‘\’, то удаление происходит из корневой папки диска. Но это не совсем так. Ошибка заключалась в предположении, что файл будет удален из текущего рабочего каталога без указания полного пути.
Предполагалось, что команда SetOutPath “$INSTDIR” сменит деркторию на папку с игрой и все последующие команды будут выполняться для этой папки.
Команды File(видимо команды для записи) используют заданный путь к папке, установленный изначально и отрабатывают без ошибок.
В документации для функции “Удалить” говориться, что для удаления следует указать полный путь до файла, однако на самом деле указывать его нужно обязательно, например так:
Delete “$INSTDIR\boot.ini”
Delete “$INSTDIR\manifest.dat”
В противном случае функция считает, что файл нужно удалить из корневой директории.
Для исправления ошибки функционал удаления был заменен на перезапись файла
Внимательный читатель может задать несколько очевидных вопросов:
“Зачем один из файлов был назван так же как и файл в OS Windows?”
Ответ довольно простой - это легаси. Этот файл существовал с 2001 года, когда файл был добавлен на сервер и позже попал в клиентский дистрибутив в 2002 году. Так что этот файл жил больше 6ти лет. После возникновения описанной выше проблемы разработчики проверяют все файлы и меняют их названия в случае конфликтов с файлами ОС.
“Почему разработчики Windows не защитили файл, который требуется для запуска системы?”
На самом деле хороший вопрос, поскольку этот файл пользователь может удалить случайно сам.
“Почему ошибка не была поймана при прохождении ревью?”
Язык установочных скриптов сложен для чтения. Программисты работали сверхурочно для того, чтобы выпустить новую версию в срок и эта ошибка прокралась незамеченной.
“Почему ошибка не была найдена при тестировании?”
Частично проблема уже описана выше - недостаточно времени на разработку и отладку приложения. Так же было обнаружено, что на тестовых стендах не хватало вариативности в железе и настройках ОС. Windows успешно восстанавливал свой загрузочный файл, если ОС находится на первом разделе загрузочного диска. Похоже, что большая часть компьютеров тестировщиков и разработчиков CCP (студия, которая разрабатывает EVE Online) настроена именно таким образом.