3939#include " brpc/policy/most_common_message.h"
4040#include " brpc/policy/http_rpc_protocol.h"
4141#include " brpc/server.h"
42+ #include " brpc/details/server_private_accessor.h"
4243#include " brpc/channel.h"
4344#include " brpc/controller.h"
4445#include " health_check.pb.h"
@@ -59,6 +60,8 @@ DECLARE_bool(socket_keepalive);
5960DECLARE_int32 (socket_keepalive_idle_s);
6061DECLARE_int32 (socket_keepalive_interval_s);
6162DECLARE_int32 (socket_keepalive_count);
63+ DECLARE_int32 (socket_recv_buffer_size);
64+ DECLARE_int32 (socket_send_buffer_size);
6265DECLARE_int32 (socket_tcp_user_timeout_ms);
6366}
6467
@@ -1123,6 +1126,48 @@ void CheckKeepalive(int fd,
11231126 ASSERT_EQ (expected_keepalive_count, keepalive_count);
11241127}
11251128
1129+ struct SocketBufferValues {
1130+ int recv_buffer;
1131+ int send_buffer;
1132+
1133+ SocketBufferValues () : recv_buffer(0 ), send_buffer(0 ) {}
1134+ };
1135+
1136+ void GetSocketBufferValues (int fd, SocketBufferValues* values) {
1137+ socklen_t len = sizeof (values->recv_buffer );
1138+ ASSERT_EQ (0 , getsockopt (fd, SOL_SOCKET , SO_RCVBUF ,
1139+ &values->recv_buffer , &len));
1140+ len = sizeof (values->send_buffer );
1141+ ASSERT_EQ (0 , getsockopt (fd, SOL_SOCKET , SO_SNDBUF ,
1142+ &values->send_buffer , &len));
1143+ }
1144+
1145+ void GetExpectedSocketBufferValues (int buffer_size,
1146+ SocketBufferValues* expected) {
1147+ SocketBufferValues default_values;
1148+ butil::fd_guard default_fd (socket (AF_INET , SOCK_STREAM , 0 ));
1149+ ASSERT_GT (default_fd, 0 );
1150+ GetSocketBufferValues (default_fd, &default_values);
1151+
1152+ butil::fd_guard reference_fd (socket (AF_INET , SOCK_STREAM , 0 ));
1153+ ASSERT_GT (reference_fd, 0 );
1154+ ASSERT_EQ (0 , setsockopt (reference_fd, SOL_SOCKET , SO_RCVBUF , &buffer_size,
1155+ sizeof (buffer_size)));
1156+ ASSERT_EQ (0 , setsockopt (reference_fd, SOL_SOCKET , SO_SNDBUF , &buffer_size,
1157+ sizeof (buffer_size)));
1158+ GetSocketBufferValues (reference_fd, expected);
1159+
1160+ ASSERT_NE (default_values.recv_buffer , expected->recv_buffer );
1161+ ASSERT_NE (default_values.send_buffer , expected->send_buffer );
1162+ }
1163+
1164+ void CheckSocketBufferValues (int fd, const SocketBufferValues& expected) {
1165+ SocketBufferValues actual;
1166+ GetSocketBufferValues (fd, &actual);
1167+ ASSERT_EQ (expected.recv_buffer , actual.recv_buffer );
1168+ ASSERT_EQ (expected.send_buffer , actual.send_buffer );
1169+ }
1170+
11261171TEST_F (SocketTest, keepalive) {
11271172 int default_keepalive = 0 ;
11281173 int default_keepalive_idle = 0 ;
@@ -1425,6 +1470,97 @@ TEST_F(SocketTest, keepalive_input_message) {
14251470 ASSERT_EQ (EBADF , errno);
14261471}
14271472
1473+ TEST_F (SocketTest, socket_buffer_options_before_connect) {
1474+ gflags::FlagSaver flag_saver;
1475+ const int buffer_size = 256 * 1024 ;
1476+ brpc::FLAGS_socket_recv_buffer_size = buffer_size;
1477+ brpc::FLAGS_socket_send_buffer_size = buffer_size;
1478+
1479+ SocketBufferValues expected;
1480+ GetExpectedSocketBufferValues (buffer_size, &expected);
1481+
1482+ butil::EndPoint point;
1483+ ASSERT_EQ (0 , str2endpoint (" 127.0.0.1:0" , &point));
1484+ butil::fd_guard listening_fd (tcp_listen (point));
1485+ ASSERT_GT (listening_fd, 0 ) << berror ();
1486+ ASSERT_EQ (0 , butil::get_local_side (listening_fd, &point));
1487+
1488+ brpc::SocketOptions options;
1489+ options.remote_side = point;
1490+ brpc::SocketId id = brpc::INVALID_SOCKET_ID ;
1491+ ASSERT_EQ (0 , brpc::Socket::Create (options, &id));
1492+
1493+ brpc::SocketUniquePtr ptr;
1494+ ASSERT_EQ (0 , brpc::Socket::Address (id, &ptr)) << " id=" << id;
1495+
1496+ const timespec duetime = butil::milliseconds_from_now (1000 );
1497+ butil::fd_guard connected_fd (ptr->Connect (&duetime, NULL , NULL ));
1498+ ASSERT_GT (connected_fd, 0 );
1499+ CheckSocketBufferValues (connected_fd, expected);
1500+
1501+ ASSERT_EQ (0 , ptr->SetFailed ());
1502+ }
1503+
1504+ TEST_F (SocketTest, socket_buffer_options_before_accept) {
1505+ gflags::FlagSaver flag_saver;
1506+ const int buffer_size = 256 * 1024 ;
1507+ brpc::FLAGS_socket_recv_buffer_size = buffer_size;
1508+ brpc::FLAGS_socket_send_buffer_size = buffer_size;
1509+
1510+ SocketBufferValues expected;
1511+ GetExpectedSocketBufferValues (buffer_size, &expected);
1512+
1513+ butil::EndPoint point;
1514+ ASSERT_EQ (0 , str2endpoint (" 127.0.0.1:0" , &point));
1515+ brpc::Server server;
1516+ ASSERT_EQ (0 , server.Start (point, NULL ));
1517+ point = server.listen_address ();
1518+
1519+ brpc::Acceptor* messenger =
1520+ brpc::ServerPrivateAccessor (&server).acceptor ();
1521+ ASSERT_TRUE (messenger != NULL );
1522+ ASSERT_GT (messenger->listened_fd (), 0 );
1523+ CheckSocketBufferValues (messenger->listened_fd (), expected);
1524+
1525+ // Accepted sockets should inherit the listener's buffer sizes, not use
1526+ // the flags at accept time.
1527+ brpc::FLAGS_socket_recv_buffer_size = buffer_size / 2 ;
1528+ brpc::FLAGS_socket_send_buffer_size = buffer_size / 2 ;
1529+
1530+ brpc::SocketOptions options;
1531+ options.remote_side = point;
1532+ options.connect_on_create = true ;
1533+ brpc::SocketId id = brpc::INVALID_SOCKET_ID ;
1534+ ASSERT_EQ (0 , brpc::Socket::Create (options, &id));
1535+
1536+ const int64_t start_time = butil::cpuwide_time_us ();
1537+ while (messenger->ConnectionCount () < 1 ) {
1538+ bthread_usleep (1000 );
1539+ ASSERT_LT (butil::cpuwide_time_us (), start_time + 1000000L )
1540+ << " Too long!" ;
1541+ }
1542+
1543+ std::vector<brpc::SocketId> connections;
1544+ messenger->ListConnections (&connections);
1545+ ASSERT_EQ (1ul , connections.size ());
1546+
1547+ {
1548+ brpc::SocketUniquePtr accepted_socket;
1549+ ASSERT_EQ (0 , brpc::Socket::Address (connections[0 ], &accepted_socket));
1550+ ASSERT_GT (accepted_socket->fd (), 0 );
1551+ CheckSocketBufferValues (accepted_socket->fd (), expected);
1552+ ASSERT_EQ (0 , accepted_socket->SetFailed ());
1553+ }
1554+
1555+ {
1556+ brpc::SocketUniquePtr client_socket;
1557+ ASSERT_EQ (0 , brpc::Socket::Address (id, &client_socket));
1558+ ASSERT_EQ (0 , client_socket->SetFailed ());
1559+ }
1560+ server.Stop (0 );
1561+ server.Join ();
1562+ }
1563+
14281564#if defined(OS_LINUX)
14291565void CheckTCPUserTimeout (int fd, int expect_tcp_user_timeout) {
14301566 int tcp_user_timeout = 0 ;
0 commit comments