GlusterFS/코드 분석/xlator/mgmt/rebalance

From PGWiki

RPC 처리

  1. glusterd(mgmt xlator)는 gd_svc_cli_actorsGLUSTER_CLI_DEFRAG_VOLUME과 사상되는 glusterd_handle_defrag_volume()을 호출
    1. glusterd_big_locked_handler()를 호출
      1. __gluster_handle_defrag_volume()를 호출
        1. 요청 시 명령이 GF_DEFRAG_CMD_STATUS, GF_DEFRAG_CMD_STATUS_TIER, GF_DEFRAG_CMD_DETACH_TIER, GF_DEFRAG_CMD_STOP_DETACH_TIER, GF_DEFRAG_CMD_STOP, GF_DEFRAG_CMD_DETACH_STATUS 중 하나와 일치하면 glusterd_op_begin(..., GD_OP_DEFRAG_BRICK_VOLUME, ...)을 호출
        2. 그렇지 않다면 glusterd_op_begin(..., GD_OP_REBALANCE, ...)을 호출
        3. glusterd_friend_sm()을 호출하여 피어 상태 기계를 갱신
        4. glusterd_op_sm()을 호출하여 연산 상태 기계를 갱신

glusterd_op_begin()

  1. gluster_op_txn_begin()을 호출
    1. glusterd_generate_txn_id()을 호출
    2. glusterd_set_originator_uuid()를 호출
    3. glusterd_mgmt_v3_lock(volname, MY_UUID, &op_errno, "vol")을 호출
    4. locked = 1을 하여 로컬 잠금이 되었음을 기록하여 이후 오류 발생 시, 로컬 잠금을 해제하기 위해 사용
    5. glusterd_txn_opinfo_init()을 호출
    6. glusterd_set_txn_info()를 호출
    7. glusterd_op_sm_inject_event()를 호출
    8. if (locked && ret) 즉, 잠금이 걸린 상태에서 실패한 경우,
      1. priv->op_version < GD_OP_VERSION_3_6_0인 경우,
        1. glusterd_unlock(MY_UUID)를 호출
      2. 그 이상인 경우,
        1. glusterd_mgmt_v3_unlock(volname, MY_UUID, "vol")을 호출