暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

lustre分布式锁基础

310

作者时间QQ技术交流群
perrynzhou@gmail.com2024/09/04672152841

ldlm
锁操作码定义

  • lustre客户端每次请求都会在客户端设定分布式锁的操作码,这样请求到达服务端后再有服务端定义的分布式锁操作码定义的后端函数进行处理。

    // [perrynzhou]-分布式锁的OPC操作码,根据操作码来调用哪个具体的函数-[perrynzhou]


    enum ldlm_cmd {
    LDLM_ENQUEUE = 101,
    LDLM_CONVERT = 102,
    LDLM_CANCEL = 103,
    LDLM_BL_CALLBACK = 104,
    LDLM_CP_CALLBACK = 105,
    LDLM_GL_CALLBACK = 106,
    LDLM_SET_INFO = 107,
    LDLM_LAST_OPC
    };
    /*************************lustre后端锁操作码定义的处理函数表**********/
    // [perrynzhou]-lustre端分布式锁的操作码对应的操作函数表
    struct tgt_handler tgt_dlm_handlers[] = {
    TGT_DLM_HDL(HAS_KEY, LDLM_ENQUEUE, tgt_enqueue),
    TGT_DLM_HDL(HAS_KEY, LDLM_CONVERT, tgt_convert),
    TGT_DLM_HDL_VAR(0, LDLM_BL_CALLBACK, tgt_bl_callback),
    TGT_DLM_HDL_VAR(0, LDLM_CP_CALLBACK, tgt_cp_callback)
    };




    • lustre在mgs、mdt、ost
      都定义了分布式锁的处理函数

      // [perrynzhou]-mdt_common_slice是lustre中MDT端处理所有请求的的tgt_handler


      static struct tgt_opc_slice mdt_common_slice[] = {
      // [perrynzhou]-lustre中分布式锁的处理handler
      {
      .tos_opc_start = LDLM_FIRST_OPC,
      .tos_opc_end = LDLM_LAST_OPC,
      .tos_hs = tgt_dlm_handlers
      }
      }


      // [perrynzhou]-ofd_common_slice是ost上请求处理的tgt_handler
      static struct tgt_opc_slice ofd_common_slice[] = {
      {
      .tos_opc_start = LDLM_FIRST_OPC,
      .tos_opc_end = LDLM_LAST_OPC,
      .tos_hs = tgt_dlm_handlers
      }
      }


      // [perrynzhou]-mgs中处理所有请求的tgt_handler
      static struct tgt_opc_slice mgs_common_slice[] = {
      // mgs端分布式锁的服务处理函数
      {
      .tos_opc_start = LDLM_FIRST_OPC,
      .tos_opc_end = LDLM_LAST_OPC,
      .tos_hs = mgs_dlm_handlers
      }
      }





      intent
      锁定义

      • lustre
        意向锁设计目的为了减少一次posix
        请求网络的交互次数。客户端请求中设置意向锁后请求到服务端,根据客户端传递意向锁操作码对应服务端进行处理

        /***************************intent锁定义*******************/
        // [perynzhou]-分布式锁意向意图操作码定义
        enum ldlm_intent_flags {
        IT_OPEN = 0x00000001,
        IT_CREAT = 0x00000002,
        IT_OPEN_CREAT = IT_OPEN | IT_CREAT, * To allow case label. */
        IT_READDIR = 0x00000004, * Used by mdc, not put on the wire. */
        IT_GETATTR = 0x00000008,
        IT_LOOKUP = 0x00000010,
        /* IT_UNLINK = 0x00000020, Obsolete. */
        /* IT_TRUNC = 0x00000040, Obsolete. */
        IT_GETXATTR = 0x00000080,
        /* IT_EXEC = 0x00000100, Obsolete. */
        /* IT_PIN = 0x00000200, Obsolete. */
        IT_LAYOUT = 0x00000400,
        IT_QUOTA_DQACQ = 0x00000800,
        IT_QUOTA_CONN = 0x00001000,
        /* IT_SETXATTR = 0x00002000, Obsolete. */
        IT_GLIMPSE = 0x00004000,
        IT_BRW = 0x00008000,
        };


        /***************************intent锁操作码定义*******************/
        // [perrynzhou]-封装分布式锁的意图操作码定义
        struct ldlm_intent {
        定义的操作的码
        __u64 opc;
        };



        锁定义

        • lustre分布式锁类型定义

          // [perrynzhou]-ldlm_type定义了分布式锁的类型
          enum ldlm_type {
          // [perrynzhou]-lustre中普通锁,意向锁是基于普通锁扩展出来的
          LDLM_PLAIN = 10,
          // 区间锁
          LDLM_EXTENT = 11,
          // flock锁
          LDLM_FLOCK = 12,
          // inode bit锁
          LDLM_IBITS = 13,
          LDLM_MAX_TYPE
          };



          • ost
            端的数据的范围锁定义

            // [perrynzhou]-数据锁,lustre中针对区间锁,锁住的范围区间定义
            struct ldlm_extent {
            // 起始区间值
            __u64 start;
            // 结束区间值
            __u64 end;
            __u64 gid;
            };


            • mdt
              端元数据锁定义

              // [perrynzhou]-元数据锁,用来保护元数据属性
              struct ldlm_inodebits {
              __u64 bits;
              union {
              __u64 try_bits; /* optional bits to try */
              __u64 cancel_bits; /* for lock convert */
              };
              __u64 li_gid;
              };



              • ldlm
                具体锁的处理函数定义

                // [perrynzhou]-lustre不同的锁的粗粒策略函数(分布式锁的处理策略表)
                #ifdef HAVE_SERVER_SUPPORT
                static ldlm_processing_policy ldlm_processing_policy_table[] = {
                [LDLM_PLAIN] = ldlm_process_plain_lock,
                [LDLM_EXTENT] = ldlm_process_extent_lock,
                [LDLM_FLOCK] = ldlm_process_flock_lock,
                [LDLM_IBITS] = ldlm_process_inodebits_lock,
                };

                文章转载自存储内核技术交流,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论