No dia 4 de setembro de 2018, disponibilizamos a Operation Grim Sky nos servidores ativos. Esta atualização trouxe melhorias para o fluxo geral da organização de partidas, visando tornar o processo de seleção de servidor inicial muito mais tranquilo. Quando a atualização foi implementada, observamos um aumento no número de erros de organização de partidas em comparação à fase do servidor de testes. Os jogadores, inicialmente na América do Norte, não conseguiam usar o sistema de organização de partidas para entrar nos combates.
Veja abaixo um resumo do que aconteceu, e as medidas tomadas para solucionar o caso.
O processo de Organização de Partidas
Selecionar o botão “Multiplayer” para qualquer modo de jogo online inicia um processo de duas etapas.
Primeiramente, o jogo contata nossos serviços de organização de partida, buscando a melhor opção possível. Esta etapa, a depender do modo de jogo, sua classificação e do grupo a que pertence o jogador, geralmente leva entre 10 e 60 segundos (a degradação não afetou esta etapa do processo ).
Em seguida, o cliente tenta conectar-se ao servidor do jogo. Foi neste ponto em que a degradação ocorreu.
As conexões com nossos servidores se dão pela troca de mensagens UDP (User Datagram Protocol) entre o cliente e o servidor. De maneira geral, elas se apresentam assim:
O cliente negocia um canal de comunicação com o servidor, aguarda por um frame (~16ms) e, então, começa a enviar informações (Hello) naquele canal.
A descoberta
Durante a investigação desse problema, descobrimos que havia uma falha preexistente na conexão com o servidor: se a quarta mensagem (Hello) chegasse ao servidor do jogo antes da terceira (Ack) dentro de um espaço muito curto de tempo, a conexão seria encerrada com um erro e não poderia ser reestabelecida. Isto resultava na mensagem de erro 6-0x00001000 (conexão expirada).
Na maioria dos casos, quando as mensagens são enviadas numa ordem específica, elas são recebidas nessa mesma ordem. A reordenação das mensagens é rara, de modo que o erro em si não é frequente, mas vale ressaltar que ele também pode ocorrer em casos legítimos. Por exemplo, com um firewall não configurado adequadamente pelo jogador, o que dificulta o rastreamento. Em outras palavras, uma pequena quantidade desses erros não é nada sério e chega até a ser esperada, mas uma quantidade muito grande é um fato anormal. Essa é a razão principal por não termos imediatamente reconhecido a extensão do problema durante os servidores de testes, já que a avaliação se deu sobre uma amostra tão pequena.
A evolução da degradação
Uma das alterações que fizemos na Operation Grim Sky é uma otimização por meio da qual o cliente não aguarda, e envia a terceira e a quarta mensagens imediatamente, ainda em sequência, num período muito curto de tempo. Na maioria dos provedores de internet, o efeito não chega a ser perceptível. Em alguns provedores, o envio das duas mensagens ocorria em um momento tão próximo que, na maioria dos casos, elas acabavam sendo reorganizadas; nesses casos, era quase certo que jogadores usando tal provedor acabariam enfrentando a falha. Isso ocorria em razão da baixa latência oferecida através das conexões com esses provedores. Basicamente, quanto menor a latência da conexão do jogador, maior a probabilidade de se deparar com esse erro.
Além disso, se pelo menos um jogador da equipe não pudesse entrar numa partida, a fase de conexão do servidor falharia para todos os usuários (2-0x0000D012). Inicialmente, isso foi pensado para garantir a integridade das equipes durante a organização de partidas; entretanto, com tantos jogadores afetados pelo erro inicial, desencadeou-se um efeito cascata para aqueles que entrassem na equipe de um usuário afetado.
Assim que identificamos e confirmamos o problema, pudemos corrigir o servidor do jogo para garantir que essa falha não ocorra novamente a partir de agora.
Cronograma da correção
Os primeiros dias foram totalmente dedicados à tentativa de reprodução do erro da melhor maneira possível naquelas circunstâncias. Infelizmente, não tivemos sucesso nessa empreitada. Não importa a quantidade de diferentes simulações de latência, instabilidade e perda de pacotes testadas, não conseguíamos reproduzir de forma satisfatória a ponto de pensar que havíamos encontrado a raiz do problema. Dedicar tempo e recursos para corrigir algo que não seja a real causa do problema é prejudicial a nós e aos nossos jogadores, já que não passa de prolongamento do problema.
Felizmente, muitos usuários nos contataram e ofereceram ajuda. Trabalhamos de perto com alguns jogadores que tinham uma taxa de ocorrência extremamente alta, e com sua generosidade e cooperação, pudemos fazer grandes avanços em nossa investigação. Na segunda sessão de reparos, estávamos confiantes de que havíamos encontrado a fonte do problema e que poríamos começar as correções. Finalizamos algumas correções na noite de domingo e, depois de realizar uma sessão final de correção de falhas com nossos jogadores voluntários na segunda-feira para garantir que o problema não estava mais presente, sentimos que havíamos encontrado a solução. A disponibilização da correção foi então imediatamente programada para o próximo dia útil, terça-feira.
Próximas medidas
Um dos problemas principais que enfrentamos ao tentar descobrir a causa da falha foi devido ao fato de que ela chegou com a atualização principal da temporada. Isso impossibilitava um regresso, já que teríamos de cancelar o lançamento de toda a temporada.
Para o futuro, começamos a preparar melhorias para nosso sistema de lançamentos que nos permitirão trazer novos conteúdos, especialmente novas temporadas, de forma independente de pequenas alterações que não afetam os jogadores. Por isso, caso um problema similar aconteça novamente, poderíamos reverter a situação, se necessário.
Gostaríamos de aproveitar essa oportunidade para, mais uma vez, agradecer aos jogadores que gentilmente nos ajudaram a solucionar esse problema para toda a comunidade do Rainbow Six. Vocês são demais!
Ademais, continuamos a trabalhar nas falhas que os jogadores encontraram por todas as plataformas. Traremos correções para a maioria destas na próxima atualização 3.1.