From 967a77ed4db0e1c0bcc23f132e312b659ce961ef Mon Sep 17 00:00:00 2001 From: Atin Mukherjee Date: Mon, 9 May 2016 12:14:37 +0530 Subject: glusterd: search port from last_alloc to base_port If a brick process is killed ungracefully then GlusterD wouldn't receive a PMAP_SIGNOUT event and hence the stale port details wouldn't be removed out. Now consider the following case: 1. Create a volume with 1 birck 2. Start the volume (say brick port allocated is 49152) 3. Kill the brick process by 'kill -9' 4. Stop & delete the volume 5. Recreate the volume and start it. (Now the brick port gets 49153) 6. Mount the volume Now in step 6 mount will fail as GlusterD will provide back the stale port number given the query starts searching from the base_port. Solution: To avoid this, searching for port from last_alloc and coming down to base_port should solve the issue. Change-Id: I9afafd722a7fda0caac4cc892605f4e7c0e48e73 BUG: 1334270 Signed-off-by: Atin Mukherjee Reviewed-on: http://review.gluster.org/14268 Smoke: Gluster Build System NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System Reviewed-by: Samikshan Bairagya Reviewed-by: Jeff Darcy --- xlators/mgmt/glusterd/src/glusterd-pmap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'xlators') diff --git a/xlators/mgmt/glusterd/src/glusterd-pmap.c b/xlators/mgmt/glusterd/src/glusterd-pmap.c index 192a1d95258..6a89a4fe6e3 100644 --- a/xlators/mgmt/glusterd/src/glusterd-pmap.c +++ b/xlators/mgmt/glusterd/src/glusterd-pmap.c @@ -115,7 +115,7 @@ pmap_registry_search (xlator_t *this, const char *brickname, pmap = pmap_registry_get (this); - for (p = pmap->base_port; p <= pmap->last_alloc; p++) { + for (p = pmap->last_alloc; p >= pmap->base_port; p--) { if (!pmap->ports[p].brickname || pmap->ports[p].type != type) continue; @@ -142,7 +142,7 @@ pmap_registry_search_by_xprt (xlator_t *this, void *xprt, pmap = pmap_registry_get (this); - for (p = pmap->base_port; p <= pmap->last_alloc; p++) { + for (p = pmap->last_alloc; p >= pmap->base_port; p--) { if (!pmap->ports[p].xprt) continue; if (pmap->ports[p].xprt == xprt && -- cgit