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