GlusterFS/코드 분석/xlator/mgmt/replace-brick

From PGWiki

CLI

  1. gluster_cli_actors에 등록된 GLUSTER_CLI_REPLACE_BRICK과 사상된 gf_cli_replace_brick()을 콜백
    1. cli_to_glusterd(..., GLUSTER_CLI_REPLACE_BRICK, ...)을 호출하여 glusterd에 RPC 요청

RPC 처리

  1. glusterd(mgmt xlator)는 gd_svc_cli_actorsGLUSTER_CLI_REPLACE_BRICK와 사상되는 glusterd_handle_replace_brick()를 콜백
    1. __glusterd_handle_replace_brick()을 호출
      1. glusterd_mgmt_v3_initiate_replace_brick_cmd_phases()
      2. glusterd_mgmt_v3_initiate_lockdown()
      3. glusterd_mgmt_v3_build_payload()
      4. glusterd_mgmt_v3_pre_validate()
        1. glusterd_op_stage_replace_brick()
      5. glusterd_mgmt_v3_commit()
        1. glusterd_op_replace_brick()

glusterd_op_replace_brick()

  1. glusterd_brickinfo_new_from_brick()
    브릭명을 매개 변수로 하여 새로운 브릭 정보(glusterd_brickinfo_t)를 기록하기 위한 자료 구조를 생성
  2. glusterd_resolve_brick()
    전단계에서 생성된 새로운 브릭 정보를 매개 변수로 받아서 그 UUID로 피어 정보의 유효성을 확인한 후, glusterd_hotname_to_uuid()로 해당 브릭 정보의 UUID(brickinfo->uuid)를 다시 쓴다.
  3. glusterd_volume_brickinfo_get_by_brick()
    볼륨 정보(glusterd_volinfo_t)와 이전 브릭의 이름/정보를 받아서 이전 브릭의 정보를 갱신한다.
    신규 브릭이 아닌 이전 브릭 정보를 다시 갱신하는 것은 이전 브릭 정보의 브릭 식별자(old_brickinfo->brick_id)와 포트 번호(old_brickinfo->port)를 정확하게 가져온 후에 이를 신규 브릭 자료 구조에 복사하기 위함이다.
  4. 자료 복사
    다음과 같은 정보들을 복사한다.
    1. brick_id
    2. port
    3. mount_dir
    이후, 브릭들의 연결 리스트에서 이전 브릭 위치 뒤에 새로운 브릭 정보를 추가한 후, 볼륨 정보의 브릭 개수(volinfo->brick_count)를 1만큼 증가시킨다.
  5. glusterd_op_perform_remove_brick
    이전 브릭을 제거한다.
    1. glusterd_volume_brickinfo_get_by_brick()
    2. glusterd_resolve_brick()
    3. glusterd_volinfo_reset_defrag_stats()
      볼륨 정보에서 리밸런싱과 관련된 정보들(volinfo->rebal)을 초기화한다.
    4. (force일 경우) glusterd_brick_stop()
    5. 브릭 정보 무효 처리
      해당 브릭(혹은 브릭 정보)가 비활성 상태임을 나타내는 brickinfo->decommissioned 플래그를 1로 설정
  6. (복제 볼륨인 경우) glusterd_handle_replicate_brick_ops(..., GD_OP_REPLACE_BRICK)
    새로운 브릭의 UUID가 자신(현재 호스트의 glusterd)이 아닐 경우, glusterd_handle_replicate_brick_ops(..., GD_OP_REPLACE_BRICK)을 호출한다.
    1. glusterd_handle_replicate_brick_ops(..., GD_OP_REPLACE_BRICK)
      1. AFR Dirty 플래그 설정
        모든 AFR 연산 중에는 대상에 대한 dirty 플래그를 확장 속성(xattr)에 설정하는데, 여기에서는 브릭의 최상위 경로(brickinfo->path)에 설정하게 된다.
      2. 임시 마운트 디렉터리 생성
        클라이언트 실행 시점에 매개 변수로 전달되는 임시 마운트 디렉터리(/tmp/mntXXXXXX)를 생성한다.
      3. 연산 처리(GD_OP_REPLACE_BRICK)
        runner를 통해 새로운 클라이언트(glusterfs 프로세스)를 실행한다.
      4. 임시 마운트 디렉터리의 확장 속성 설정
        이전 과정에서 만들었던 임시 디렉터리의 GF_AFR_REPLACE_BRICK(trusted.replace-brick) 속성을 브릭 정보의 식별자(brickinfo->brick_id)로 설정한다.
      5. 임시 디렉터리 마운트 해제
        임시 디렉터리의 마운트를 해제한다.
  7. glusterd_create_volfiles_and_notify_services()
    새로운 volfile을 생성한 후, 모든 glusterd의 클라이언트를 대상으로 이를 알리는 GF_CBK_FETCHSPEC 프로토콜을 호출한다.
  8. (볼륨 상태가 GLUSTERD_STATUS_STARTED인 경우) glusterd_brick_start()
    새로운 브릭 정보를 대상으로 하는 브릭을 실행한다.