Add counters, fix race
This commit is contained in:
parent
fd8faac69c
commit
b4bb1cdce4
|
|
@ -20,5 +20,6 @@
|
|||
|
||||
#include "src/core/lib/debug/stats_data.h"
|
||||
const char *grpc_stats_counter_name[GRPC_STATS_COUNTER_COUNT] = {
|
||||
"client_calls_created", "server_calls_created",
|
||||
"client_calls_created", "server_calls_created", "syscall_write",
|
||||
"syscall_read", "syscall_poll", "syscall_wait",
|
||||
};
|
||||
|
|
|
|||
|
|
@ -24,12 +24,24 @@
|
|||
typedef enum {
|
||||
GRPC_STATS_COUNTER_CLIENT_CALLS_CREATED,
|
||||
GRPC_STATS_COUNTER_SERVER_CALLS_CREATED,
|
||||
GRPC_STATS_COUNTER_SYSCALL_WRITE,
|
||||
GRPC_STATS_COUNTER_SYSCALL_READ,
|
||||
GRPC_STATS_COUNTER_SYSCALL_POLL,
|
||||
GRPC_STATS_COUNTER_SYSCALL_WAIT,
|
||||
GRPC_STATS_COUNTER_COUNT
|
||||
} grpc_stats_counters;
|
||||
#define GRPC_STATS_INC_CLIENT_CALLS_CREATED(exec_ctx) \
|
||||
GRPC_STATS_INC_COUNTER((exec_ctx), GRPC_STATS_COUNTER_CLIENT_CALLS_CREATED)
|
||||
#define GRPC_STATS_INC_SERVER_CALLS_CREATED(exec_ctx) \
|
||||
GRPC_STATS_INC_COUNTER((exec_ctx), GRPC_STATS_COUNTER_SERVER_CALLS_CREATED)
|
||||
#define GRPC_STATS_INC_SYSCALL_WRITE(exec_ctx) \
|
||||
GRPC_STATS_INC_COUNTER((exec_ctx), GRPC_STATS_COUNTER_SYSCALL_WRITE)
|
||||
#define GRPC_STATS_INC_SYSCALL_READ(exec_ctx) \
|
||||
GRPC_STATS_INC_COUNTER((exec_ctx), GRPC_STATS_COUNTER_SYSCALL_READ)
|
||||
#define GRPC_STATS_INC_SYSCALL_POLL(exec_ctx) \
|
||||
GRPC_STATS_INC_COUNTER((exec_ctx), GRPC_STATS_COUNTER_SYSCALL_POLL)
|
||||
#define GRPC_STATS_INC_SYSCALL_WAIT(exec_ctx) \
|
||||
GRPC_STATS_INC_COUNTER((exec_ctx), GRPC_STATS_COUNTER_SYSCALL_WAIT)
|
||||
extern const char *grpc_stats_counter_name[GRPC_STATS_COUNTER_COUNT];
|
||||
|
||||
#endif /* GRPC_CORE_LIB_DEBUG_STATS_DATA_H */
|
||||
|
|
|
|||
|
|
@ -3,3 +3,7 @@
|
|||
|
||||
- counter: client_calls_created
|
||||
- counter: server_calls_created
|
||||
- counter: syscall_write
|
||||
- counter: syscall_read
|
||||
- counter: syscall_poll
|
||||
- counter: syscall_wait
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@
|
|||
#include <grpc/support/tls.h>
|
||||
#include <grpc/support/useful.h>
|
||||
|
||||
#include "src/core/lib/debug/stats.h"
|
||||
#include "src/core/lib/iomgr/ev_posix.h"
|
||||
#include "src/core/lib/iomgr/iomgr_internal.h"
|
||||
#include "src/core/lib/iomgr/lockfree_event.h"
|
||||
|
|
@ -474,6 +475,7 @@ static grpc_error *pollset_epoll(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
|
|||
}
|
||||
int r;
|
||||
do {
|
||||
GRPC_STATS_INC_SYSCALL_POLL(exec_ctx);
|
||||
r = epoll_wait(g_epfd, events, MAX_EPOLL_EVENTS, timeout);
|
||||
} while (r < 0 && errno == EINTR);
|
||||
if (timeout != 0) {
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@
|
|||
#include <grpc/support/tls.h>
|
||||
#include <grpc/support/useful.h>
|
||||
|
||||
#include "src/core/lib/debug/stats.h"
|
||||
#include "src/core/lib/debug/trace.h"
|
||||
#include "src/core/lib/iomgr/ev_posix.h"
|
||||
#include "src/core/lib/iomgr/iomgr_internal.h"
|
||||
|
|
@ -1307,6 +1308,7 @@ static bool acquire_polling_lease(grpc_pollset_worker *worker,
|
|||
} else {
|
||||
struct timespec sigwait_timeout = millis_to_timespec(timeout_ms);
|
||||
GRPC_SCHEDULING_START_BLOCKING_REGION;
|
||||
GRPC_STATS_INC_SYSCALL_WAIT(exec_ctx);
|
||||
ret = sigtimedwait(&g_wakeup_sig_set, NULL, &sigwait_timeout);
|
||||
GRPC_SCHEDULING_END_BLOCKING_REGION;
|
||||
}
|
||||
|
|
@ -1392,6 +1394,7 @@ static void pollset_do_epoll_pwait(grpc_exec_ctx *exec_ctx, int epoll_fd,
|
|||
int timeout_ms = poll_deadline_to_millis_timeout(deadline, now);
|
||||
|
||||
GRPC_SCHEDULING_START_BLOCKING_REGION;
|
||||
GRPC_STATS_INC_SYSCALL_POLL(exec_ctx);
|
||||
ep_rv =
|
||||
epoll_pwait(epoll_fd, ep_ev, GRPC_EPOLL_MAX_EVENTS, timeout_ms, sig_mask);
|
||||
GRPC_SCHEDULING_END_BLOCKING_REGION;
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@
|
|||
#include <grpc/support/tls.h>
|
||||
#include <grpc/support/useful.h>
|
||||
|
||||
#include "src/core/lib/debug/stats.h"
|
||||
#include "src/core/lib/iomgr/ev_posix.h"
|
||||
#include "src/core/lib/iomgr/iomgr_internal.h"
|
||||
#include "src/core/lib/iomgr/lockfree_event.h"
|
||||
|
|
@ -776,6 +777,7 @@ static void do_epoll_wait(grpc_exec_ctx *exec_ctx, int epoll_fd, epoll_set *eps,
|
|||
|
||||
GRPC_SCHEDULING_START_BLOCKING_REGION;
|
||||
acquire_epoll_lease(eps);
|
||||
GRPC_STATS_INC_SYSCALL_POLL(exec_ctx);
|
||||
ep_rv = epoll_wait(epoll_fd, ep_ev, GRPC_EPOLL_MAX_EVENTS, timeout_ms);
|
||||
release_epoll_lease(eps);
|
||||
GRPC_SCHEDULING_END_BLOCKING_REGION;
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
#include <grpc/support/tls.h>
|
||||
#include <grpc/support/useful.h>
|
||||
|
||||
#include "src/core/lib/debug/stats.h"
|
||||
#include "src/core/lib/iomgr/ev_posix.h"
|
||||
#include "src/core/lib/iomgr/iomgr_internal.h"
|
||||
#include "src/core/lib/iomgr/is_epollexclusive_available.h"
|
||||
|
|
@ -814,6 +815,7 @@ static grpc_error *pollset_epoll(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
|
|||
}
|
||||
int r;
|
||||
do {
|
||||
GRPC_STATS_INC_SYSCALL_POLL(exec_ctx);
|
||||
r = epoll_wait(p->epfd, pollset->events, MAX_EPOLL_EVENTS, timeout);
|
||||
} while (r < 0 && errno == EINTR);
|
||||
if (timeout != 0) {
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@
|
|||
#include <grpc/support/tls.h>
|
||||
#include <grpc/support/useful.h>
|
||||
|
||||
#include "src/core/lib/debug/stats.h"
|
||||
#include "src/core/lib/iomgr/ev_posix.h"
|
||||
#include "src/core/lib/iomgr/iomgr_internal.h"
|
||||
#include "src/core/lib/iomgr/lockfree_event.h"
|
||||
|
|
@ -1237,6 +1238,7 @@ static void pollset_work_and_unlock(grpc_exec_ctx *exec_ctx,
|
|||
g_current_thread_polling_island = pi;
|
||||
|
||||
GRPC_SCHEDULING_START_BLOCKING_REGION;
|
||||
GRPC_STATS_INC_SYSCALL_POLL(exec_ctx);
|
||||
ep_rv =
|
||||
epoll_pwait(epoll_fd, ep_ev, GRPC_EPOLL_MAX_EVENTS, timeout_ms, sig_mask);
|
||||
GRPC_SCHEDULING_END_BLOCKING_REGION;
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@
|
|||
#include <grpc/support/tls.h>
|
||||
#include <grpc/support/useful.h>
|
||||
|
||||
#include "src/core/lib/debug/stats.h"
|
||||
#include "src/core/lib/iomgr/iomgr_internal.h"
|
||||
#include "src/core/lib/iomgr/timer.h"
|
||||
#include "src/core/lib/iomgr/wakeup_fd_cv.h"
|
||||
|
|
@ -958,6 +959,7 @@ static grpc_error *pollset_work(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
|
|||
/* TODO(vpai): Consider first doing a 0 timeout poll here to avoid
|
||||
even going into the blocking annotation if possible */
|
||||
GRPC_SCHEDULING_START_BLOCKING_REGION;
|
||||
GRPC_STATS_INC_SYSCALL_POLL(exec_ctx);
|
||||
r = grpc_poll_function(pfds, pfd_count, timeout);
|
||||
GRPC_SCHEDULING_END_BLOCKING_REGION;
|
||||
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#include <grpc/support/log_windows.h>
|
||||
#include <grpc/support/thd.h>
|
||||
|
||||
#include "src/core/lib/debug/stats.h"
|
||||
#include "src/core/lib/iomgr/iocp_windows.h"
|
||||
#include "src/core/lib/iomgr/iomgr_internal.h"
|
||||
#include "src/core/lib/iomgr/socket_windows.h"
|
||||
|
|
@ -65,6 +66,7 @@ grpc_iocp_work_status grpc_iocp_work(grpc_exec_ctx *exec_ctx,
|
|||
LPOVERLAPPED overlapped;
|
||||
grpc_winsocket *socket;
|
||||
grpc_winsocket_callback_info *info;
|
||||
GRPC_STATS_INC_SYSCALL_POLL(exec_ctx);
|
||||
success = GetQueuedCompletionStatus(
|
||||
g_iocp, &bytes, &completion_key, &overlapped,
|
||||
deadline_to_millis_timeout(deadline, gpr_now(deadline.clock_type)));
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@
|
|||
#include <grpc/support/useful.h>
|
||||
|
||||
#include "src/core/lib/channel/channel_args.h"
|
||||
#include "src/core/lib/debug/stats.h"
|
||||
#include "src/core/lib/debug/trace.h"
|
||||
#include "src/core/lib/iomgr/ev_posix.h"
|
||||
#include "src/core/lib/profiling/timers.h"
|
||||
|
|
@ -258,6 +259,7 @@ static void tcp_do_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
|
|||
|
||||
GPR_TIMER_BEGIN("recvmsg", 0);
|
||||
do {
|
||||
GRPC_STATS_INC_SYSCALL_READ(exec_ctx);
|
||||
read_bytes = recvmsg(tcp->fd, &msg, 0);
|
||||
} while (read_bytes < 0 && errno == EINTR);
|
||||
GPR_TIMER_END("recvmsg", read_bytes >= 0);
|
||||
|
|
@ -361,7 +363,8 @@ static void tcp_read(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
|
|||
|
||||
/* returns true if done, false if pending; if returning true, *error is set */
|
||||
#define MAX_WRITE_IOVEC 1000
|
||||
static bool tcp_flush(grpc_tcp *tcp, grpc_error **error) {
|
||||
static bool tcp_flush(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp,
|
||||
grpc_error **error) {
|
||||
struct msghdr msg;
|
||||
struct iovec iov[MAX_WRITE_IOVEC];
|
||||
msg_iovlen_type iov_size;
|
||||
|
|
@ -403,6 +406,7 @@ static bool tcp_flush(grpc_tcp *tcp, grpc_error **error) {
|
|||
GPR_TIMER_BEGIN("sendmsg", 1);
|
||||
do {
|
||||
/* TODO(klempner): Cork if this is a partial write */
|
||||
GRPC_STATS_INC_SYSCALL_WRITE(exec_ctx);
|
||||
sent_length = sendmsg(tcp->fd, &msg, SENDMSG_FLAGS);
|
||||
} while (sent_length < 0 && errno == EINTR);
|
||||
GPR_TIMER_END("sendmsg", 0);
|
||||
|
|
@ -459,7 +463,7 @@ static void tcp_handle_write(grpc_exec_ctx *exec_ctx, void *arg /* grpc_tcp */,
|
|||
return;
|
||||
}
|
||||
|
||||
if (!tcp_flush(tcp, &error)) {
|
||||
if (!tcp_flush(exec_ctx, tcp, &error)) {
|
||||
if (GRPC_TRACER_ON(grpc_tcp_trace)) {
|
||||
gpr_log(GPR_DEBUG, "write: delayed");
|
||||
}
|
||||
|
|
@ -510,7 +514,7 @@ static void tcp_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
|
|||
tcp->outgoing_slice_idx = 0;
|
||||
tcp->outgoing_byte_idx = 0;
|
||||
|
||||
if (!tcp_flush(tcp, &error)) {
|
||||
if (!tcp_flush(exec_ctx, tcp, &error)) {
|
||||
TCP_REF(tcp, "write");
|
||||
tcp->write_cb = cb;
|
||||
if (GRPC_TRACER_ON(grpc_tcp_trace)) {
|
||||
|
|
|
|||
|
|
@ -38,6 +38,8 @@ struct grpc_pollset {
|
|||
namespace grpc {
|
||||
namespace testing {
|
||||
|
||||
auto& force_library_initialization = Library::get();
|
||||
|
||||
static void* g_tag = (void*)(intptr_t)10; // Some random number
|
||||
static grpc_completion_queue* g_cq;
|
||||
static grpc_event_engine_vtable g_vtable;
|
||||
|
|
|
|||
Loading…
Reference in New Issue