brpc icon indicating copy to clipboard operation
brpc copied to clipboard

GRPC client error: connection closed before server preface received

Open icexin opened this issue 3 months ago • 7 comments

Describe the bug When using a GRPC client to call a brpc server with redis protocol enabled, the client will failed with code = Unavailable desc = connection closed before server preface received.

Introduced by #3024 , the Redis protocol check is too loose, and it parses the GRPC protocol as the Redis protocol.

To Reproduce

This is the code to reproduce the the issue.

#include <brpc/server.h>

class RedisService : public brpc::RedisService {
};

int main(int argc, char* argv[]) {
    google::ParseCommandLineFlags(&argc, &argv, true);
    brpc::Server server;
    brpc::ServerOptions options;
    RedisService redis_service;
    options.redis_service = &redis_service;
    if (server.Start(7447, &options) != 0) {
        LOG(ERROR) << "Failed to start dummy server";
        return 1;
    }
    server.RunUntilAskedToQuit();
    return 0;
}

Expected behavior

The GRPC client failed with `code = Unimplemented desc = [10.234.44.157:4003][E1002]Fail to find method on /service.method"

Versions OS: ubuntu 20.04 kernel: 5.15.0 Compiler: clang-12 brpc: 1.14.1 protobuf: 27.3

Additional context/screenshots

icexin avatar Sep 29 '25 10:09 icexin

有人关注这个issue吗?对于开启了brpc(grpc)和redis双协议的服务是一个比较致命的bug

icexin avatar Oct 09 '25 02:10 icexin

@wwbmmm

icexin avatar Oct 09 '25 03:10 icexin

@thweetkomputer

icexin avatar Oct 11 '25 08:10 icexin

What does the grpc client send to brpc server?

thweetkomputer avatar Oct 11 '25 09:10 thweetkomputer

maybe can restrict brpc inline protocol only accept letters.

thweetkomputer avatar Oct 11 '25 09:10 thweetkomputer

The redis inline protocol needs to clearly specify which message headers are acceptable, because many protocols also start with plaintext letters.

icexin avatar Oct 11 '25 11:10 icexin

If the Redis inline protocol cannot clearly identify the protocol, we can treat the Redis inline protocol as a new protocol and put it at the end of ProtocolType, so that it will not affect the existing protocol.

chenBright avatar Oct 15 '25 12:10 chenBright