{"record":{"id":"c87a3405710e913a","repo":"AdguardTeam/AdGuardHome","slug":"unknown-ipset-q","errorCode":null,"errorMessage":"unknown ipset %q","messagePattern":"unknown ipset %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/ipset/ipset_linux.go","lineNumber":343,"sourceCode":"\treturn props{\n\t\tname:         name,\n\t\ttypeName:     typeName,\n\t\tfamily:       family,\n\t\tisPersistent: false,\n\t}, nil\n}\n\n// ipsets returns ipset properties of currently known ipsets.  It also makes an\n// additional ipset header data query if needed.\nfunc (m *manager) ipsets(\n\tctx context.Context,\n\tnames []string,\n\tcurrentlyKnown map[string]props,\n) (sets []props, err error) {\n\tfor _, n := range names {\n\t\tp, ok := currentlyKnown[n]\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"unknown ipset %q\", n)\n\t\t}\n\n\t\tif p.family != netfilter.ProtoIPv4 && p.family != netfilter.ProtoIPv6 {\n\t\t\tm.logger.DebugContext(\n\t\t\t\tctx,\n\t\t\t\t\"got unexpected ipset family while getting set properties\",\n\t\t\t\t\"set_name\", p.name,\n\t\t\t\t\"set_type\", p.typeName,\n\t\t\t\t\"set_family\", p.family,\n\t\t\t)\n\n\t\t\tp, err = m.ipsetProps(n)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"%q %q making header query: %w\", p.name, p.typeName, err)\n\t\t\t}\n\t\t}\n\n\t\tm.nameToIpset[n] = p","sourceCodeStart":325,"sourceCodeEnd":361,"githubUrl":"https://github.com/AdguardTeam/AdGuardHome/blob/b41aefbe51c8dde65e2c50f093996afa0502edf9/internal/ipset/ipset_linux.go#L325-L361","documentation":"A config line references an ipset name that is not present in the map of sets currently known on the system (built from the initial list query and earlier processing).","triggerScenarios":"m.ipsets looks up names[i] in currentlyKnown and misses: set not created, typo, or race where the set was destroyed between listing and lookup.","commonSituations":"Forgetting 'ipset create' before starting the service, name case/spelling mismatch, or sets wiped by firewall reload.","solutions":["Create the ipset before starting: 'ipset create <name> hash:ip'","Check exact spelling/case against 'ipset list' output","Persist sets so they survive reboots/firewall restarts"],"exampleFix":"# before\n# config references adguard-block but set missing\n# after\nipset create adguard-block hash:ip family inet timeout 0","handlingStrategy":"validation","validationCode":"func setExists(name string) bool {\n\tout, _ := exec.Command(\"ipset\", \"list\", name).CombinedOutput()\n\treturn !bytes.Contains(out, []byte(\"doesn't exist\")) && len(out) > 0\n}","typeGuard":null,"tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"unknown ipset\") {\n\t_ = exec.Command(\"ipset\", \"create\", name, \"hash:ip\").Run()\n\t// retry init\n}","preventionTips":["Provision sets before service start; re-check after every firewall reload","Name sets exactly (case-sensitive) as in config"],"tags":["ipset","lookup","config"],"backgroundTag":"resource-not-found","analyzedSha":"b41aefbe51c8dde65e2c50f093996afa0502edf9","analyzedAt":"2026-08-27T04:57:55.097Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}