O uploader de backup em blocos excede o limite de taxa de requisições do Discourse

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