diff options
author | Krishnan P <kp@gluster.com> | 2011-07-11 01:46:37 +0000 |
---|---|---|
committer | Anand Avati <avati@gluster.com> | 2011-07-12 02:24:48 -0700 |
commit | c6176b1516c2d6a9dfbdc4b769a90f8c24b0a595 (patch) | |
tree | 230ebb5bdc7edf665a219b71bd88e86aa02aaf17 | |
parent | 0d8235c7962e486cd0c1bad47613309aaa573b6b (diff) |
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 <kp@gluster.com>
Signed-off-by: Anand Avati <avati@gluster.com>
BUG: 3104 (Self-heal does not work in dis-rep!)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=3104
-rw-r--r-- | xlators/protocol/server/src/server-helpers.c | 29 |
1 files changed, 10 insertions, 19 deletions
diff --git a/xlators/protocol/server/src/server-helpers.c b/xlators/protocol/server/src/server-helpers.c index 0ae8ecec9..589736485 100644 --- a/xlators/protocol/server/src/server-helpers.c +++ b/xlators/protocol/server/src/server-helpers.c @@ -767,34 +767,25 @@ 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; conf = this->private; 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 = (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); + 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); - } + list_add (&conn->list, &conf->conns); conn->ref++; conn->active_transports++; |