{"record":{"id":"54ed7cadb13ebb00","repo":"caddyserver/caddy","slug":"storing-updated-ech-config-metadata-v","errorCode":null,"errorMessage":"storing updated ECH config metadata: %v","messagePattern":"storing updated ECH config metadata: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"modules/caddytls/ech.go","lineNumber":250,"sourceCode":"\t\t\t\t\tzap.Duration(\"age\", time.Since(cfg.meta.Created)),\n\t\t\t\t\tzap.Duration(\"rotation_interval\", rotationInterval))\n\n\t\t\t\t// start by generating and storing the replacement ECH config\n\t\t\t\tnewCfg, err := generateAndStoreECHConfig(ctx, publicName)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"generating and storing new replacement ECH config: %w\", err)\n\t\t\t\t}\n\n\t\t\t\t// mark the key as replaced so we don't rotate it again, and instead delete it later\n\t\t\t\tech.configs[publicName][i].meta.Replaced = time.Now()\n\n\t\t\t\t// persist the updated metadata\n\t\t\t\tmetaBytes, err := json.Marshal(ech.configs[publicName][i].meta)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"marshaling updated ECH config metadata: %v\", err)\n\t\t\t\t}\n\t\t\t\tif err := storage.Store(ctx, echMetaKey(cfg.ConfigID), metaBytes); err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"storing updated ECH config metadata: %v\", err)\n\t\t\t\t}\n\n\t\t\t\tech.configs[publicName] = append(ech.configs[publicName], newCfg)\n\n\t\t\t\tlogger.Debug(\"rotated ECH key\",\n\t\t\t\t\tzap.String(\"public_name\", cfg.RawPublicName),\n\t\t\t\t\tzap.Uint8(\"old_id\", cfg.ConfigID),\n\t\t\t\t\tzap.Uint8(\"new_id\", newCfg.ConfigID))\n\t\t\t} else if time.Since(cfg.meta.Created) >= deleteAfter && !cfg.meta.Replaced.IsZero() {\n\t\t\t\t// key has expired and is no longer supported; delete it from storage and memory\n\t\t\t\tcfgIDKey := path.Join(echConfigsKey, strconv.Itoa(int(cfg.ConfigID)))\n\t\t\t\tif err := storage.Delete(ctx, cfgIDKey); err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"deleting expired ECH config: %v\", err)\n\t\t\t\t}\n\n\t\t\t\tech.configs[publicName] = append(ech.configs[publicName][:i], ech.configs[publicName][i+1:]...)\n\t\t\t\ti--\n","sourceCodeStart":232,"sourceCodeEnd":268,"githubUrl":"https://github.com/caddyserver/caddy/blob/50e54ee279aa1e504fe218ca49ab6ae16c100410/modules/caddytls/ech.go#L232-L268","documentation":"Error \"storing updated ECH config metadata: %v\" thrown in caddyserver/caddy.","triggerScenarios":"Thrown at modules/caddytls/ech.go:250 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Check storage backend availability and permissions; the ECH config metadata could not be written."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"50e54ee279aa1e504fe218ca49ab6ae16c100410","analyzedAt":"2026-08-15T09:20:21.641Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}