enum PVFS_server_op { PVFS_SERV_INVALID = 0, PVFS_SERV_CREATE = 1, PVFS_SERV_REMOVE = 2, PVFS_SERV_IO = 3, PVFS_SERV_GETATTR = 4, PVFS_SERV_SETATTR = 5, PVFS_SERV_LOOKUP_PATH = 6, PVFS_SERV_CRDIRENT = 7, PVFS_SERV_RMDIRENT = 8, PVFS_SERV_CHDIRENT = 9, PVFS_SERV_TRUNCATE = 10, PVFS_SERV_MKDIR = 11, PVFS_SERV_READDIR = 12, PVFS_SERV_GETCONFIG = 13, PVFS_SERV_WRITE_COMPLETION = 14, PVFS_SERV_FLUSH = 15, PVFS_SERV_MGMT_SETPARAM = 16, PVFS_SERV_MGMT_NOOP = 17, PVFS_SERV_STATFS = 18, PVFS_SERV_PERF_UPDATE = 19, /* not a real protocol request */ PVFS_SERV_MGMT_PERF_MON = 20, PVFS_SERV_MGMT_ITERATE_HANDLES = 21, PVFS_SERV_MGMT_DSPACE_INFO_LIST = 22, PVFS_SERV_MGMT_EVENT_MON = 23, PVFS_SERV_MGMT_REMOVE_OBJECT = 24, PVFS_SERV_MGMT_REMOVE_DIRENT = 25, PVFS_SERV_MGMT_GET_DIRDATA_HANDLE = 26, PVFS_SERV_JOB_TIMER = 27, /* not a real protocol request */ PVFS_SERV_PROTO_ERROR = 28, PVFS_SERV_GETEATTR = 29, PVFS_SERV_SETEATTR = 30, PVFS_SERV_DELEATTR = 31, PVFS_SERV_LISTEATTR = 32, PVFS_SERV_SMALL_IO = 33, PVFS_SERV_LISTATTR = 34, /* leave this entry last */ PVFS_SERV_NUM_OPS };
注意以下的假设都是只有一个元数据和数据服务器,且都在一台服务器上,单机配置。
创建文件的操作
在客户端执行pvfs2-touch /mnt/pvfs2/file2
服务器端执行的操作顺序是
1也就是先获得 PVFS_SERV_GETCONFIG = 13,
2然后查看一下目录的属性信息
3然后分别创建了metafile
4创建一个datafile
5然后设置文件属性信息
6最后在目录项上添加一个表项
如果没有权限执行最后一步,那么结果会出现如下(比如在一个root目录权限下,一个普通用户想创建文件)
也就是会将原来的创建元数据文件和数据文件再删除掉。
删除一个文件的操作
在客户端执行pvfs2-rm /mnt/pvfs2/file
那么服务器端的步骤如下:
步骤就是
1首先还是获得config文件
2.删除父目录的目录项
3.读取的文件的属性信息(这一步有个目的,就是获得其数据文件的分布,从而直到数据文件的handle,但是我没发现有检查是否有权限的功能,比如普通用户删除root用户文件
4.删除文件的数据文件
5.删除文件的元数据文件
创建一个目录的操作
在客户端执行pvfs2-mkdir /mnt/pvfs2/dir2
那么服务器端的操作步骤是:
步骤就是:
1.首先获得config文件
2.获得父目录的属性信息(目的是什么,检查权限吗,还是检查是否有重名的文件or目录已经存在)
3.创建目录对象
4.在父目录上添加目录表项
当在客户端再次执行pvfs2-mkdir /mnt/pvfs2/dir2时
服务器端执行的步骤是
在最后一步添加目录项的时候,发现有相同名字的目录项,那么这时候要把已经创建好的目录对象再删除掉,并且给客户端报错。
删除目录的操作
在客户端执行pvfs2-rm /mnt/pvfs2/dir2
那么服务器端执行的步骤是:
步骤是:
1首先获得config文件
2.然后删除父目录的目录表项
3.获得目录文件的属性信息(目的是什么呢,检查有没有权限吗,还是什么原因)
4.删除目录文件对象
获取文件属性的操作
就当做一个基本的操作,服务器端执行
查找文件or目录操作(lookup操作)
这个操作出现在以上各种操作之前,用来查找目录文件的handle,比如创建一个文件,首先根据路径查到到父目录的handle了
,删除一个文件同样需要先找到这个要删除文件的父目录,然后才能进行下面的操作,创建目录,删除目录与上面的创建文件,删除文件类似的
对于sys-getattr.sm的改动
nested machine pvfs2_client_getattr_sm { /* state acache_lookup { run getattr_acache_lookup; GETATTR_ACACHE_MISS => object_getattr_setup_msgpair; GETATTR_NEED_DATAFILE_SIZES => datafile_get_sizes; default => cleanup; }*/ state object_getattr_setup_msgpair { run getattr_object_getattr_setup_msgpair; success => object_getattr_xfer_msgpair; default => cleanup; } state object_getattr_xfer_msgpair { jump pvfs2_msgpairarray_sm; success => acache_insert; GETATTR_NEED_DATAFILE_SIZES => datafile_get_sizes; default => object_getattr_failure; } state acache_insert { run getattr_acache_insert; default => cleanup; } state object_getattr_failure { run getattr_object_getattr_failure; default => cleanup; } state datafile_get_sizes { jump pvfs2_client_datafile_getattr_sizes_sm; success => acache_insert; default => cleanup; } state cleanup { run getattr_cleanup; default => return; } } machine pvfs2_client_sysint_getattr_sm { state dowork { jump pvfs2_client_getattr_sm; default => set_sys_response; } state set_sys_response { run getattr_set_sys_response; default => terminate; } }对于sys-lookup.sm的改变
state lookup_segment_start { run lookup_segment_start; /*success => lookup_segment_query_ncache;*/ success => lookup_segment_setup_msgpair; default => lookup_segment_lookup_failure; }
static PINT_sm_action lookup_segment_setup_msgpair(struct PINT_smcb *smcb, job_status_s *js_p) { ............. /*seg_to_lookup = cur_seg->seg_remaining ? cur_seg->seg_remaining : cur_seg->seg_name; */ seg_to_lookup = cur_seg->seg_name; ................. }
服务器端执行的步骤为
步骤为:
1首先还是活的config文件
2.查找目录dir3
3查找目录dir4
4查找目录dir5
5查找目录dir6
6查找目录dir7
7查找目录dir8
8获得父目录的属性信息
9创建目录
10在父目录中创建目录项
同理在在一个长目录下创建文件也是类似的。
读取目录项readdir的步骤
在客户端执行pvfs2-ls
那么服务器端执行的步骤为:
列取目录的骤上面已经分析过了,这里看看readdir的步骤
很明显readdir分成两步,第一步获取目录的属性信息,第二部读取目录项,这里为什么会有两个readdir呢,这是因为pvfs2设定了每次读取目录项的个数,当一个目录的目录项的个数超过一定值的时候,就分成若干次readdir来完成。