Resolves: bz#1390151 bz#1410145 bz#1429190 bz#1510752 bz#1511779 Resolves: bz#1570958 bz#1574490 bz#1595246 bz#1618669 bz#1661393 Resolves: bz#1668989 bz#1669020 Signed-off-by: Milind Changire <mchangir@redhat.com>
		
			
				
	
	
		
			115 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 61d178c25468adfac4cbdfcef43a0d002c635466 Mon Sep 17 00:00:00 2001
 | |
| From: Mohit Agrawal <moagrawa@redhat.com>
 | |
| Date: Tue, 5 Feb 2019 12:49:10 +0530
 | |
| Subject: [PATCH 513/529] 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
 | |
| > (Cherry pick from commit b41cdeb638f9f9ec2fef13ec95c216faf52a9df9)
 | |
| > (Reviewed on upstream link https://review.gluster.org/#/c/glusterfs/+/22108/)
 | |
| 
 | |
| Change-Id: Ic810095ea1ce418836d240d411168df8be0e4a41
 | |
| BUG: 1669020
 | |
| Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
 | |
| Reviewed-on: https://code.engineering.redhat.com/gerrit/162251
 | |
| Tested-by: RHGS Build Bot <nigelb@redhat.com>
 | |
| Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
 | |
| ---
 | |
|  libglusterfs/src/client_t.c                  | 1 +
 | |
|  libglusterfs/src/client_t.h                  | 2 ++
 | |
|  libglusterfs/src/xlator.c                    | 1 -
 | |
|  libglusterfs/src/xlator.h                    | 3 ---
 | |
|  xlators/protocol/server/src/server-helpers.c | 4 ++--
 | |
|  5 files changed, 5 insertions(+), 6 deletions(-)
 | |
| 
 | |
| diff --git a/libglusterfs/src/client_t.c b/libglusterfs/src/client_t.c
 | |
| index a9ae62c..7d92e0d 100644
 | |
| --- a/libglusterfs/src/client_t.c
 | |
| +++ b/libglusterfs/src/client_t.c
 | |
| @@ -232,6 +232,7 @@ gf_client_get (xlator_t *this, struct rpcsvc_auth_data *cred, char *client_uid,
 | |
|  
 | |
|                  GF_ATOMIC_INIT (client->bind, 1);
 | |
|                  GF_ATOMIC_INIT (client->count, 1);
 | |
| +                GF_ATOMIC_INIT(client->fd_cnt, 0);
 | |
|  
 | |
|                  client->auth.flavour = cred->flavour;
 | |
|                  if (cred->flavour != AUTH_NONE) {
 | |
| diff --git a/libglusterfs/src/client_t.h b/libglusterfs/src/client_t.h
 | |
| index 088508e..403c488 100644
 | |
| --- a/libglusterfs/src/client_t.h
 | |
| +++ b/libglusterfs/src/client_t.h
 | |
| @@ -46,6 +46,8 @@ typedef struct _client {
 | |
|          inode_t *subdir_inode;
 | |
|          uuid_t   subdir_gfid;
 | |
|          int32_t  opversion;
 | |
| +        /* Variable to save fd_count for detach brick */
 | |
| +        gf_atomic_t fd_cnt;
 | |
|  } client_t;
 | |
|  
 | |
|  #define GF_CLIENTCTX_INITIAL_SIZE 8
 | |
| diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c
 | |
| index 340d83d..7d90baa 100644
 | |
| --- a/libglusterfs/src/xlator.c
 | |
| +++ b/libglusterfs/src/xlator.c
 | |
| @@ -490,7 +490,6 @@ xlator_init (xlator_t *xl)
 | |
|  
 | |
|          xl->instance_name = NULL;
 | |
|          GF_ATOMIC_INIT(xl->xprtrefcnt, 0);
 | |
| -        GF_ATOMIC_INIT(xl->fd_cnt, 0);
 | |
|          if (!xl->init) {
 | |
|                  gf_msg (xl->name, GF_LOG_WARNING, 0, LG_MSG_INIT_FAILED,
 | |
|                          "No init() found");
 | |
| diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h
 | |
| index f8f2630..202bdca 100644
 | |
| --- a/libglusterfs/src/xlator.h
 | |
| +++ b/libglusterfs/src/xlator.h
 | |
| @@ -965,9 +965,6 @@ struct _xlator {
 | |
|          /* flag to avoid recall of xlator_mem_cleanup for xame xlator */
 | |
|          uint32_t call_cleanup;
 | |
|  
 | |
| -        /* Variable to save fd_count for detach brick */
 | |
| -        gf_atomic_t fd_cnt;
 | |
| -
 | |
|          /* Variable to save xprt associated for detach brick */
 | |
|          gf_atomic_t xprtrefcnt;
 | |
|  
 | |
| diff --git a/xlators/protocol/server/src/server-helpers.c b/xlators/protocol/server/src/server-helpers.c
 | |
| index 99256bf..30045ef 100644
 | |
| --- a/xlators/protocol/server/src/server-helpers.c
 | |
| +++ b/xlators/protocol/server/src/server-helpers.c
 | |
| @@ -266,7 +266,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);
 | |
|                          {
 | |
| @@ -413,7 +413,7 @@ server_connection_cleanup (xlator_t *this, client_t *client,
 | |
|                          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);
 | |
|                          }
 | |
|                  }
 | |
|  
 | |
| -- 
 | |
| 1.8.3.1
 | |
| 
 |