{"record":{"id":"ada5a84f41ac6156","repo":"AlistGo/alist","slug":"doubao-new-merge-blocks-incomplete-v","errorCode":null,"errorMessage":"[doubao_new] merge blocks incomplete: %v","messagePattern":"\\[doubao_new\\] merge blocks incomplete: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"drivers/doubao_new/driver.go","lineNumber":316,"sourceCode":"\t\t\tif len(data) > 0 {\n\t\t\t\theadLen := 32\n\t\t\t\tif len(data) < headLen {\n\t\t\t\t\theadLen = len(data)\n\t\t\t\t}\n\t\t\t\ttailLen := 32\n\t\t\t\tif len(data) < tailLen {\n\t\t\t\t\ttailLen = len(data)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif int64(len(data)) != expectLen {\n\t\t\t\treturn fmt.Errorf(\"[doubao_new] merge blocks invalid body len: got=%d expect=%d seqs=%v\", len(data), expectLen, groupSeqs)\n\t\t\t}\n\t\t\tmergeResp, err := d.mergeUploadBlocks(ctx, uploadPrep.UploadID, groupSeqs, groupChecksums, groupSizes, blockSize, data)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif len(mergeResp.SuccessSeqList) != len(groupSeqs) {\n\t\t\t\treturn fmt.Errorf(\"[doubao_new] merge blocks incomplete: %v\", mergeResp.SuccessSeqList)\n\t\t\t}\n\t\t\tsuccess := make(map[int]bool, len(mergeResp.SuccessSeqList))\n\t\t\tfor _, seq := range mergeResp.SuccessSeqList {\n\t\t\t\tsuccess[seq] = true\n\t\t\t}\n\t\t\tfor _, seq := range groupSeqs {\n\t\t\t\tif !success[seq] {\n\t\t\t\t\treturn fmt.Errorf(\"[doubao_new] merge blocks missing seq %d\", seq)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tuploadedBytes += groupRealSize\n\t\t\tgroupSeqs = groupSeqs[:0]\n\t\t\tgroupChecksums = groupChecksums[:0]\n\t\t\tgroupSizes = groupSizes[:0]\n\t\t\tgroupRealSize = 0\n\t\t\tgroupExpectSum = 0\n\t\t\tgroupBuf.Reset()","sourceCodeStart":298,"sourceCodeEnd":334,"githubUrl":"https://github.com/AlistGo/alist/blob/843d9dc8149126976b2625911e45a4d3ffd6f2f5/drivers/doubao_new/driver.go#L298-L334","documentation":"Doubao_new merge response validation: the server's SuccessSeqList from mergeUploadBlocks contains fewer entries than the group of block seqs that were submitted. The server only merged some blocks, so the client refuses to consider the group uploaded.","triggerScenarios":"mergeUploadBlocks responds 2xx but SuccessSeqList is short — server-side partial acceptance when one block in the group fails its checksum or is rejected, rate-limited merges dropping seqs, or a response parsing issue losing entries.","commonSituations":"Flaky server behavior under load, one corrupted block in a 20-block merge group (maxMergeBlockCount=20), API change returning success list under a different field so it unmarshals empty/partial, or interleaved dedup state where some blocks were already merged by a concurrent session.","solutions":["Retry the upload pass — needed-blocks is re-queried so already-merged blocks drop out and only stragglers remain","If the same block always fails, its checksum will surface in the block checksum mismatch error next — treat this as an early symptom","Check for concurrent uploads of the same file from another client/session","Re-authenticate; some partial-merge responses stem from expired session state on the merge endpoint","Report upstream with the seq list if persistent"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"if err := flushGroup(); err != nil && strings.Contains(err.Error(), \"merge blocks incomplete\") {\n    // re-query needed blocks; already-merged seqs drop out and stragglers resubmit\n    return d.uploadPass(ctx, ...)\n}","preventionTips":["Expect partial merge acceptance under load; always design for a re-query pass","Avoid parallel merge-heavy uploads against the same space","Re-authenticate if merges repeatedly return partial lists"],"tags":["doubao-new","upload","merge","partial-failure","go"],"backgroundTag":null,"analyzedSha":"843d9dc8149126976b2625911e45a4d3ffd6f2f5","analyzedAt":"2026-08-15T12:14:11.722Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}