diff options
| author | Mohit Agrawal <moagrawal@redhat.com> | 2019-01-28 21:28:45 +0530 | 
|---|---|---|
| committer | Amar Tumballi <amarts@redhat.com> | 2019-01-31 06:23:39 +0000 | 
| commit | b41cdeb638f9f9ec2fef13ec95c216faf52a9df9 (patch) | |
| tree | 65692a065793a0241f0c23375af45bc0b46858cb /xlators/protocol | |
| parent | 09db11b0c020bc79d493c6d7e7ea4f3beb000c68 (diff) | |
core: heketi-cli is throwing error "target is busy"
Problem: When rpc-transport-disconnect happens, server_connection_cleanup_flush_cbk() 
         is supposed to call rpc_transport_unref() after open-files on 
         that transport are flushed per transport.But open-fd-count is 
         maintained in bound_xl->fd_count, which can be incremented/decremented 
         cumulatively in server_connection_cleanup() by all transport 
         disconnect paths. So instead of rpc_transport_unref() happening 
         per transport, it ends up doing it only once after all the files 
         on all the transports for the brick are flushed leading to 
         rpc-leaks.
Solution: To avoid races maintain fd_cnt at client instead of maintaining
          on brick
Credits: Pranith Kumar Karampuri
Change-Id: I6e8ea37a61f82d9aefb227c5b3ab57a7a36850e6
fixes: bz#1668190
Signed-off-by: Mohit Agrawal <moagrawal@redhat.com>
Diffstat (limited to 'xlators/protocol')
| -rw-r--r-- | xlators/protocol/server/src/server-helpers.c | 4 | 
1 files changed, 2 insertions, 2 deletions
diff --git a/xlators/protocol/server/src/server-helpers.c b/xlators/protocol/server/src/server-helpers.c index 8ad2d8492ed..1a34239d8b9 100644 --- a/xlators/protocol/server/src/server-helpers.c +++ b/xlators/protocol/server/src/server-helpers.c @@ -257,7 +257,7 @@ server_connection_cleanup_flush_cbk(call_frame_t *frame, void *cookie,          victim = client->bound_xl;      if (victim) { -        fd_cnt = GF_ATOMIC_DEC(victim->fd_cnt); +        fd_cnt = GF_ATOMIC_DEC(client->fd_cnt);          if (!fd_cnt && conf && detach) {              pthread_mutex_lock(&conf->mutex);              { @@ -399,7 +399,7 @@ server_connection_cleanup(xlator_t *this, client_t *client, int32_t flags,              if (fd_cnt) {                  if (fd_exist)                      (*fd_exist) = _gf_true; -                GF_ATOMIC_ADD(bound_xl->fd_cnt, fd_cnt); +                GF_ATOMIC_ADD(client->fd_cnt, fd_cnt);              }          }  | 
