naver/nbase-arc

gw 의 slot state 가 이상한 값으로 설정되는 경우

lynix94 opened this issue · 0 comments

live migration 테스트 중 delay 명령이
-ERR Slot is out of range or can't be blocked 에러를 나는 경우가 발생하였다.

해당 에러는 check_delay_cmd 에서 발생하는데, slot from, to 가 잘못되거나, conf->slot_state 가 NORMAL 이 아닌경우 발생한다.

확인결과 아래의 값과 같이 slot_state[0] 의 값이 0, 1, 2 (NORMAL, BLOCKING, BLOCKED) 가 아니라 garbage 값으로 되어 있으며 다른 slot_state 들도 마찬가지 이다.

이로 인해 delay 명령이 실패했다.

live migration 시험 중에는 cluster_info, pgs_add, pg_add, delay, redirect 명령을 사용하였으며 이 명령들이 무작위로 실행되던 중 아래와 같은 현상이 나타났다. (아래 현상이 나타나기 전에는 정상동작했음)

개발 중 위 명령들이 무작위로 실행되는 도중 slot_state 가 침범되는 상황이 발생한 것으로 보인다.

   │135     check_delay_cmd (cluster_conf * conf, long long slot_from, long long slot_to)                           │
   │136     {                                                                                                       │
   │137       block_range *range;                                                                                   │
   │138       int i;                                                                                                │
B+ │139       if (slot_from < 0 || slot_to >= conf->nslot || slot_from > slot_to)                                   │
   │140         {                                                                                                   │
   │141           return ERR;                                                                                       │
   │142         }                                                                                                   │
   │143       for (i = slot_from; i <= slot_to; i++)                                                                │
   │144         {                                                                                                   │
  >│145           if (conf->slot_state[i] != SLOT_STATE_NORMAL)                                                     │
   │146             {                                                                                               │
   │147               return ERR;                                                                                   │
   │148             }                                                                                               │
   │149         }                         
(gdb) p	conf->slot_state[0]   
$23 = 971088048