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;
.................
}
在客户端执行pvfs2-mkdir /mnt/pvfs2/dir3/dir4/dir5/dir6/dir7/dir8/dir9的时候
服务器端执行的步骤为
步骤为:
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来完成。