| 作者 | 时间 | QQ技术交流群 |
|---|---|---|
| perrynzhou@gmail.com | 2024/09/04 | 672152841 |

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_handlerstatic 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_handlerstatic 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_handlerstatic 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_SUPPORTstatic 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




