JavaScript is required to use Bungie.net

Перебои в работе Destiny 2 и откат данных

В начале этого дня (вторник, 11 февраля) нам стали поступать сообщения, что с запуском обновления 2.7.1.1 вновь всплыла старая ошибка, из-за которой у небольшого процента игроков пропадают валюта и материалы. 28 января – после запуска обновления 2.7.1 – из-за этой ошибки валюта и материалы начали пропадать у всех игроков, так что мы вынуждены были откатить их учетные записи к предыдущему состоянию. Сегодня мы предприняли сходные меры и откатили учетные записи игроков к состоянию на 19:30 МСК (до обновления 2.7.1.1).

Поскольку оба этих инцидента были идентичны по своим причинам и по последствиям для игроков и поскольку оба она произошли в сравнительно краткий промежуток времени, мы решили рассказать вам о том, что именно произошло, как мы это исправили, и как планируем не допустить повторения той же ситуации в будущем. Сначала давайте разберемся с тем, что вызвало такую ситуацию: это была программная ошибка в коде управления инвентарем, а также конфигурации серверов, которые привели к повторении ошибки уже после того, как она была исправлена.

Управление инвентарем

В Destiny 2 поручения – это такие же предметы, как валюта и материалы. Все предметы имеют метку времени – когда они оказались в инвентаре игрока. Эта метка нужна, чтобы сортировать их по времени получения. При каждом входе игра проверяет инвентарь игрока, чтобы убедиться, что он соответствует всем требованиям – например, ограничению на количество предметов конкретного типа, которые может иметь с собой игрок.

Несколько месяцев назад пользователи сообщили, что у них неправильно сортируются поручения, и мы захотели это исправить. Мы изучили этот вопрос и обнаружили, что в процессе чистки у некоторых поручений сбрасывались метки времени, что сбивало сортировку по времени получения. Мы решили исправить эту проблему, отключив сбрасывание меток времени для поручений. Это решение выглядело разумно, но оно имело неочевидные побочные эффекты, которые привели к отключению слишком многих аспектов процедуры чистки. В итоге игра начала неверно обсчитывать ограничение на максимальное число предметов одного типа (таких как валюта и материалы), в результате чего предметы, превышающие это ограничение, стали пропадать. Мы знали, что это критически важный код, и, как это и заведено в подобных случаях, поручили двум своим специалистам в данной области проанализировать код внесенного изменения – но, увы, ошибку обнаружить не удалось.

Несколько дней спустя ее отловила наша внутренняя команда тестировщиков. Однако мы ошибочно решили, что проблема вызывалась инструментальными средствами, которые мы использовали в процессе отладки на стадии тестирования, а не ошибкой в самой игре. Несмотря на все наши усилия, ошибка пробралась в обновление 2.7.1. Как только ошибку обнаружили у реальных пользователей, нам нужно было решать, как ее устранить. Что подводит нас к следующей теме: игровым серверам и их конфигурациям.

Конфигурации серверов

В преддверии каждого крупного запуска (например "Обители Теней") вы проводим тщательное стресс-тестирование, чтобы смоделировать поведение пользователей и то, как оно отразится на архитектуре наших систем. Поскольку ничто не заменит поведение миллионов реальных пользователей, в качестве дополнительного метода тестирования мы внимательно следим за показателями нашего оборудования после запуска.

В октябре прошлого года, чтобы справиться с возросшей процессорной нагрузкой и числом игроков на выходе "Обители Теней", мы запустили несколько дополнительных игровых серверов (называемых в данном случае мировыми серверами) – по правде говоря, столько серверов мы еще никогда прежде не использовали. Работа такого количества серверов сопровождалась небольшими побочными эффектами, которые мы держали под наблюдением, но до игроков, как правило, проблемы не доходили. Например, одним из таких эффектов было то, что из-за перегрузки резервных баз данных, вызванной количеством активных серверов, часть (менее 1%) этих серверов при запуске вылетала. Мы решали эту проблему, вручную перезапуская вылетевшие серверы всякий раз, когда получали об этом сообщение. И нам казалось, что это решает проблему без каких-либо заметных игрокам последствий.

Возвращаемся к событиям двухнедельной давности. Описанная ранее ошибка в версии 2.7.1, вызывавшая порчу данных персонажей, вынудила нас впервые в истории игры откатить данные персонажей. Чтобы побыстрее решить эту проблему, мы использовали на серверах небольшую программную "заплатку" – вместо того чтобы выкатывать новый билд. Для этого нужно было внести изменение в настройку сервера, позволившее бы нам заменить фрагмент игрового кода, отвечающий за обработку данных персонажей, после чего перезапустить мировые серверы, чтобы те применили это изменение. 

Возвращаемся к сегодняшним событиям, когда одновременно с запуском "Багряных дней" вышло обновление 2.7.1.1. После выхода обновления из-за большого количества одновременно запускаемых серверов некоторые из мировых серверов снова вылетели при запуске. Мы снова вручную перезапустили эти серверы и решили, что все идет нормально. Мы ошибались. 

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

Частью нашей стандартной процедуры проверки новых сборок является то, что наши тестировщики заходят в игру с разных тестовых учетных записей и проверяют, как она выглядит вживую. Поскольку в нашем распоряжении сейчас находятся сотни серверов, то всем нашим тестировщикам (не) повезло попасть именно на "хорошие" серверы, и небольшой процент серверов с неправильным кодом остался незамеченным. Так что мы были готовы выгружать обновление на серверы.

Сегодня, перезапустив игру после обновления 2.7.1.1, мы стали получать от игроков сообщения о пропаже валюты. Мы немедленно принялись разбираться в этом вопросе и в 21:30 по МСК отключили игровые серверы. На тот момент сотни тысяч пользователей уже вошли в игру или подключились к данным своих персонажей через сторонние сервисы. В процессе анализа ситуацию мы выявили ситуацию, которую считали невозможной: оказалось, что небольшое число мировых серверов не загрузило правильную конфигурацию, исправлявшую проблему с порчей данных из версии 2.7.1. К сожалению, у всех игроков, подключившихся к своим персонажам через эти серверы с неактуальным кодом, возникла проблема с порчей данных персонажей.

Как только мы обнаружили, что это та же самая проблема, которая возникала 28 января, и поняли, как это произошло, мы решили, что наилучшим выходом будет не пытаться отследить все подверженные данной ошибке учетные записи, рискуя в процессе проглядеть кого-нибудь, а просто восстановить данные всех персонажей из резервной копии, сделанной до запуска обновления 2.7.1.1. 


Меры предосторожности

Мы придумали ряд дополнительных мер предосторожности, которые должны будут предотвратить возникновение данной ситуации в будущем. 

1). Мы добавили дополнительные меры предосторожности в процесс применения изменений "на ходу", так чтобы наши серверы не могли запускаться с неправильной версией кода. Сейчас эти меры уже действуют.
2) Мы исправили ошибку, вызывавшую вылет при запуске небольшой части мировых серверов. Это исправление будет применено в Сезоне 10. 
3) Окончательное исправление проблемы с порчей данных персонажей будет выпущено со следующими обновлением в виде обновления в исполняемом файле, что снимет необходимость выборочного обхода конфигураций. (К сожалению, обновление 2.7.1.1 находилось на такой стадии, что уже не успело бы воспользоваться преимуществами этого исправления).
4) В будущем мы планируем найти способы ускорить процесс отката и восстановления.
5) В последующих обновлениях мы планируем разобраться с ситуацией, когда сервера могут пропускать загрузку данных конфигурации.
6) Мы также добавим еще больше защитных мер в игровой код, отвечающий за чистку учетных данных, чтобы предотвратить возникновение ошибок в настолько критически важной сфере.
7) Мы собираемся обновить нашу методологию разработки, чтобы начать отлавливать подобные проблемы на более ранних стадиях процесса публикации. 

С текущим откатом данные всех персонажей игроков возвращаются в то состояние, в котором они находились в районе 19:30 по МСК. Мы также изо всех работаем над тем, чтобы подготовить к выпуску обновление 2.7.1.2, которое планируем выпустить 13 февраля. В этом обновлении будет исправлена ошибка с бесконечными Клинками зари.

Мы понимаем, что вас расстроили сегодняшние перебои в работе серверов и откат – особенно принимая во внимание начало Багряных дней. Уверяем вас, что тот факт, что данной проблемы можно было избежать, расстроил нас не меньше. Мы приносим свои извинения за причиненное беспокойство и неудобство и продолжим работать над тем, чтобы в будущем подобные ситуации не повторялись. Как обычно, если у вас возникли проблемы с Destiny 2, вы можете связаться с нами на нашем сайте поддержки и на страничке @BungieHelp в Twitter. Благодарим вас за терпение!

У вас нет прав для просмотра этих материалов.
preload icon
preload icon
preload icon