core: Portmap entries showing stale brick entries when bricks are down
Problem: pmap is showing stale brick entries after down the brick because of glusterd_brick_rpc_notify call gf_is_service_running before call pmap_registry_remove to ensure about brick instance. Solutiom: 1) Change the condition in gf_is_pid_running to ensure about process existence, use open instead of access to achieve the same 2) Call search_brick_path_from_proc in __glusterd_brick_rpc_notify along with gf_is_service_running Change-Id: Ia663ac61c01fdee6c12f47c0300cdf93f19b6a19 fixes: bz#1646892 Signed-off-by: Mohit Agrawal <moagrawal@redhat.com>
This commit is contained in:
parent
e134ef2493
commit
bcf1e8b074
@ -4015,13 +4015,16 @@ gf_is_pid_running(int pid)
|
||||
char fname[32] = {
|
||||
0,
|
||||
};
|
||||
int fd = -1;
|
||||
|
||||
snprintf(fname, sizeof(fname), "/proc/%d/cmdline", pid);
|
||||
|
||||
if (sys_access(fname, R_OK) != 0) {
|
||||
fd = sys_open(fname, O_RDONLY, 0);
|
||||
if (fd < 0) {
|
||||
return _gf_false;
|
||||
}
|
||||
|
||||
sys_close(fd);
|
||||
return _gf_true;
|
||||
}
|
||||
|
||||
|
@ -6206,10 +6206,13 @@ __glusterd_brick_rpc_notify(struct rpc_clnt *rpc, void *mydata,
|
||||
/* In case of an abrupt shutdown of a brick PMAP_SIGNOUT
|
||||
* event is not received by glusterd which can lead to a
|
||||
* stale port entry in glusterd, so forcibly clean up
|
||||
* the same if the process is not running
|
||||
* the same if the process is not running sometime
|
||||
* gf_is_service_running true so to ensure about brick instance
|
||||
* call search_brick_path_from_proc
|
||||
*/
|
||||
GLUSTERD_GET_BRICK_PIDFILE(pidfile, volinfo, brickinfo, conf);
|
||||
if (!gf_is_service_running(pidfile, &pid)) {
|
||||
if (!gf_is_service_running(pidfile, &pid) ||
|
||||
!search_brick_path_from_proc(pid, brickinfo->path)) {
|
||||
ret = pmap_registry_remove(
|
||||
THIS, brickinfo->port, brickinfo->path,
|
||||
GF_PMAP_PORT_BRICKSERVER, NULL, _gf_true);
|
||||
|
@ -873,4 +873,6 @@ glusterd_get_volinfo_from_brick(char *brick, glusterd_volinfo_t **volinfo);
|
||||
gf_boolean_t
|
||||
glusterd_is_profile_on(glusterd_volinfo_t *volinfo);
|
||||
|
||||
char *
|
||||
search_brick_path_from_proc(pid_t brick_pid, char *brickpath);
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user