{"record":{"id":"8e388aebf00be38b","repo":"tailscale/tailscale","slug":"reading-parent-s-v","errorCode":null,"errorMessage":"reading parent %s: %v","messagePattern":"reading parent (.+?): (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"tka/tka.go","lineNumber":109,"sourceCode":"\n\t// candidates.Oldest needs to be computed by working backwards from\n\t// head as far as we can.\n\titerAgain := true // if there's still work to be done.\n\tfor i := 0; iterAgain; i++ {\n\t\tif i >= maxIter {\n\t\t\treturn nil, fmt.Errorf(\"iteration limit exceeded (%d)\", maxIter)\n\t\t}\n\n\t\titerAgain = false\n\t\tfor j := range candidates {\n\t\t\tparentHash, hasParent := candidates[j].Oldest.Parent()\n\t\t\tif hasParent {\n\t\t\t\tparent, err := storage.AUM(parentHash)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err == os.ErrNotExist {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, fmt.Errorf(\"reading parent %s: %v\", parentHash, err)\n\t\t\t\t}\n\t\t\t\tcandidates[j].Oldest = parent\n\t\t\t\tif lastKnownOldest != nil && *lastKnownOldest == parent.Hash() {\n\t\t\t\t\tcandidates[j].chainsThroughActive = true\n\t\t\t\t}\n\t\t\t\titerAgain = true\n\t\t\t}\n\t\t}\n\t}\n\treturn candidates, nil\n}\n\n// pickNextAUM returns the AUM which should be used as the next\n// AUM in the chain, possibly applying fork resolution logic.\n//\n// In other words: given an AUM with 3 children like this:\n//\n//\t  / - 1","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/tailscale/tailscale/blob/6e0912f97994f927632b34ae9e63b53d6516a6ac/tka/tka.go#L91-L127","documentation":"Raised in computeChainCandidates when loading a candidate's parent AUM from Chonk storage fails with anything other than ErrNotExist. A missing parent is expected (chain start) and skipped; any other storage error is fatal to chain computation.","triggerScenarios":"Thrown at tka/tka.go:109 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Check the health of the underlying TKA storage backend","Retry the state computation after transient I/O failures clear","Inspect the wrapped storage error for the failing key/hash"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"6e0912f97994f927632b34ae9e63b53d6516a6ac","analyzedAt":"2026-08-18T08:17:25.280Z","contentChangedAt":"2026-08-18T08:17:25.280Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}