Um de nossos clientes encontrou um problema reproduzível ao fazer o upload de um backup local do Discourse pela interface administrativa.
O uploader de backups usa blocos fixos de 5 MB e, em uma conexão suficientemente rápida, pode gerar solicitações suficientes para exceder o próprio limite de taxa de solicitações em nível de aplicação do Discourse. Quando isso acontece, o servidor retorna HTTP 429, mas o uploader por blocos não repete as respostas 429 nem respeita o cabeçalho Retry-After. Como resultado, o upload do backup inteiro falha.
Respostas não-2xx são convertidas em um erro:
if (ev.target.status < 200 || ev.target.status >= 300) {
const error = new Error("Non 2xx");
error.source = ev.target;
reject(error);
return;
}
A lógica de repetição é:
_shouldRetry(err) {
if (err.source && typeof err.source.status === "number") {
const { status } = err.source;
return (
status === 0 ||
status === 409 ||
status === 423 ||
(status >= 500 && status < 600)
);
}
return false;
}
Portanto, o HTTP 429 não é explicitamente repetível.
Uma única resposta 429 é suficiente para a promessa de upload por blocos falhar, acionando eventualmente upload-error para o upload do backup inteiro.
Também não há tratamento do cabeçalho de resposta Retry-After.
Encontrei este tópico de 2021 que saiu dos trilhos rapidamente, mas parece ser exatamente a mesma coisa