Назад к списку

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

В начале этого дня (вторник, 11 февраля) разработчикам многопользовательского шутера Destiny 2 стали поступать сообщения, что с запуском обновления 2.7.1.1 вновь всплыла старая ошибка, из-за которой у небольшого процента игроков пропадают валюта и материалы.


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

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


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

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

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

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


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

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

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

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

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

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

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

Сегодня, перезапустив игру после обновления 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 по МСК. Также 13 февраля выпущено обновление 2.7.2.2. В нём исправлена ошибка, при которой игроки могли использовать суперспособность "Клинок зари" даже после того, как вся энергия была израсходована.

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



© 2020 The Frags