A ligação

operava o sistema central de e-mail do campus - chamava-se Isis - na Universidade da Carolina do Norte em Chapel Hill, e também escrevia os arquivos de configuração do sendmail usados na maioria dos servidores de correio departamentais. Por volta de 2002 o chefe do departamento de estatística telefonou.

Estavam com um problema para mandar e-mail para fora do departamento. Especificamente: não conseguiam mandar correio a mais de 500 milhas. Um pouco mais, na verdade. Digamos 520 milhas. Mas não além.

A resposta de Harris é a que qualquer um daria: e-mail realmente não funciona assim.

Então veio o detalhe que transforma um chamado implausível num relato genuíno. Tinham esperado para ligar porque ainda não haviam coletado dados suficientes para ter certeza. Tinham pedido a uma geoestatística que investigasse. Ela produzira um mapa mostrando o raio dentro do qual o correio saía, pouco mais de 500 milhas. Dentro do raio havia destinos que não alcançavam, ou alcançavam às vezes. Fora dele, nada nunca ia.

Era o departamento de estatística. Tinham feito a análise.

A causa

Harris testou por conta própria, e era verdade.

Algum tempo antes um consultor "corrigira o servidor". Ao fazê-lo, atualizara o sistema operacional e, com ele, o sendmail - da versão 5 para a 8 - deixando no lugar o arquivo de configuração da versão 5. O sendmail 8 leu uma configuração escrita para outra geração dele mesmo. Interpretou o que reconheceu. Para os ajustes que não reconheceu, o binário não tinha padrões compilados, então saíram como zero.

Um dos ajustes que saíram como zero foi o tempo limite para conectar a um servidor de correio remoto.

Um tempo limite zero não significa "espere para sempre" e não significa "falhe imediatamente". Naquela máquina em particular, sob sua carga típica, significava que uma chamada de conexão era abortada depois de pouco mais de três milissegundos.

E então a rede do campus passou a importar. Era inteiramente comutada, então um pacote de saída não sofria atraso de roteador até deixar o ponto de presença do campus e encontrar um roteador do outro lado. Para um host pouco carregado numa rede próxima, o tempo de estabelecer conexão era portanto governado menos por enfileiramento e processamento do que pela distância que a luz tinha de percorrer.

O relato do próprio Harris registra o que ele digitou em seguida, e é o momento em que tudo se resolve:

$ units
You have: 3 millilightseconds
You want: miles
        * 558.84719

Quinhentas milhas, ou um pouco mais.

Harris é cuidadoso com a narrativa, e quem a repete deveria ser também. A nota dele diz que a história foi levemente alterada para proteger os culpados, pular detalhes irrelevantes e tornar tudo mais divertido. Perguntado depois se aquilo aconteceu, respondeu: sim, aconteceu.

Por que não é só uma boa anedota

Acredite no relato que você não consegue explicar. O chefe do departamento descrevia algo que não podia ser verdade, e era verdade. O artigo do Therac-25 faz o mesmo ponto a um custo muitíssimo maior: o sinal mais forte daquela sequência inteira foi uma paciente insistindo que fora queimada por uma máquina que, segundo o fabricante, não podia queimar ninguém. Um relato que contradiz seu modelo do sistema é dado sobre o seu modelo. O instinto de explicá-lo para longe é o modo de falha.

Uma atualização reescreveu silenciosamente uma configuração. Ninguém pôs o tempo limite em zero. Um programa mais novo leu um arquivo mais antigo, não entendeu partes dele, e preencheu as lacunas com nada - e nada, naquele contexto, eram três milissegundos. É a falha do Knight Capital em miniatura e a do Ariane 5 em miniatura: um componente se comportando corretamente diante de entradas escritas para outra versão do mundo. E é inteiramente atual. Uma imagem de contêiner cujos padrões mudaram entre tags, um equipamento que aceita uma configuração antiga e descarta em silêncio as diretivas que não suporta mais, um módulo de infraestrutura cuja variável não definida não é "não definida" e sim zero - o mecanismo não envelheceu nada.

O sintoma estava numa camada que ninguém olhava. A queixa era sobre e-mail. O defeito estava num tempo limite. O padrão visível era geografia. Nada em "não conseguimos mandar correio para Seattle" aponta para um tempo limite de conexão, e nenhuma leitura de logs de correio na camada de aplicação teria produzido a resposta - que é o argumento do artigo sobre pontos de captura a respeito de posição: a camada em que um problema é relatado raramente é a camada em que ele mora.

E latência é distância. É a parte que os profissionais esquecem até doer, e dói o tempo todo: numa replicação que funciona entre dois sítios e não com um terceiro, num tempo limite de banco que só falha para a filial, num serviço de voz que vai bem dentro de um país e é inutilizável do outro lado de um oceano. A luz na fibra viaja a cerca de dois terços da velocidade da luz no vácuo, e nenhuma quantidade de banda muda isso. Quando uma falha se correlaciona com um mapa em vez de com uma configuração, o mapa está lhe dizendo alguma coisa.

Defina seus tempos limite. A instrução final, sem glamour. Todo tempo limite que não é explicitamente configurado é definido por alguma coisa - um padrão que você não leu, um arquivo herdado, ou um zero. Saber o valor é a diferença entre um sistema que degrada e um sistema que se comporta como física.

Fontes