{"record":{"id":"8672d5e09bb37648","repo":"AlistGo/alist","slug":"task-s-failed-with-status-d","errorCode":null,"errorMessage":"task %s failed with status=%d","messagePattern":"task (.+?) failed with status=(.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"drivers/guangyapan/driver.go","lineNumber":868,"sourceCode":"\tconst (\n\t\tmaxTry   = 30\n\t\tinterval = 300 * time.Millisecond\n\t)\n\tfor i := 0; i < maxTry; i++ {\n\t\tvar out taskStatusResp\n\t\tif err := d.postAPI(ctx, \"/nd.bizuserres.s/v1/get_task_status\", map[string]any{\n\t\t\t\"taskId\": taskID,\n\t\t}, &out); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif !strings.EqualFold(strings.TrimSpace(out.Msg), \"success\") {\n\t\t\treturn fmt.Errorf(\"get task status failed: %s\", strings.TrimSpace(out.Msg))\n\t\t}\n\t\tswitch out.Data.Status {\n\t\tcase 2:\n\t\t\treturn nil\n\t\tcase -1, 3:\n\t\t\treturn fmt.Errorf(\"task %s failed with status=%d\", taskID, out.Data.Status)\n\t\t}\n\t\tif i == maxTry-1 {\n\t\t\tbreak\n\t\t}\n\t\tselect {\n\t\tcase <-ctx.Done():\n\t\t\treturn ctx.Err()\n\t\tcase <-time.After(interval):\n\t\t}\n\t}\n\treturn fmt.Errorf(\"task %s timeout\", taskID)\n}\n\nfunc (d *GuangYaPan) getUploadToken(ctx context.Context, parentID, name string, size int64) (*uploadTokenData, int, error) {\n\tvar out uploadTokenResp\n\terr := d.postAPI(ctx, \"/nd.bizuserres.s/v1/get_res_center_token\", map[string]any{\n\t\t\"capacity\": 2,\n\t\t\"name\":     name,","sourceCodeStart":850,"sourceCodeEnd":886,"githubUrl":"https://github.com/AlistGo/alist/blob/843d9dc8149126976b2625911e45a4d3ffd6f2f5/drivers/guangyapan/driver.go#L850-L886","documentation":"waitTaskDone maps the task's numeric Data.Status: 2 means success, while -1 and 3 are terminal failures, and this error reports the task ID and failing status. It means the server-side operation (copy/move/etc.) was accepted but ultimately failed.","triggerScenarios":"A polled task transitions to status -1 or 3: upstream copy failed (source missing/permission), quota exceeded, content policy rejection, or provider-side processing error.","commonSituations":"Copying a file that was deleted between request and processing; target over quota; occasional provider-side failures on large files.","solutions":["Retry the operation - status 3 is often transient server-side failure.","Verify the source object still exists and the target folder is writable.","Check account quota if failures cluster."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"if err := d.waitTaskDone(ctx, taskID); err != nil {\n    if strings.Contains(err.Error(), \"failed with status=\") {\n        // terminal server-side failure: do NOT blind-retry large copies repeatedly\n        if isLargeOp { return fmt.Errorf(\"copy failed server-side: %w\", err) }\n        return d.copy(ctx, src, dst) // one retry for small ops\n    }\n    return err\n}","preventionTips":["Verify source objects exist before batch copies.","Track repeated status=-1/3 per file to detect quota or policy issues."],"tags":["task-failed","copy","status-code","guangyapan"],"backgroundTag":null,"analyzedSha":"843d9dc8149126976b2625911e45a4d3ffd6f2f5","analyzedAt":"2026-08-15T12:14:11.722Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}