{"record":{"id":"50c2f6d52657828f","repo":"VictoriaMetrics/VictoriaMetrics","slug":"cannot-write-tenant-q-w","errorCode":null,"errorMessage":"cannot write tenant %q: %w","messagePattern":"cannot write tenant %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"lib/vmselectapi/server.go","lineNumber":919,"sourceCode":"\n\t// Execute the request\n\ttenants, err := s.api.Tenants(ctx.qt, tr, ctx.deadline)\n\tif err != nil {\n\t\treturn ctx.writeErrorMessage(err)\n\t}\n\n\t// Send an empty error message to vmselect.\n\tif err := ctx.writeString(\"\"); err != nil {\n\t\treturn fmt.Errorf(\"cannot send empty error message: %w\", err)\n\t}\n\n\t// Send tenants to vmselect\n\tfor _, tenant := range tenants {\n\t\tif len(tenant) == 0 {\n\t\t\tlogger.Panicf(\"BUG: unexpected empty tenant name\")\n\t\t}\n\t\tif err := ctx.writeString(tenant); err != nil {\n\t\t\treturn fmt.Errorf(\"cannot write tenant %q: %w\", tenant, err)\n\t\t}\n\t}\n\t// Send 'end of response' marker\n\tif err := ctx.writeString(\"\"); err != nil {\n\t\treturn fmt.Errorf(\"cannot send 'end of response' marker\")\n\t}\n\treturn nil\n}\n\nfunc writeTSDBStatus(ctx *vmselectRequestCtx, status *storage.TSDBStatus) error {\n\tif err := ctx.writeUint64(status.TotalSeries); err != nil {\n\t\treturn fmt.Errorf(\"cannot write totalSeries to vmselect: %w\", err)\n\t}\n\tif err := ctx.writeUint64(status.TotalLabelValuePairs); err != nil {\n\t\treturn fmt.Errorf(\"cannot write totalLabelValuePairs to vmselect: %w\", err)\n\t}\n\tif err := writeTopHeapEntries(ctx, status.SeriesCountByMetricName); err != nil {\n\t\treturn fmt.Errorf(\"cannot write seriesCountByMetricName to vmselect: %w\", err)","sourceCodeStart":901,"sourceCodeEnd":937,"githubUrl":"https://github.com/VictoriaMetrics/VictoriaMetrics/blob/5079fb58f1e8e62113f90c945ad71586c797d770/lib/vmselectapi/server.go#L901-L937","documentation":"Fires in processTenants while streaming the list of tenant names back to vmselect: one of the writeString calls on the RPC connection failed. The tenants query itself succeeded; only the response transport broke, so the caller receives the write error instead of tenant data.","triggerScenarios":"Thrown at lib/vmselectapi/server.go:919 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Check for network interruptions between vmstorage and vmselect","Verify vmselect is still running and has not closed the RPC connection","Review logs for preceding timeout or connection-reset errors","Retry the tenants request; the error is typically transient"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"5079fb58f1e8e62113f90c945ad71586c797d770","analyzedAt":"2026-09-03T18:10:26.153Z","contentChangedAt":"2026-09-03T18:10:26.153Z","schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}