{"record":{"id":"89ad1daad8aa79a5","repo":"ipfs/kubo","slug":"unique-entities-must-combine-with-pinned-and-or","errorCode":null,"errorMessage":"+unique/+entities must combine with pinned and/or mfs in %q","messagePattern":"\\+unique/\\+entities must combine with pinned and/or mfs in %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"config/provide.go","lineNumber":176,"sourceCode":"\t\t\tstrategy |= ProvideStrategyMFS\n\t\tcase \"unique\":\n\t\t\tstrategy |= ProvideStrategyUnique\n\t\tcase \"entities\":\n\t\t\tstrategy |= ProvideStrategyEntities | ProvideStrategyUnique\n\t\tdefault:\n\t\t\treturn 0, fmt.Errorf(\"unknown provide strategy token: %q in %q\", part, s)\n\t\t}\n\t}\n\t// \"all\" provides every block and cannot be combined with selective strategies\n\tif strategy&ProvideStrategyAll != 0 && strategy != ProvideStrategyAll {\n\t\treturn 0, fmt.Errorf(\"\\\"all\\\" strategy cannot be combined with other strategies in %q\", s)\n\t}\n\t// +unique/+entities require a base strategy that walks DAGs (pinned and/or mfs)\n\twantsDedup := strategy&(ProvideStrategyUnique|ProvideStrategyEntities) != 0\n\tif wantsDedup {\n\t\twalksDAGs := strategy&(ProvideStrategyPinned|ProvideStrategyMFS) != 0\n\t\tif !walksDAGs {\n\t\t\treturn 0, fmt.Errorf(\"+unique/+entities must combine with pinned and/or mfs in %q\", s)\n\t\t}\n\t\tif strategy&ProvideStrategyRoots != 0 {\n\t\t\treturn 0, fmt.Errorf(\"+unique/+entities is incompatible with roots in %q\", s)\n\t\t}\n\t}\n\treturn strategy, nil\n}\n\n// MustParseProvideStrategy is like ParseProvideStrategy but panics on error.\n// Use with strategy strings that have already been validated at startup.\nfunc MustParseProvideStrategy(s string) ProvideStrategy {\n\tstrategy, err := ParseProvideStrategy(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn strategy\n}\n","sourceCodeStart":158,"sourceCodeEnd":194,"githubUrl":"https://github.com/ipfs/kubo/blob/329838acdfafae224582930457efe80aa217afc0/config/provide.go#L158-L194","documentation":"The dedup modifiers '+unique' and '+entities' only make sense when a base strategy walks DAGs (pinned and/or mfs); without such a base there is nothing to deduplicate. ParseProvideStrategy enforces this dependency and returns this error when unique/entities bits are set with no pinned/mfs base. A related check rejects '+unique/+entities' combined with 'roots'.","triggerScenarios":"Setting Provide.Strategy to 'unique', 'entities', 'unique+roots', or 'entities+roots' — i.e. dedup modifiers without 'pinned' or 'mfs' — at daemon startup or via ValidateProvideConfig.","commonSituations":"Assuming '+unique' can stand alone or combine with 'roots' when trimming provide load; copying a partial example from documentation that omitted the required base tokens; tuning configs incrementally and dropping the base token by accident.","solutions":["Add a DAG-walking base: ipfs config Provide.Strategy 'pinned+unique' or 'mfs+entities' (both pinned and mfs work)","If 'roots' was intended as the base, note roots is incompatible with unique/entities — switch to 'pinned+unique'","Use 'pinned+mfs+unique' if dedup should span both pinset and MFS walks"],"exampleFix":"// before\nipfs config Provide.Strategy 'unique'\n// after\nipfs config Provide.Strategy 'pinned+unique'","handlingStrategy":"validation","validationCode":"tokens := strings.Split(s, \"+\")\nhasDedup := slices.Contains(tokens, \"unique\") || slices.Contains(tokens, \"entities\")\nhasBase := slices.Contains(tokens, \"pinned\") || slices.Contains(tokens, \"mfs\")\nif hasDedup && (!hasBase || slices.Contains(tokens, \"roots\")) {\n\treturn fmt.Errorf(\"unique/entities need pinned and/or mfs, and exclude roots\")\n}","typeGuard":"func validDedupCombo(s string) bool {\n\t_, err := config.ParseProvideStrategy(s)\n\treturn err == nil\n}","tryCatchPattern":"strategy, err := config.ParseProvideStrategy(s)\nif err != nil {\n\treturn fmt.Errorf(\"Provide.Strategy %q invalid: %w\", s, err)\n}","preventionTips":["Always pair '+unique'/'+entities' with 'pinned' or 'mfs'","Never combine '+unique'/'+entities' with 'roots'","Prefer the canonical 'pinned+mfs+unique' when in doubt"],"tags":["config","provide","dht","validation"],"backgroundTag":"incompatible-strategy-combination","analyzedSha":"329838acdfafae224582930457efe80aa217afc0","analyzedAt":"2026-09-03T18:30:52.135Z","contentChangedAt":"2026-09-03T18:30:52.135Z","schemaVersion":2},"datasetVersion":"2026-09-11T00:17:11.886Z"}