From: yishi c. <hol...@gm...> - 2012-05-31 10:48:26
|
hi : I discovered some small bug of master. when It clean the serventry which is taged as KILL(eptr->mode==KILL),the matocuservhead's list will broken .however ,as the mount and chunkserver will reconnect after a few seconds ,this problem is uneasy to be exposed. and I don't know if this problem is known? the patch code is listed below. mfsmaster/matocuserv.c @@ -3458,7 +3458,7 @@ void matocuserv_serve(struct pollfd *pdesc) { uint32_t now=main_time(); - matocuserventry *eptr,**kptr; + matocuserventry *eptr,**kptr,**wptr; packetstruct *pptr,*paptr; int ns; @@ -3520,6 +3520,7 @@ } } kptr = &matocuservhead; + wptr = &matocuservhead; while ((eptr=*kptr)) { if (eptr->mode == KILL) { matocu_beforedisconnect(eptr); @@ -3536,11 +3537,19 @@ pptr = pptr->next; free(paptr); } + if(eptr == matocuservhead) { + matocuservhead = eptr->next; + wptr = &matocuservhead; + } + else { + *wptr->next = eptr->next; + } *kptr = eptr->next; free(eptr); } else { + wptr = &eptr; kptr = &(eptr->next); } } } mfsmaster/matocsserv.c void matocsserv_serve(struct poll_fd *pdesc) { uint32_t now=main_time(); uint32_t peerip; - matocsserventry *eptr,**kptr; + matocsserventry *eptr,**kptr,**wptr; packetstruct *pptr,*paptr; int ns; @@ -1753,6 +1753,7 @@ } } kptr = &matocsservhead; + wptr = &matocsservhead; while ((eptr=*kptr)) { if (eptr->mode == KILL) { double us,ts; @@ -1777,9 +1778,17 @@ if (eptr->servstrip) { free(eptr->servstrip); } + if(eptr == matocsservhead) { + matocsservhead = eptr->next; + wptr = &matocsservhead; + } + else { + *wptr->next = eptr->next; + } *kptr = eptr->next; free(eptr); } else { + wptr = &eptr; kptr = &(eptr->next); } } mfsmaster/matomlserv.c void matomlserv_serve(struct pollfd *pdesc) { uint32_t now=main_time(); - matomlserventry *eptr,**kptr; + matomlserventry *eptr,**kptr,**wptr; packetstruct *pptr,*paptr; int ns; @@ -550,6 +550,7 @@ } } kptr = &matomlservhead; + wptr = &matomlservhead; while ((eptr=*kptr)) { if (eptr->mode == KILL) { matomlserv_beforeclose(eptr); @@ -569,9 +570,17 @@ if (eptr->servstrip) { free(eptr->servstrip); } + if(eptr == matomlservhead) { + matomlservhead = eptr->next; + wptr = &matomlservhead; + } + else { + *wptr->next = eptr->next; + } *kptr = eptr->next; free(eptr); } else { + wptr = &eptr; kptr = &(eptr->next); } } |