{"record":{"id":"a98981351c4780a9","repo":"hyperledger/fabric","slug":"didn-t-receive-a-response-within-v","errorCode":null,"errorMessage":"didn't receive a response within %v","messagePattern":"didn't receive a response within (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/common/cluster/deliver.go","lineNumber":595,"sourceCode":"\n\tresponseChan := make(chan errorAndResponse, 1)\n\n\t// receive waitGroup ensures the goroutine below exits before\n\t// this function exits.\n\tvar receive sync.WaitGroup\n\treceive.Add(1)\n\tdefer receive.Wait()\n\n\tgo func() {\n\t\tdefer receive.Done()\n\t\tresp, err := stream.AtomicBroadcast_DeliverClient.Recv()\n\t\tresponseChan <- errorAndResponse{err: err, resp: resp}\n\t}()\n\n\tselect {\n\tcase <-timeout.C:\n\t\tstream.cancelFunc()\n\t\treturn nil, errors.Errorf(\"didn't receive a response within %v\", stream.waitTimeout)\n\tcase respAndErr := <-responseChan:\n\t\treturn respAndErr.resp, respAndErr.err\n\t}\n}\n\n// NewImpatientStream returns a ImpatientStreamCreator that creates impatientStreams.\nfunc NewImpatientStream(conn *grpc.ClientConn, waitTimeout time.Duration) ImpatientStreamCreator {\n\treturn func() (*ImpatientStream, error) {\n\t\tabc := orderer.NewAtomicBroadcastClient(conn)\n\t\tctx, cancel := context.WithCancel(context.Background())\n\n\t\tstream, err := abc.Deliver(ctx)\n\t\tif err != nil {\n\t\t\tcancel()\n\t\t\treturn nil, err\n\t\t}\n\n\t\tcert := util.ExtractCertificateFromContext(stream.Context())","sourceCodeStart":577,"sourceCodeEnd":613,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/common/cluster/deliver.go#L577-L613","documentation":"The impatientStream's Recv wraps the underlying gRPC Recv in a select with a timeout; if the remote ordering node sends no Deliver/Step response before stream.waitTimeout elapses, the stream is cancelled and this error is returned. It indicates an unresponsive or overloaded remote node.","triggerScenarios":"Recv is called on an impatient stream and the remote endpoint doesn't produce any response within the configured wait timeout (e.g. RequestTimeout / puller timeout settings); the network drops packets after connection establishment; the remote node hangs processing the seek.","commonSituations":"Slow or saturated ordering node under heavy consensus load; network partition or firewall silently dropping the gRPC stream; misconfigured timeout values too small for large block pulls; node dead but TCP connection not yet closed.","solutions":["Increase the relevant timeout configuration (e.g. General.Cluster.SendBufferSize / deliver request timeout) if pulls legitimately take long","Check connectivity/latency to the remote ordering node (ping, TLS handshake, firewall rules)","Restart or repair the unresponsive ordering node","Verify the cluster endpoint list contains reachable nodes so the puller can fail over"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"conn, err := grpc.DialContext(ctx, endpoint, grpc.WithBlock(), grpc.WithTimeout(waitTimeout))\nif err != nil { return fmt.Errorf(\"endpoint unreachable before Recv: %w\", err) }","typeGuard":null,"tryCatchPattern":"resp, err := stream.Recv()\nif err != nil {\n    if strings.Contains(err.Error(), \"didn't receive a response within\") {\n        // treat as timeout: cancel and retry on another endpoint\n    }\n    return err\n}","preventionTips":["Size waitTimeout above worst-case block delivery latency","Monitor network latency and packet loss between orderers","Set liveness/health checks on ordering nodes","Fail over endpoints promptly on timeouts"],"tags":["fabric","orderer","timeout","grpc","network"],"backgroundTag":"grpc-deadline-exceeded","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}