This is an automated email from the ASF dual-hosted git repository.
chenBright pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brpc.git
The following commit(s) were added to refs/heads/master by this push:
new 16e3c311 Clean up UBRing code and make configuration names (#3471)
16e3c311 is described below
commit 16e3c31158625d31a0c985dac730ccbcd4b4cd49
Author: Chuang Zhang <[email protected]>
AuthorDate: Mon Aug 24 15:54:34 2026 +0800
Clean up UBRing code and make configuration names (#3471)
---
src/brpc/ubshm/shm/shm_ubs.cpp | 11 +++----
src/brpc/ubshm/shm/shm_ubs.h | 4 +--
src/brpc/ubshm/ub_endpoint.cpp | 67 +++++++++++++++++++++---------------------
src/brpc/ubshm/ub_endpoint.h | 31 ++++++++++---------
src/brpc/ubshm/ub_ring.cpp | 42 +++++++++++++++-----------
src/brpc/ubshm/ub_ring.h | 4 +--
src/brpc/ubshm_transport.cpp | 11 +++----
test/brpc_ubring_unittest.cpp | 46 +++++++++++++++++++++++++++++
8 files changed, 135 insertions(+), 81 deletions(-)
diff --git a/src/brpc/ubshm/shm/shm_ubs.cpp b/src/brpc/ubshm/shm/shm_ubs.cpp
index 2d06b0a1..ccbd3259 100644
--- a/src/brpc/ubshm/shm/shm_ubs.cpp
+++ b/src/brpc/ubshm/shm/shm_ubs.cpp
@@ -43,8 +43,9 @@ namespace ubring {
DEFINE_uint32(node_location, 1, "Location of the ub machine.");
DEFINE_bool(shm_wr_delay_comp, true, "Indicates whether to enable the write
relay."
"0: relay; 1: non-relay.");
-DEFINE_int32(ub_flying_io_timeout, 5, "Waiting time for stopping data"
- "sending and receiving when the link is disconnected.");
+DEFINE_int32(ub_flying_io_timeout_s, 5,
+ "Time in seconds to wait for stopping data sending and receiving "
+ "when the link is disconnected.");
char g_region_name[MAX_REGION_NAME_DESC_LENGTH] = {0};
int g_shm_timer_fd = 0;
ShmList *g_shm_list = nullptr;
@@ -450,9 +451,9 @@ void *UbsShmCallback(void* args)
RETURN_CODE UbsShmAddTimer(ShmList *shm_list)
{
- uint32_t timer_interval = FLAGS_ub_flying_io_timeout;
+ const uint32_t timer_interval_s = FLAGS_ub_flying_io_timeout_s;
itimerspec time_spec = {
- .it_interval = {.tv_sec = timer_interval, .tv_nsec = 0},
+ .it_interval = {.tv_sec = timer_interval_s, .tv_nsec = 0},
.it_value = {.tv_sec = 0, .tv_nsec = 1}
};
int timer_fd = TimerStart(&time_spec, UbsShmCallback, (void*)shm_list);
@@ -562,4 +563,4 @@ RETURN_CODE AddShmToList(ShmList *shm_list, SHM *shm)
return UBRING_OK;
}
}
-}
\ No newline at end of file
+}
diff --git a/src/brpc/ubshm/shm/shm_ubs.h b/src/brpc/ubshm/shm/shm_ubs.h
index 3c79dedd..ee936c0a 100644
--- a/src/brpc/ubshm/shm/shm_ubs.h
+++ b/src/brpc/ubshm/shm/shm_ubs.h
@@ -19,7 +19,7 @@
#define BRPC_SHM_UBS_H
namespace brpc {
namespace ubring {
-DECLARE_int32(ub_flying_io_timeout);
+DECLARE_int32(ub_flying_io_timeout_s);
typedef enum TagUbsLogLevel {
UBSM_LOG_DEBUG_LEVEL = 0,
@@ -48,4 +48,4 @@ RETURN_CODE AddShmToList(ShmList *shm_list, SHM *shm);
RETURN_CODE IsExistInShmList(ShmList *shm_list, const SHM *shm);
}
}
-#endif //BRPC_SHM_UBS_H
\ No newline at end of file
+#endif //BRPC_SHM_UBS_H
diff --git a/src/brpc/ubshm/ub_endpoint.cpp b/src/brpc/ubshm/ub_endpoint.cpp
index 45794fdc..31539fda 100644
--- a/src/brpc/ubshm/ub_endpoint.cpp
+++ b/src/brpc/ubshm/ub_endpoint.cpp
@@ -48,9 +48,9 @@ DEFINE_int32(data_queue_size, 4, "data queue size for UB");
DEFINE_bool(ub_trace_verbose, false, "Print log message verbosely");
BRPC_VALIDATE_GFLAG(ub_trace_verbose, brpc::PassValidate);
DEFINE_int32(ub_poller_num, 1, "Poller number in ub polling mode.");
-DEFINE_bool(ub_poller_yield, false, "Yield thread in RDMA polling mode.");
+DEFINE_bool(ub_poller_yield, false, "Yield thread in UBRing polling mode.");
DEFINE_bool(ub_edisp_unsched, false, "Disable event dispatcher schedule");
-DEFINE_bool(ub_disable_bthread, false, "Disable bthread in RDMA");
+DEFINE_bool(ub_disable_bthread, false, "Disable bthread in UBRing polling
mode.");
static const size_t MIN_ONCE_READ = 4096;
static const size_t MAX_ONCE_READ = 524288;
@@ -126,7 +126,7 @@ UBShmEndpoint::UBShmEndpoint(Socket* s)
, _socket_id(s ? s->id() : INVALID_SOCKET_ID)
, _state(UNINIT)
, _ub_ring(nullptr)
- , _cq_sid(INVALID_SOCKET_ID)
+ , _poller_sid(INVALID_SOCKET_ID)
{
_read_butex = bthread::butex_create_checked<butil::atomic<int>>();
}
@@ -141,7 +141,7 @@ void UBShmEndpoint::Reset() {
delete _ub_ring;
_ub_ring = nullptr;
- _cq_sid = INVALID_SOCKET_ID;
+ _poller_sid = INVALID_SOCKET_ID;
_state = UNINIT;
}
@@ -678,15 +678,15 @@ int UBShmEndpoint::AllocateClientResources(ubring::SHM*
local_trx_shm, const cha
SocketOptions options;
options.user = this;
options.keytable_pool = _socket->_keytable_pool;
- if (Socket::Create(options, &_cq_sid) < 0) {
- PLOG(WARNING) << "Fail to create socket for cq";
+ if (Socket::Create(options, &_poller_sid) < 0) {
+ PLOG(WARNING) << "Fail to create socket for UBRing poller";
return -1;
}
int ret = _ub_ring->UbrAllocateLocalShm(local_trx_shm, shm_name);
if (ret != 0) {
return ret;
}
- PollerRegisterEvent(CqSidOp::ADD, EPOLLIN);
+ PollerRegisterEvent(PollerSidOp::ADD, EPOLLIN);
return 0;
}
@@ -703,16 +703,15 @@ int UBShmEndpoint::AllocateServerResources(ubring::SHM*
remote_trx_shm, ubring::
SocketOptions options;
options.user = this;
options.keytable_pool = _socket->_keytable_pool;
- if (Socket::Create(options, &_cq_sid) < 0) {
- PLOG(WARNING) << "Fail to create socket for cq";
+ if (Socket::Create(options, &_poller_sid) < 0) {
+ PLOG(WARNING) << "Fail to create socket for UBRing poller";
return -1;
}
int ret = _ub_ring->UbrAllocateServerShm(remote_trx_shm, local_trx_shm);
if (ret != 0) {
return ret;
}
- // TODO mwj should polling start after the connection is established?
- PollerRegisterEvent(CqSidOp::ADD, EPOLLIN);
+ PollerRegisterEvent(PollerSidOp::ADD, EPOLLIN);
return ret;
}
@@ -720,11 +719,11 @@ void UBShmEndpoint::DeallocateResources() {
if (!_ub_ring) {
return;
}
- PollerRegisterEvent(CqSidOp::REMOVE);
+ PollerRegisterEvent(PollerSidOp::REMOVE);
_ub_ring->UbrTrxClose();
- if (INVALID_SOCKET_ID != _cq_sid) {
+ if (INVALID_SOCKET_ID != _poller_sid) {
SocketUniquePtr s;
- if (Socket::Address(_cq_sid, &s) == 0) {
+ if (Socket::Address(_poller_sid, &s) == 0) {
s->_user = nullptr;
s->_fd = -1;
s->SetFailed();
@@ -840,27 +839,26 @@ int UBShmEndpoint::PollingModeInitialize(bthread_tag_t
tag,
std::unique_ptr<FnArgs> args(static_cast<FnArgs*>(p));
auto poller = args->poller;
auto running = args->running;
- std::unordered_set<CqSidOp, CqSidOpHash, CqSidOpEqual> cq_sids;
- CqSidOp op;
+ std::unordered_set<PollerSidOp, PollerSidOpHash, PollerSidOpEqual>
poller_sids;
+ PollerSidOp op;
if (poller->init_fn) {
poller->init_fn();
}
while (running->load(std::memory_order_relaxed)) {
while (poller->op_queue.Dequeue(op)) {
- if (op.type == CqSidOp::ADD) {
- cq_sids.emplace(op);
- } else if (op.type == CqSidOp::REMOVE) {
- cq_sids.erase(op);
-
- } else if (op.type == CqSidOp::MOD) {
- cq_sids.erase(op);
- cq_sids.emplace(op);
+ if (op.type == PollerSidOp::ADD) {
+ poller_sids.emplace(op);
+ } else if (op.type == PollerSidOp::REMOVE) {
+ poller_sids.erase(op);
+ } else if (op.type == PollerSidOp::MOD) {
+ poller_sids.erase(op);
+ poller_sids.emplace(op);
}
}
- for (auto cq : cq_sids) {
+ for (const auto& poller_sid : poller_sids) {
SocketUniquePtr s;
- if (Socket::Address(cq.sid, &s) < 0) {
+ if (Socket::Address(poller_sid.sid, &s) < 0) {
continue;
}
UBShmEndpoint* ep = static_cast<UBShmEndpoint*>(s->user());
@@ -868,12 +866,12 @@ int UBShmEndpoint::PollingModeInitialize(bthread_tag_t
tag,
continue;
}
- if (cq.event & EPOLLIN) {
- PollIn(ep, cq.event);
+ if (poller_sid.events & EPOLLIN) {
+ PollIn(ep, poller_sid.events);
}
- if (cq.event & EPOLLOUT) {
- PollOut(ep, cq.event);
+ if (poller_sid.events & EPOLLOUT) {
+ PollOut(ep, poller_sid.events);
}
}
if (poller->callback) {
@@ -918,13 +916,14 @@ void UBShmEndpoint::PollingModeRelease(bthread_tag_t tag)
{
}
}
-void UBShmEndpoint::PollerRegisterEvent(CqSidOp::OpType op, uint32_t events) {
- auto index = butil::fmix32(_cq_sid) % FLAGS_ub_poller_num;
+void UBShmEndpoint::PollerRegisterEvent(PollerSidOp::OpType op,
+ uint32_t events) {
+ auto index = butil::fmix32(_poller_sid) % FLAGS_ub_poller_num;
auto& group = _poller_groups[bthread_self_tag()];
auto& pollers = group.pollers;
auto& poller = pollers[index];
- if (INVALID_SOCKET_ID != _cq_sid) {
- poller.op_queue.Enqueue(CqSidOp{_cq_sid, events, op});
+ if (INVALID_SOCKET_ID != _poller_sid) {
+ poller.op_queue.Enqueue(PollerSidOp{_poller_sid, events, op});
}
}
diff --git a/src/brpc/ubshm/ub_endpoint.h b/src/brpc/ubshm/ub_endpoint.h
index 03c51345..a29a0927 100644
--- a/src/brpc/ubshm/ub_endpoint.h
+++ b/src/brpc/ubshm/ub_endpoint.h
@@ -98,19 +98,19 @@ public:
void PollerRegisterEpollOut(bool pollin) {
uint32_t events = EPOLLOUT | EPOLLET;
if (pollin) {
- PollerRegisterEvent(CqSidOp::MOD, events | EPOLLIN);
+ PollerRegisterEvent(PollerSidOp::MOD, events | EPOLLIN);
return;
}
- PollerRegisterEvent(CqSidOp::ADD, events);
+ PollerRegisterEvent(PollerSidOp::ADD, events);
}
void PollerUnRegisterEpollOut(bool pollin) {
uint32_t events = EPOLLIN | EPOLLET;
if (pollin) {
- PollerRegisterEvent(CqSidOp::MOD, events);
+ PollerRegisterEvent(PollerSidOp::MOD, events);
return;
}
- PollerRegisterEvent(CqSidOp::REMOVE);
+ PollerRegisterEvent(PollerSidOp::REMOVE);
}
// Callback when there is new epollin event on TCP fd
@@ -171,7 +171,7 @@ private:
// return -1 if encounter other errno
int WriteToFd(void* data, size_t len);
- // Poll CQ and get the work completion
+ // Poll inbound and outbound UBRing events.
static void PollIn(UBShmEndpoint* ep, uint32_t ep_event);
static void PollOut(UBShmEndpoint* ep, uint32_t ep_event);
@@ -188,32 +188,33 @@ private:
// ub resource
ubring::UBRing* _ub_ring{nullptr};
- SocketId _cq_sid;
+ // Synthetic SocketId registered with the UBRing poller.
+ SocketId _poller_sid;
// butex for inform read events on TCP fd during handshake
butil::atomic<int> *_read_butex;
DISALLOW_COPY_AND_ASSIGN(UBShmEndpoint);
- struct CqSidOp {
+ struct PollerSidOp {
enum OpType {
ADD,
REMOVE,
MOD
};
SocketId sid;
- uint32_t event;
+ uint32_t events;
OpType type;
};
- struct CqSidOpHash {
- std::size_t operator()(const CqSidOp& op) const {
+ struct PollerSidOpHash {
+ std::size_t operator()(const PollerSidOp& op) const {
return op.sid;
}
};
- struct CqSidOpEqual {
- bool operator()(const CqSidOp& lhs, const CqSidOp& rhs) const {
+ struct PollerSidOpEqual {
+ bool operator()(const PollerSidOp& lhs, const PollerSidOp& rhs) const {
return lhs.sid == rhs.sid;
}
};
@@ -221,7 +222,8 @@ private:
// Poller instance
struct BAIDU_CACHELINE_ALIGNMENT Poller {
bthread_t tid{INVALID_BTHREAD};
- butil::MPSCQueue<CqSidOp, butil::ObjectPoolAllocator<CqSidOp>>
op_queue;
+ butil::MPSCQueue<
+ PollerSidOp, butil::ObjectPoolAllocator<PollerSidOp>> op_queue;
// Callback used for io_uring/spdk etc
std::function<void()> callback;
// Init and Destroy function
@@ -236,7 +238,8 @@ private:
};
static std::vector<PollerGroup> _poller_groups;
- void PollerRegisterEvent(CqSidOp::OpType op, uint32_t events = EPOLLET);
+ void PollerRegisterEvent(PollerSidOp::OpType op,
+ uint32_t events = EPOLLET);
};
} // namespace ubring
diff --git a/src/brpc/ubshm/ub_ring.cpp b/src/brpc/ubshm/ub_ring.cpp
index 72df0154..cdc346ed 100644
--- a/src/brpc/ubshm/ub_ring.cpp
+++ b/src/brpc/ubshm/ub_ring.cpp
@@ -16,7 +16,6 @@
// under the License.
#include <errno.h>
-#include <iostream>
#include <gflags/gflags.h>
#include <unistd.h>
#include <ctime>
@@ -29,12 +28,16 @@
namespace brpc {
namespace ubring {
uint32_t g_sleep_time[UBR_TASK_STEP_NUM] = {0};
-#define TIME_COVERSION 1000
-DEFINE_int32(ub_disconnect_timeout, 5, "Ubshm disconnection timeout.");
-DEFINE_int32(ub_connect_timeout, 1, "Ubshm connection timeout.");
-DEFINE_int32(ub_hb_timer_interval, 5, "Heartbeat timer interval.");
-DEFINE_int32(ub_hb_retry_cnt, 10, "Heartbeat retry times.");
-DEFINE_int32(ub_event_queue_timer_interval, 100, "Interval of the
disconnection timer.");
+DEFINE_int32(ub_disconnect_timeout_s, 5,
+ "UBRing disconnection timeout in seconds.");
+DEFINE_int32(ub_connect_timeout_s, 1,
+ "UBRing connection timeout in seconds.");
+DEFINE_int32(ub_hb_timer_interval_s, 5,
+ "UBRing heartbeat timer interval in seconds.");
+DEFINE_int32(ub_hb_retry_cnt, 10,
+ "UBRing heartbeat retry count.");
+DEFINE_int32(ub_event_queue_timer_interval_us, 100,
+ "UBRing disconnection check interval in microseconds.");
UBRing::UBRing()
{}
@@ -69,7 +72,7 @@ RETURN_CODE UBRing::UbrTrxClose() {
((UbrEventQMsg *)_trx->ubr_rx.remote_tx_event_q.addr)->flag =
UBR_STATE_CLOSING;
}
- uint32_t disconnect_timeout = FLAGS_ub_disconnect_timeout;
+ const uint32_t disconnect_timeout_s = FLAGS_ub_disconnect_timeout_s;
uint64_t start_time = GetCurNanoSeconds();
if (_trx->ubr_tx.local_tx_event_q.addr != nullptr && ((UbrEventQMsg
*)_trx->ubr_tx.local_tx_event_q.addr)->flag == UBR_STATE_CONNECTED) {
@@ -82,7 +85,7 @@ RETURN_CODE UBRing::UbrTrxClose() {
}
while (_trx->ubr_rx.local_rx_event_q.addr != nullptr && ((UbrEventQMsg
*)_trx->ubr_rx.local_rx_event_q.addr)->flag != UBR_STATE_CLOSED) {
UbrSetSleepTask(UBR_TASK_CLOSE);
- if (HasTimedOut(start_time, disconnect_timeout) != UBRING_OK) {
+ if (HasTimedOut(start_time, disconnect_timeout_s) != UBRING_OK) {
LOG(WARNING) << "Local shm " << _trx->local_shm.name
<< " wait for the peer to close timed out, force cleanup.";
_trx->ubr_rx.trx_state = UBR_STATE_CLOSED;
@@ -127,9 +130,10 @@ RETURN_CODE UBRing::UbrAddCloseTimer() {
return UBRING_ERR;
}
- uint32_t event_q_timer_interval = FLAGS_ub_event_queue_timer_interval *
TIME_COVERSION;
+ const uint32_t event_q_timer_interval_ns =
+ FLAGS_ub_event_queue_timer_interval_us * USEC_TO_NSEC;
itimerspec time_spec = {
- .it_interval = {.tv_sec = 0, .tv_nsec = event_q_timer_interval},
+ .it_interval = {.tv_sec = 0, .tv_nsec = event_q_timer_interval_ns},
.it_value = {.tv_sec = 0, .tv_nsec = 1}
};
int timer_fd = TimerStart(&time_spec, UbrTrxCloseCallback, (void*)_trx);
@@ -202,7 +206,7 @@ RETURN_CODE UBRing::UbrAddHBTimer() {
}
itimerspec time_spec = {
- .it_interval = {.tv_sec = FLAGS_ub_hb_timer_interval, .tv_nsec =
0},
+ .it_interval = {.tv_sec = FLAGS_ub_hb_timer_interval_s, .tv_nsec =
0},
.it_value = {.tv_sec = 0, .tv_nsec = 1}
};
int timer_fd = TimerStart(&time_spec, UbrTrxHBCallback, (void*)_trx);
@@ -235,7 +239,8 @@ RETURN_CODE UBRing::UbrPassiveClearTrx(UbrTrx *trx, int fd,
PASSIVE_DISC_TYPE ty
DeleteTimerSafe((uint32_t)trx->hb_timer_fd);
type_name = "Ub event callback";
}
- bthread_usleep(FLAGS_ub_flying_io_timeout * 1000000LL); // yield-friendly
sleep
+ constexpr int64_t kMicrosecondsPerSecond = 1000000LL;
+ bthread_usleep(FLAGS_ub_flying_io_timeout_s * kMicrosecondsPerSecond);
int rc = ShmLocalFree(&trx->remote_shm);
if (rc != UBRING_OK) {
@@ -299,7 +304,7 @@ RETURN_CODE UBRing::UbrAddAsynClearTimer(UbrTrx *trx) {
itimerspec time_spec = {
.it_interval = {.tv_sec = 0, .tv_nsec = 0},
- .it_value = {.tv_sec = FLAGS_ub_flying_io_timeout, .tv_nsec = 0}
+ .it_value = {.tv_sec = FLAGS_ub_flying_io_timeout_s, .tv_nsec = 0}
};
int timer_fd = TimerStart(&time_spec, UbrAsynClearCallback, (void*)trx);
@@ -787,8 +792,10 @@ RETURN_CODE UBRing::UbrServerTrxInit(SHM *local_shm, SHM
*remote_shm)
return UBRING_ERR;
}
- ((UbrDataStatusQMsg *)(_trx->ubr_tx.local_data_status_q.addr))->timeout =
FLAGS_ub_connect_timeout;
- ((UbrDataStatusQMsg *)(_trx->ubr_rx.remote_data_status_q.addr))->timeout =
FLAGS_ub_connect_timeout;
+ ((UbrDataStatusQMsg *)(_trx->ubr_tx.local_data_status_q.addr))->timeout =
+ FLAGS_ub_connect_timeout_s;
+ ((UbrDataStatusQMsg *)(_trx->ubr_rx.remote_data_status_q.addr))->timeout =
+ FLAGS_ub_connect_timeout_s;
((UbrEventQMsg *)_trx->ubr_tx.remote_rx_event_q.addr)->flag =
UBR_STATE_CONNECTED;
((UbrEventQMsg *)_trx->ubr_rx.local_rx_event_q.addr)->flag =
UBR_STATE_CONNECTED;
@@ -937,7 +944,8 @@ RETURN_CODE UBRing::ApplyAndMapLocalShm(SHM *local_trx_shm,
const char *local_na
UBRingManager::ReleaseUbrTrxFromMgr(_trx);
return rc;
}
- ((UbrDataStatusQMsg *)_trx->ubr_tx.local_data_status_q.addr)->timeout =
FLAGS_ub_connect_timeout;
+ ((UbrDataStatusQMsg *)_trx->ubr_tx.local_data_status_q.addr)->timeout =
+ FLAGS_ub_connect_timeout_s;
_trx->ubr_rx.capacity = (uint32_t)(_trx->ubr_rx.local_data_q.len /
UBR_MSG_LEN);
rc = UBRingManager::GetUbrDealMsgMaxCnt(_trx->ubr_rx.capacity,
&_trx->ubr_rx.deal_msg_max_cnt);
if (rc != UBRING_OK) {
diff --git a/src/brpc/ubshm/ub_ring.h b/src/brpc/ubshm/ub_ring.h
index f1a5cf14..412c7598 100644
--- a/src/brpc/ubshm/ub_ring.h
+++ b/src/brpc/ubshm/ub_ring.h
@@ -28,7 +28,7 @@
namespace brpc {
namespace ubring {
-DECLARE_int32(ub_flying_io_timeout);
+DECLARE_int32(ub_flying_io_timeout_s);
extern uint32_t g_sleep_time[UBR_TASK_STEP_NUM];
class UBRing : public butil::IReader {
@@ -205,4 +205,4 @@ private:
}
}
-#endif //BRPC_UB_RING_H
\ No newline at end of file
+#endif //BRPC_UB_RING_H
diff --git a/src/brpc/ubshm_transport.cpp b/src/brpc/ubshm_transport.cpp
index df4eb36b..45f6a61f 100644
--- a/src/brpc/ubshm_transport.cpp
+++ b/src/brpc/ubshm_transport.cpp
@@ -88,17 +88,15 @@ ssize_t UBShmTransport::CutFromIOBufList(butil::IOBuf
**buf, size_t ndata) {
int UBShmTransport::WaitEpollOut(butil::atomic<int> *_epollout_butex,
bool pollin, const timespec duetime) {
- // LOG(INFO) << "mwj pollin4=" << pollin << " duetime=" <<
butil::timespec_to_microseconds(duetime);
if (_ub_state == UB_ON) {
- // LOG(INFO) << "mwj pollin1=" << pollin;
const int expected_val =
_epollout_butex->load(butil::memory_order_acquire);
CHECK(_ub_ep != nullptr);
if (!_ub_ep->IsWritable()) {
g_vars->nwaitepollout << 1;
_ub_ep->PollerRegisterEpollOut(pollin);
- auto mwj_ret = bthread::butex_wait(_epollout_butex, expected_val,
&duetime);
- // LOG(INFO) << "mwj pollin2=" << pollin << " mwj_ret=" << mwj_ret;
- if (mwj_ret < 0) {
+ const int wait_rc = bthread::butex_wait(
+ _epollout_butex, expected_val, &duetime);
+ if (wait_rc < 0) {
if (errno != EAGAIN && errno != ETIMEDOUT) {
const int saved_errno = errno;
PLOG(WARNING) << "Fail to wait ub window of " << _socket;
@@ -120,7 +118,6 @@ int UBShmTransport::WaitEpollOut(butil::atomic<int>
*_epollout_butex,
} else {
return _tcp_transport->WaitEpollOut(_epollout_butex, pollin, duetime);
}
- // LOG(INFO) << "mwj return 0";
return 0;
}
@@ -232,4 +229,4 @@ bool UBShmTransport::OptionsAvailableOverUB(const
ServerOptions* opt) {
return true;
}
} // namespace brpc
-#endif
\ No newline at end of file
+#endif
diff --git a/test/brpc_ubring_unittest.cpp b/test/brpc_ubring_unittest.cpp
index 14b2ef1b..53bb0a9b 100644
--- a/test/brpc_ubring_unittest.cpp
+++ b/test/brpc_ubring_unittest.cpp
@@ -16,12 +16,14 @@
#include <gtest/gtest.h>
#include <cstring>
+#include <gflags/gflags.h>
#include <string>
#include "butil/macros.h"
#include "butil/sys_byteorder.h"
#include "brpc/socket.h"
#if BRPC_WITH_UBRING
+#include "brpc/ubshm/common/common.h"
#include "brpc/ubshm/ub_endpoint.h"
#include "brpc/ubshm/shm/shm_def.h"
#include "brpc/ubshm/shm/shm_mgr.h"
@@ -29,6 +31,12 @@
namespace brpc {
namespace ubring {
+DECLARE_int32(ub_disconnect_timeout_s);
+DECLARE_int32(ub_connect_timeout_s);
+DECLARE_int32(ub_hb_timer_interval_s);
+DECLARE_int32(ub_event_queue_timer_interval_us);
+DECLARE_int32(ub_flying_io_timeout_s);
+
extern bool g_skip_ub_init;
} // namespace ubring
} // namespace brpc
@@ -135,6 +143,44 @@ TEST_F(HelloMessageTest, toString_contains_fields) {
EXPECT_NE(std::string::npos, s.find("UBRING_test"));
}
+TEST(UBRingConfigurationTest, time_flags_include_units_and_expected_defaults) {
+ struct TimeFlagExpectation {
+ const char* name;
+ const char* suffix;
+ const char* unit;
+ const char* default_value;
+ };
+ const TimeFlagExpectation expected_flags[] = {
+ {"ub_disconnect_timeout_s", "_s", "seconds", "5"},
+ {"ub_connect_timeout_s", "_s", "seconds", "1"},
+ {"ub_hb_timer_interval_s", "_s", "seconds", "5"},
+ {"ub_event_queue_timer_interval_us", "_us", "microseconds", "100"},
+ {"ub_flying_io_timeout_s", "_s", "seconds", "5"},
+ };
+
+ for (const auto& expected : expected_flags) {
+ GFLAGS_NAMESPACE::CommandLineFlagInfo info;
+ ASSERT_TRUE(GFLAGS_NAMESPACE::GetCommandLineFlagInfo(
+ expected.name, &info)) << expected.name;
+ const std::string flag_name(expected.name);
+ const std::string suffix(expected.suffix);
+ ASSERT_GE(flag_name.size(), suffix.size());
+ EXPECT_EQ(flag_name.size() - suffix.size(), flag_name.rfind(suffix));
+ EXPECT_NE(std::string::npos, info.description.find(expected.unit));
+ EXPECT_EQ(std::string(expected.default_value), info.default_value);
+ }
+
+ EXPECT_EQ(5, brpc::ubring::FLAGS_ub_disconnect_timeout_s);
+ EXPECT_EQ(1, brpc::ubring::FLAGS_ub_connect_timeout_s);
+ EXPECT_EQ(5, brpc::ubring::FLAGS_ub_hb_timer_interval_s);
+ EXPECT_EQ(100, brpc::ubring::FLAGS_ub_event_queue_timer_interval_us);
+ EXPECT_EQ(5, brpc::ubring::FLAGS_ub_flying_io_timeout_s);
+ EXPECT_EQ(100U * USEC_TO_NSEC,
+ static_cast<uint32_t>(
+ brpc::ubring::FLAGS_ub_event_queue_timer_interval_us) *
+ USEC_TO_NSEC);
+}
+
namespace brpc {
namespace ubring {
class UBShmEndpointTest : public ::testing::Test {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]