From fa1feca4172776ba4ae011ffa679a02055951e37 Mon Sep 17 00:00:00 2001 From: Krishnan P Date: Tue, 12 Jul 2011 02:31:05 +0000 Subject: server: Reassociating 'old' conn can lead to chaos. Since we moved to a single socket connection b/w client and server, inherting connection state is unnecessary and can sometimes be dangerous when clients reconnect even before the server detects a socket error on the old connection. Dirty detail: This reassociation results in 'ref count' not decreasing in tandem with the connection disconnects. This results in a resource leak. Signed-off-by: Krishnan Parthasarathi Signed-off-by: Anand Avati BUG: 3104 (Self-heal does not work in dis-rep!) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=3104 --- xlators/protocol/server/src/server-helpers.c | 34 ++++++++++------------------ 1 file changed, 12 insertions(+), 22 deletions(-) (limited to 'xlators') diff --git a/xlators/protocol/server/src/server-helpers.c b/xlators/protocol/server/src/server-helpers.c index 1abe4d2d8..28def17ec 100644 --- a/xlators/protocol/server/src/server-helpers.c +++ b/xlators/protocol/server/src/server-helpers.c @@ -794,7 +794,6 @@ server_connection_t * server_connection_get (xlator_t *this, const char *id) { server_connection_t *conn = NULL; - server_connection_t *trav = NULL; server_conf_t *conf = NULL; GF_VALIDATE_OR_GOTO ("server", this, out); @@ -804,27 +803,18 @@ server_connection_get (xlator_t *this, const char *id) pthread_mutex_lock (&conf->mutex); { - list_for_each_entry (trav, &conf->conns, list) { - if (!strcmp (id, trav->id)) { - conn = trav; - break; - } - } - - if (!conn) { - conn = (void *) GF_CALLOC (1, sizeof (*conn), - gf_server_mt_conn_t); - if (!conn) - goto unlock; - - conn->id = gf_strdup (id); - conn->fdtable = gf_fd_fdtable_alloc (); - conn->ltable = gf_lock_table_new (); - conn->this = this; - pthread_mutex_init (&conn->lock, NULL); - - list_add (&conn->list, &conf->conns); - } + conn = (void *) GF_CALLOC (1, sizeof (*conn), + gf_server_mt_conn_t); + if (!conn) + goto unlock; + + conn->id = gf_strdup (id); + conn->fdtable = gf_fd_fdtable_alloc (); + conn->ltable = gf_lock_table_new (); + conn->this = this; + pthread_mutex_init (&conn->lock, NULL); + + list_add (&conn->list, &conf->conns); conn->ref++; conn->active_transports++; -- cgit