{"record":{"id":"98e21c6b60c02fff","repo":"siyuan-note/siyuan","slug":"get-checksum-manifest-failed-d","errorCode":null,"errorMessage":"get checksum manifest failed: %d","messagePattern":"get checksum manifest failed: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/model/updater_release.go","lineNumber":392,"sourceCode":"\t\tcached, ok := githubManifestCache.Load(manifestCacheKey)\n\t\tif ok {\n\t\t\tif checksum := parseChecksumManifest(cached.(string), pkgName); \"\" != checksum {\n\t\t\t\treturn checksum, nil\n\t\t\t}\n\t\t\treturn \"\", errors.New(\"package checksum is unavailable\")\n\t\t}\n\t}\n\n\tresponse, err := httpclient.NewCloudRequest30s().SetContext(ctx).Get(manifestAsset.BrowserDownloadURL)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tif nil == response || nil == response.Response {\n\t\treturn \"\", errors.New(\"checksum manifest response is empty\")\n\t}\n\tdefer response.Body.Close()\n\tif 200 != response.StatusCode {\n\t\treturn \"\", fmt.Errorf(\"get checksum manifest failed: %d\", response.StatusCode)\n\t}\n\tdata, err := io.ReadAll(io.LimitReader(response.Body, maxChecksumManifestSize+1))\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tif maxChecksumManifestSize < int64(len(data)) {\n\t\treturn \"\", errors.New(\"checksum manifest is too large\")\n\t}\n\tif \"\" != manifestDigest {\n\t\tactualDigest := fmt.Sprintf(\"%x\", sha256.Sum256(data))\n\t\tif manifestDigest != actualDigest {\n\t\t\treturn \"\", errors.New(\"checksum manifest digest mismatch\")\n\t\t}\n\t}\n\tmanifest := string(data)\n\tif \"\" != manifestCacheKey {\n\t\tgithubManifestCache.Store(manifestCacheKey, manifest)\n\t}","sourceCodeStart":374,"sourceCodeEnd":410,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/251596fc0de2f9528c00c224252fd073a99973f4/kernel/model/updater_release.go#L374-L410","documentation":"Returned by getGitHubManifestChecksum when the manifest asset download responds with a non-200 status code. The status is embedded. This fetches SHA256SUMS.txt from github.com/.../releases/download/...; failures are usually 404 (asset gone), 403 (rate limit on the download CDN), or 5xx (GitHub outage).","triggerScenarios":"Asset URL returns 404 because the asset was renamed or removed after the release metadata was fetched. 403 from GitHub's download CDN under heavy rate limiting. 5xx during a GitHub outage. A mirror/proxy returning an error page.","commonSituations":"Checking an older release whose manifest asset was later removed. GitHub download CDN rate limiting. Corporate proxy blocking github.com release downloads while allowing the API.","solutions":["Retry shortly; transient CDN/rate-limit failures often clear.","Switch to the stable channel (cloud JSON checksums) to avoid the GitHub download CDN.","Verify the manifest asset URL is still valid on the GitHub release page."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"// Retry across calls; fall back to stable channel on persistent failure.\nchecksum, err := getGitHubManifestChecksum(ctx, release, pkgName)\nif err != nil && strings.Contains(err.Error(), \"get checksum manifest failed\") {\n    // CDN/rate-limit; wait and retry once, else use cloud JSON\n    time.Sleep(30 * time.Second)\n    checksum, err = getGitHubManifestChecksum(ctx, release, pkgName)\n}","preventionTips":["Retry after a short backoff for transient CDN failures.","Fall back to the stable channel's cloud JSON checksums on persistent failure.","Don't burn the GitHub download CDN with tight retry loops."],"tags":["update","checksum","manifest","github","http-status","network"],"backgroundTag":null,"analyzedSha":"251596fc0de2f9528c00c224252fd073a99973f4","analyzedAt":"2026-08-12T21:18:37.123Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}