summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKrishnan P <kp@gluster.com>2011-07-11 01:46:37 +0000
committerAnand Avati <avati@gluster.com>2011-07-12 02:24:48 -0700
commitc6176b1516c2d6a9dfbdc4b769a90f8c24b0a595 (patch)
tree230ebb5bdc7edf665a219b71bd88e86aa02aaf17
parent0d8235c7962e486cd0c1bad47613309aaa573b6b (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.c29
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++;