From 5b1c49b1cb6c719eb098beae3823cf63d116d8ed Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 13 Jul 2013 02:26:17 +0000 Subject: pass mog_accept instead of mog_svc to post-accept callbacks This allows us to capture/trace the listen address which accepted the request without consuming additional stack space. --- accept_loop.c | 2 +- cmogstored.h | 11 +++++++---- http.c | 21 +++++++++++---------- mgmt.c | 15 ++++++++------- probes.d | 6 ++++-- 5 files changed, 31 insertions(+), 24 deletions(-) diff --git a/accept_loop.c b/accept_loop.c index c4779c9..b324735 100644 --- a/accept_loop.c +++ b/accept_loop.c @@ -97,7 +97,7 @@ void *mog_accept_loop(void *arg) client_fd = mog_accept_fn(accept_fd, &msa.sa, &salen); if (client_fd >= 0) - ac->post_accept_fn(client_fd, ac->svc, &msa, salen); + ac->post_accept_fn(client_fd, ac, &msa, salen); else accept_error_check(ac); } diff --git a/cmogstored.h b/cmogstored.h index 859236a..ffd0668 100644 --- a/cmogstored.h +++ b/cmogstored.h @@ -252,8 +252,11 @@ struct mog_queue { }; /* accept.c */ -typedef void (*mog_post_accept_fn)(int fd, struct mog_svc *, +struct mog_accept; +typedef void (*mog_post_accept_fn)(int fd, struct mog_accept *, union mog_sockaddr *, socklen_t); + +struct mog_ni; struct mog_accept { struct mog_svc *svc; mog_post_accept_fn post_accept_fn; @@ -440,7 +443,7 @@ void mog_thrpool_set_size(struct mog_thrpool *, size_t size); /* mgmt.c */ void mog_mgmt_writev(struct mog_mgmt *, struct iovec *, int iovcnt); -void mog_mgmt_post_accept(int fd, struct mog_svc *, +void mog_mgmt_post_accept(int fd, struct mog_accept *, union mog_sockaddr *, socklen_t); enum mog_next mog_mgmt_queue_step(struct mog_fd *) MOG_CHECK; void mog_mgmt_quit_step(struct mog_fd *); @@ -496,9 +499,9 @@ void mog_http_get_open(struct mog_fd *, char *buf); enum mog_next mog_http_get_in_progress(struct mog_fd *); /* http.c */ -void mog_http_post_accept(int fd, struct mog_svc *, +void mog_http_post_accept(int fd, struct mog_accept *, union mog_sockaddr *, socklen_t); -void mog_httpget_post_accept(int fd, struct mog_svc *, +void mog_httpget_post_accept(int fd, struct mog_accept *, union mog_sockaddr *, socklen_t); enum mog_next mog_http_queue_step(struct mog_fd *) MOG_CHECK; void mog_http_quit_step(struct mog_fd *); diff --git a/http.c b/http.c index 7e35252..19cf9b7 100644 --- a/http.c +++ b/http.c @@ -368,47 +368,48 @@ void mog_http_quit_step(struct mog_fd *mfd) /* stringify the address for tracers */ static MOG_NOINLINE void -trace_http_accepted(struct mog_fd *mfd) +trace_http_accepted(struct mog_fd *mfd, const char *listen_addr) { #ifdef HAVE_SYSTEMTAP struct mog_packaddr *mpa = &mfd->as.http.mpa; struct mog_ni ni; mog_nameinfo(mpa, &ni); - TRACE(CMOGSTORED_HTTP_ACCEPTED(mfd->fd, ni.ni_host, ni.ni_serv)); + TRACE(CMOGSTORED_HTTP_ACCEPTED(mfd->fd, ni.ni_host, ni.ni_serv, + listen_addr)); #endif /* !HAVE_SYSTEMTAP */ } -static void http_post_accept_common(struct mog_fd *mfd, struct mog_svc *svc, +static void http_post_accept_common(struct mog_fd *mfd, struct mog_accept *ac, union mog_sockaddr *msa, socklen_t salen) { struct mog_http *http = &mfd->as.http; - mog_http_init(http, svc); + mog_http_init(http, ac->svc); mog_packaddr_init(&http->mpa, msa, salen); if (TRACE_ENABLED(CMOGSTORED_HTTP_ACCEPTED)) - trace_http_accepted(mfd); + trace_http_accepted(mfd, ac->addrinfo->orig); - mog_idleq_add(svc->queue, mfd, MOG_QEV_RD); + mog_idleq_add(ac->svc->queue, mfd, MOG_QEV_RD); } /* called immediately after accept(), this initializes the mfd (once) */ -void mog_http_post_accept(int fd, struct mog_svc *svc, +void mog_http_post_accept(int fd, struct mog_accept *ac, union mog_sockaddr *msa, socklen_t salen) { struct mog_fd *mfd = mog_fd_init(fd, MOG_FD_TYPE_HTTP); - http_post_accept_common(mfd, svc, msa, salen); + http_post_accept_common(mfd, ac, msa, salen); } /* called immediately after accept(), this initializes the mfd (once) */ -void mog_httpget_post_accept(int fd, struct mog_svc *svc, +void mog_httpget_post_accept(int fd, struct mog_accept *ac, union mog_sockaddr *msa, socklen_t salen) { struct mog_fd *mfd = mog_fd_init(fd, MOG_FD_TYPE_HTTPGET); - http_post_accept_common(mfd, svc, msa, salen); + http_post_accept_common(mfd, ac, msa, salen); } /* diff --git a/mgmt.c b/mgmt.c index aaf96a5..42d6778 100644 --- a/mgmt.c +++ b/mgmt.c @@ -361,28 +361,29 @@ void mog_mgmt_quit_step(struct mog_fd *mfd) /* stringify the address for tracers */ static MOG_NOINLINE void -trace_mgmt_accepted( - struct mog_fd *mfd, union mog_sockaddr *msa, socklen_t salen) +trace_mgmt_accepted(struct mog_fd *mfd, const char *listen_addr, + union mog_sockaddr *msa, socklen_t salen) { #ifdef HAVE_SYSTEMTAP struct mog_packaddr mpa; struct mog_ni ni; mog_nameinfo(&mpa, &ni); - TRACE(CMOGSTORED_MGMT_ACCEPTED(mfd->fd, ni.ni_host, ni.ni_serv)); + TRACE(CMOGSTORED_MGMT_ACCEPTED(mfd->fd, ni.ni_host, ni.ni_serv, + listen_addr)); #endif /* !HAVE_SYSTEMTAP */ } /* called immediately after accept(), this initializes the mfd (once) */ -void mog_mgmt_post_accept(int fd, struct mog_svc *svc, +void mog_mgmt_post_accept(int fd, struct mog_accept *ac, union mog_sockaddr *msa, socklen_t salen) { struct mog_fd *mfd = mog_fd_init(fd, MOG_FD_TYPE_MGMT); struct mog_mgmt *mgmt = &mfd->as.mgmt; if (TRACE_ENABLED(CMOGSTORED_MGMT_ACCEPTED)) - trace_mgmt_accepted(mfd, msa, salen); + trace_mgmt_accepted(mfd, ac->addrinfo->orig, msa, salen); - mog_mgmt_init(mgmt, svc); - mog_idleq_add(svc->queue, mfd, MOG_QEV_RD); + mog_mgmt_init(mgmt, ac->svc); + mog_idleq_add(ac->svc->queue, mfd, MOG_QEV_RD); } diff --git a/probes.d b/probes.d index 4be0d6c..6a0ced8 100644 --- a/probes.d +++ b/probes.d @@ -9,14 +9,16 @@ provider cmogstored { probe http_rderr(size_t buf_len, int err); probe http_rdclose(size_t buf_len); - probe http_accepted(int fd, const char *host, const char *port); + probe http_accepted(int fd, const char *host, const char *port, + const char *listen_addr); probe http_req_begin(bool pipelined); /* DWARF: http_process_client */ /* DWARF: mog_http_get_open */ probe http_req_end(); - probe mgmt_accepted(int fd, const char *host, const char *port); + probe mgmt_accepted(int fd, const char *host, const char *port, + const char *listen_addr); probe mgmt_rderr(struct mog_fd *mfd, size_t buf_len, int err); probe mgmt_rdclose(struct mog_fd *mfd, size_t buf_len); -- cgit v1.2.3-24-ge0c7