diff options
| author | Krishnan P <kp@gluster.com> | 2011-07-12 02:45:46 +0000 | 
|---|---|---|
| committer | Anand Avati <avati@gluster.com> | 2011-07-12 05:38:10 -0700 | 
| commit | 7d1053f30d4c1a8ebf97d93008033704f12fcea6 (patch) | |
| tree | 5d0fb216e746681a2a659e54c782528f4f8b7a8f | |
| parent | 8d340ec57557708a8e9db24d397ef3a9e0220a49 (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 | 34 | 
1 files changed, 12 insertions, 22 deletions
diff --git a/xlators/protocol/server/src/server-helpers.c b/xlators/protocol/server/src/server-helpers.c index 1abe4d2d86e..28def17ec0f 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++;  | 
