about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2013-07-13 02:26:17 +0000
committerEric Wong <normalperson@yhbt.net>2013-07-13 09:57:23 +0000
commit5b1c49b1cb6c719eb098beae3823cf63d116d8ed (patch)
treee6b334247aaa2849f12244a975ce467889fe2f6a
parent5c65fa6a053691ffee983b61298f3863b660b408 (diff)
downloadcmogstored-5b1c49b1cb6c719eb098beae3823cf63d116d8ed.tar.gz
This allows us to capture/trace the listen address which
accepted the request without consuming additional stack space.
-rw-r--r--accept_loop.c2
-rw-r--r--cmogstored.h11
-rw-r--r--http.c21
-rw-r--r--mgmt.c15
-rw-r--r--probes.d6
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);