alyssaxuu/screenity · error · Error

Drive chunk PUT exhausted retries at offset

Error message

Drive chunk PUT exhausted retries at offset ${offset}

What it means

All MAX_CHUNK_ATTEMPTS retries for the current chunk failed with transient statuses (408/429/5xx) or non-advancing responses, and the loop did not classify the outcome as 'stalled'. Thrown in uploadResumable to abort rather than loop indefinitely.

Solutions

  1. Retry the whole upload later, resuming via the session status endpoint (PUT Content-Range: bytes */size)
  2. Check connectivity and the Drive status dashboard before surfacing a user-facing failure
  3. Resume from the committed offset reported by the status query
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at src/pages/Background/drive/handleSaveToDrive.js:249 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of alyssaxuu/screenity@512606387b (2026-09-02). Data as JSON: /api/errors/792e765f2e05405d. Report an issue: GitHub.

Appendix: source

Thrown at src/pages/Background/drive/handleSaveToDrive.js:249

        );
      }
      const delay = Math.min(1000 * Math.pow(2, attempt), 30000);
      const jitter = Math.random() * 250;
      diagEvent("drive-chunk-retry", {
        offset,
        status: chunkRes.status,
        attempt: attempt + 1,
        delayMs: Math.round(delay + jitter),
      });
      await new Promise((r) => setTimeout(r, delay + jitter));
    }

    if (advanced) {
      stalledRounds = 0;
      continue;
    }
    if (!stalled) {
      throw new Error(
        `Drive chunk PUT exhausted retries at offset ${offset}`
      );
    }
    // Drive accepted none of the chunk. Resending the same range is correct,
    // but bound it so a persistently stalled upload fails instead of looping.
    stalledRounds += 1;
    if (stalledRounds >= MAX_STALL_ROUNDS) {
      throw new Error(
        `Drive resumable upload made no progress at offset ${offset}`
      );
    }
    const stallDelay = Math.min(1000 * Math.pow(2, stalledRounds - 1), 15000);
    diagEvent("drive-chunk-stall", {
      offset,
      round: stalledRounds,
      delayMs: stallDelay,
    });
    await new Promise((r) => setTimeout(r, stallDelay));

View on GitHub (pinned to 512606387b)