AlistGo/alist · error

upload failed after %d retries due to server errors, error:

Error message

upload failed after %d retries due to server errors, error: %s

What it means

Fatal retry exhaustion in Cloudreve v4's remote-protocol chunked upload (upRemote). Chunks are POSTed through the Cloudreve server with exponential backoff on error; after maxRetries consecutive failures the upload aborts with this message embedding the last error (often the server's error payload).

Source

Thrown at drivers/cloudreve_v4/util.go:317

			var up Resp
			err = json.Unmarshal(body, &up)
			if err != nil {
				return err
			}
			if up.Code != 0 {
				return errors.New(up.Msg)
			}
			return nil
		}()
		if err == nil {
			retryCount = 0
			finish += byteSize
			up(float64(finish) * 100 / float64(file.GetSize()))
			chunk++
		} else {
			retryCount++
			if retryCount > maxRetries {
				return fmt.Errorf("upload failed after %d retries due to server errors, error: %s", maxRetries, err)
			}
			backoff := time.Duration(1<<retryCount) * time.Second
			utils.Log.Warnf("[Cloudreve-Remote] server errors while uploading, retrying after %v...", backoff)
			time.Sleep(backoff)
		}
	}
	return nil
}

func (d *CloudreveV4) upOneDrive(ctx context.Context, file model.FileStreamer, u FileUploadResp, up driver.UpdateProgress) error {
	uploadUrl := u.UploadUrls[0]
	var finish int64 = 0
	DEFAULT := int64(u.ChunkSize)
	retryCount := 0
	maxRetries := 3
	for finish < file.GetSize() {
		if utils.IsCanceled(ctx) {
			return ctx.Err()

View on GitHub (pinned to 843d9dc814)

Solutions

  1. Inspect the embedded server error and the Cloudreve v4 server logs to find the failing step
  2. Restore the server's storage policy health / free disk space, then re-upload
  3. Restart the upload to obtain a fresh session if the old one expired
  4. Use smaller chunks or retry later when the server is stable
Defensive patterns

Strategy: retry

Validate before calling

// pre-flight: confirm session and upload URLs are present
if u.SessionID == "" || len(u.UploadUrls) == 0 {
    return errors.New("invalid v4 upload session; request a new one")
}

Try / catch

if err := d.upRemote(ctx, file, u, up); err != nil {
    if strings.Contains(err.Error(), "upload failed after") {
        time.Sleep(2 * time.Minute)
        // one full restart with a fresh session, then report
    }
}

Prevention

When it happens

Trigger: A Cloudreve v4 upload session where each chunk request errors maxRetries+1 times consecutively — server 5xx, server-side storage policy failure (its OneDrive/S3 backing down), quota exhaustion, or an expired upload session returning errors per chunk.

Common situations: Cloudreve v4 server's storage policy unhealthy; server disk full; large uploads over unstable links where every retry fails; version mismatch between client expectations and the v4 API session lifecycle.

Related errors


AI-assisted analysis of AlistGo/alist@843d9dc814 (2026-08-15). Data as JSON: /api/errors/39af66f03cb45f1b. Report an issue: GitHub.