AlistGo/alist · error

wukong apply upload inner returns empty upload node

Error message

wukong apply upload inner returns empty upload node

What it means

Thrown after a successful apply-upload-inner call when the response contains no UploadNodes, or its first node has no StoreInfos. The driver has already picked candidate hosts and applied for an upload slot, but the server did not allocate an upload node (host + StoreURI + auth tuple), so there is nowhere to PUT the bytes.

Source

Thrown at drivers/wukong/driver.go:351

	up(10)

	candidates, err := d.getUploadCandidates(ctx, authToken)
	if err != nil {
		return err
	}
	bestHosts := collectCandidateHosts(candidates)
	if len(bestHosts) == 0 {
		return errors.New("wukong upload candidates is empty")
	}
	up(20)

	applyResp, err := d.applyUploadInner(ctx, authToken, uploadType, size, strings.Join(bestHosts, ","))
	if err != nil {
		return err
	}
	if len(applyResp.Result.InnerUploadAddress.UploadNodes) == 0 ||
		len(applyResp.Result.InnerUploadAddress.UploadNodes[0].StoreInfos) == 0 {
		return errors.New("wukong apply upload inner returns empty upload node")
	}
	node := applyResp.Result.InnerUploadAddress.UploadNodes[0]
	store := node.StoreInfos[0]
	up(30)

	if size > multipartChunkSize {
		if err = d.uploadToTOSMultipart(ctx, node.UploadHost, store.StoreURI, store.Auth, getStorageUserID(store.StorageHeader), tempFile, size, up); err != nil {
			return err
		}
	} else {
		if _, err = tempFile.Seek(0, io.SeekStart); err != nil {
			return err
		}
		reader := &driver.ReaderUpdatingProgress{
			Reader: &driver.SimpleReaderWithSize{Reader: tempFile, Size: size},
			UpdateProgress: func(percent float64) {
				up(30 + percent*0.5)
			},

View on GitHub (pinned to 843d9dc814)

Solutions

  1. Retry later — transient provisioning failures on the wkbrowser backend produce empty node lists
  2. Check the account's storage quota on pan.wkbrowser.com and free space if full
  3. Update the driver in case the InnerUploadAddress response shape changed
  4. Try a smaller file to distinguish size-dependent rejection from a general failure
Defensive patterns

Strategy: retry

Try / catch

if err != nil && strings.Contains(err.Error(), "empty upload node") {
    // re-run full apply flow after delay; nodes are provisioned per-attempt
    time.Sleep(10 * time.Second)
    return d.Put(ctx, dstDir, file, up)
}

Prevention

When it happens

Trigger: applyUploadInner returns code 0 but Result.InnerUploadAddress.UploadNodes is empty, or UploadNodes[0].StoreInfos is empty — quota exhaustion, server-side upload capacity issues, an account not entitled to upload, or a response-schema change.

Common situations: Wukong account hit a storage/quota limit; uploading unusually large or zero-byte files the backend rejects at apply time; provider API drift; temporary backend incidents.

Related errors


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