{"record":{"id":"8e0a33004de43373","repo":"thanos-io/thanos","slug":"sending-metadata-error-to-server-v","errorCode":null,"errorMessage":"sending metadata error to server %v","messagePattern":"sending metadata error to server (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/metadata/proxy.go","lineNumber":135,"sourceCode":"\t\t// Not an error if response strategy is warning.\n\t\treturn nil\n\t}\n\n\tfor {\n\t\tresp, err := metadataCli.Recv()\n\t\tif err == io.EOF {\n\t\t\treturn nil\n\t\t}\n\n\t\tif err != nil {\n\t\t\terr = errors.Wrapf(err, \"receiving metric metadata from metadata client %v\", stream.client)\n\n\t\t\tif stream.request.PartialResponseStrategy == storepb.PartialResponseStrategy_ABORT {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tif err := stream.server.Send(metadatapb.NewWarningMetadataResponse(err)); err != nil {\n\t\t\t\treturn errors.Wrapf(err, \"sending metadata error to server %v\", stream.server)\n\t\t\t}\n\n\t\t\t// Not an error if response strategy is warning.\n\t\t\treturn nil\n\t\t}\n\n\t\tif w := resp.GetWarning(); w != \"\" {\n\t\t\tif err := stream.server.Send(metadatapb.NewWarningMetadataResponse(errors.New(w))); err != nil {\n\t\t\t\treturn errors.Wrapf(err, \"sending metadata warning to server %v\", stream.server)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tselect {\n\t\tcase stream.channel <- resp.GetMetadata():\n\t\tcase <-ctx.Done():\n\t\t\treturn ctx.Err()\n\t\t}","sourceCodeStart":117,"sourceCodeEnd":153,"githubUrl":"https://github.com/thanos-io/thanos/blob/35b8b991177def87ed52dcf10f9b6d87f07282c8/pkg/metadata/proxy.go#L117-L153","documentation":"When an upstream stream error must be relayed to the caller as a warning response, a failure of that relay Send is wrapped with 'sending metadata error to server %v'. This is a secondary failure: reporting the original error also failed.","triggerScenarios":"stream.server.Send(NewWarningMetadataResponse(err)) fails while handling a previous upstream error under the WARNING partial-response strategy.","commonSituations":"Caller disconnected right as the proxy tried to report the upstream failure; client stream already closed/canceled.","solutions":["Treat as a client-disconnect if the wrapped status is Canceled; log and stop","Retry only if the client is still connected","Monitor for repeated occurrences — indicates upstream errors plus flaky clients","Check the wrapped original upstream error for the root cause"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"if err := relay(err); err != nil {\n    if status.Code(err) == codes.Canceled {\n        return nil // caller disconnected; nothing to do\n    }\n    return err\n}","preventionTips":["Treat codes.Canceled during relay as benign client disconnect","Keep underlying upstream error context in logs","Monitor rates of double failures (upstream error + failed relay)"],"tags":["grpc","streaming","client-disconnect"],"backgroundTag":"broken-pipe","analyzedSha":"35b8b991177def87ed52dcf10f9b6d87f07282c8","analyzedAt":"2026-09-07T01:49:59.689Z","contentChangedAt":"2026-09-07T01:49:59.689Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}