From 3e4884d4013e58f76ab8e84fffd1f6012321cf32 Mon Sep 17 00:00:00 2001 From: Konstantin Osipov <kostja@tarantool.org> Date: Fri, 4 Oct 2013 19:08:18 +0400 Subject: [PATCH] gh-35, opentar-45: review fixes Remove get_socket_addr(), use existing sockaddr_in to save in the cookie. --- include/session.h | 2 +- src/admin.cc | 3 ++- src/admin.rl | 3 ++- src/coio.cc | 2 +- src/iproto.cc | 22 +++++----------------- src/memcached.cc | 3 +++ src/session.cc | 17 ++--------------- 7 files changed, 16 insertions(+), 36 deletions(-) diff --git a/include/session.h b/include/session.h index 2eaf1d9c88..37c5799c41 100644 --- a/include/session.h +++ b/include/session.h @@ -50,7 +50,7 @@ * trigger fails or runs out of resources. */ uint32_t -session_create(int fd); +session_create(int fd, uint64_t cookie); /** * Destroy a session. diff --git a/src/admin.cc b/src/admin.cc index 6512d9d424..308a475d87 100644 --- a/src/admin.cc +++ b/src/admin.cc @@ -1962,6 +1962,7 @@ static void admin_handler(va_list ap) { struct ev_io coio = va_arg(ap, struct ev_io); + struct sockaddr_in *addr = va_arg(ap, struct sockaddr_in *); struct iobuf *iobuf = va_arg(ap, struct iobuf *); lua_State *L = lua_newthread(tarantool_L); int coro_ref = luaL_ref(tarantool_L, LUA_REGISTRYINDEX); @@ -1979,7 +1980,7 @@ admin_handler(va_list ap) * a remote client: it's used in Lua * stored procedures. */ - session_create(coio.fd); + session_create(coio.fd, *(uint64_t *) addr); for (;;) { if (admin_dispatch(&coio, iobuf, L) < 0) return; diff --git a/src/admin.rl b/src/admin.rl index f336ca78ee..59e5e06d3c 100644 --- a/src/admin.rl +++ b/src/admin.rl @@ -343,6 +343,7 @@ static void admin_handler(va_list ap) { struct ev_io coio = va_arg(ap, struct ev_io); + struct sockaddr_in *addr = va_arg(ap, struct sockaddr_in *); struct iobuf *iobuf = va_arg(ap, struct iobuf *); lua_State *L = lua_newthread(tarantool_L); int coro_ref = luaL_ref(tarantool_L, LUA_REGISTRYINDEX); @@ -360,7 +361,7 @@ admin_handler(va_list ap) * a remote client: it's used in Lua * stored procedures. */ - session_create(coio.fd); + session_create(coio.fd, *(uint64_t *) addr); for (;;) { if (admin_dispatch(&coio, iobuf, L) < 0) return; diff --git a/src/coio.cc b/src/coio.cc index 677b726a1e..3d143d9a2f 100644 --- a/src/coio.cc +++ b/src/coio.cc @@ -568,7 +568,7 @@ coio_service_on_accept(struct evio_service *evio_service, * Start the created fiber. It becomes the coio object owner * and will have to close it and free before termination. */ - fiber_call(f, coio, iobuf, service->handler_param); + fiber_call(f, coio, addr, iobuf, service->handler_param); } void diff --git a/src/iproto.cc b/src/iproto.cc index aa0104d66a..61cab9371f 100644 --- a/src/iproto.cc +++ b/src/iproto.cc @@ -328,21 +328,9 @@ iproto_process_connect(struct iproto_request *request); static void iproto_process_disconnect(struct iproto_request *request); -static uint64_t -get_cookie_by_socket(int fd) -{ - uint64_t cookie = 0; - unsigned int addrlen = (unsigned int)sizeof(cookie); - int get_res = getpeername(fd, (sockaddr*)&cookie, &addrlen); - if (get_res != 0) { - say_warn("getpeername failed"); - return 0; - } - return cookie; -} - static struct iproto_session * -iproto_session_create(const char *name, int fd, box_process_func *param) +iproto_session_create(const char *name, int fd, struct sockaddr_in *addr, + box_process_func *param) { struct iproto_session *session; if (SLIST_EMPTY(&iproto_session_cache)) { @@ -362,7 +350,7 @@ iproto_session_create(const char *name, int fd, box_process_func *param) session->parse_size = 0; session->write_pos = obuf_create_svp(&session->iobuf[0]->out); session->sid = 0; - session->cookie = get_cookie_by_socket(fd); + session->cookie = *(uint64_t *) addr; return session; } @@ -717,7 +705,7 @@ iproto_process_connect(struct iproto_request *request) struct iobuf *iobuf = request->iobuf; int fd = session->input.fd; try { /* connect. */ - session->sid = session_create(fd); + session->sid = session_create(fd, session->cookie); } catch (const ClientError& e) { iproto_reply_error(&iobuf->out, request->header, e); try { @@ -767,7 +755,7 @@ iproto_on_accept(struct evio_service *service, int fd, box_process_func *process_fun = (box_process_func*) service->on_accept_param; - session = iproto_session_create(name, fd, process_fun); + session = iproto_session_create(name, fd, addr, process_fun); iproto_enqueue_request(&request_queue, session, session->iobuf[0], &dummy_header, iproto_process_connect); diff --git a/src/memcached.cc b/src/memcached.cc index 7e99cf54a6..1311fac54f 100644 --- a/src/memcached.cc +++ b/src/memcached.cc @@ -412,10 +412,13 @@ static void memcached_handler(va_list ap) { struct ev_io coio = va_arg(ap, struct ev_io); + struct sockaddr_in *addr = va_arg(ap, struct sockaddr_in *); struct iobuf *iobuf = va_arg(ap, struct iobuf *); stats.total_connections++; stats.curr_connections++; + (void) addr; + try { auto scoped_guard = make_scoped_guard([&] { fiber_sleep(0.01); diff --git a/src/session.cc b/src/session.cc index bcb7af3d1b..eeb9c524ea 100644 --- a/src/session.cc +++ b/src/session.cc @@ -40,21 +40,8 @@ static struct mh_i32ptr_t *session_registry; struct session_trigger session_on_connect; struct session_trigger session_on_disconnect; -static uint64_t -get_cookie_by_socket(int fd) -{ - uint64_t cookie = 0; - unsigned int addrlen = (unsigned int)sizeof(cookie); - int get_res = getpeername(fd, (sockaddr*)&cookie, &addrlen); - if (get_res != 0) { - say_warn("getpeername failed"); - return 0; - } - return cookie; -} - uint32_t -session_create(int fd) +session_create(int fd, uint64_t cookie) { /* Return the next sid rolling over the reserved value of 0. */ while (++sid_max == 0) @@ -75,7 +62,7 @@ session_create(int fd) * Run the trigger *after* setting the current * fiber sid. */ - fiber_set_sid(fiber, sid, get_cookie_by_socket(fd)); + fiber_set_sid(fiber, sid, cookie); if (session_on_connect.trigger) { void *param = session_on_connect.param; try { -- GitLab