相关于元数据I/O的主要操作包括以下:
创建文件
第一步C->P就是指客户端发给父目录服务器;获取父目录属性信息,这个过程隐藏了查找父目录路径的过程,如果没有查找到父目录在文件系统的handle,就无法获得其属性了,所以这一步隐藏了一个lookup的过程。
第二步C->M 客户端发给指定元数据服务器,创建元数据文件,这个意思是每个文件都对应了一个metadata object,需要先创建这个metadata object
第三步 C->D客户端发给数据服务器,每个数据服务器上创建数据对象data object
第四步 C->M在元数据对象上设置文件的属性,包括基本属性,比如各种时间,还有文件分布,权限等等
第五步C->P客户端发往父目录所在的元数据服务器,创建目录项,因为每个目录包括目录的数据文件,还有目录文件,目录数据文件包括目录项(directory entry=name +handle)目录文件就是指目录的元数据信息,创建一个新文件需要在目录的数据文件中插入一个表项。
对于客户端与服务器端的create.sm其实并不是完全对应的,客户端的sys-create.sm其实对应了创建一个文件的全过程,而在这个过程中客户端需要和不同的较色打交道,比如P,M,D等,可以认为??客户端知道在每个阶段需要和哪些较色(具体地址)打交道,然后控制着整个数据流的流动。
machine pvfs2_client_create_sm { state init { run create_init;//初始化 default => parent_getattr;//获取父目录的属性信息,这个为了做一个检查吗??? } state parent_getattr { jump pvfs2_client_getattr_sm; success => parent_getattr_inspect;//检查 default => cleanup; } state parent_getattr_inspect { run create_parent_getattr_inspect; success => create_setup_msgpair;//创建metadata file 和datafile default => cleanup; } state create_setup_msgpair { run create_create_setup_msgpair; success => create_xfer_msgpair; default => cleanup; } state create_xfer_msgpair { jump pvfs2_msgpairarray_sm; success => crdirent_setup_msgpair;//创建目录项。。 default => cleanup; } state crdirent_setup_msgpair { run create_crdirent_setup_msgpair; success => crdirent_xfer_msgpair;//见这些准备消息传送个元数据服务器数据服务器让其工作起来 default => crdirent_failure;/ } state crdirent_xfer_msgpair { jump pvfs2_msgpairarray_sm; success => cleanup;//创建成功则整个创建文件的过程成功了 default => crdirent_failure;// 否则失败了,但是需要恢复原来的样子,因为整个过程已经执行了一部分了 } state crdirent_failure { run create_crdirent_failure; default => delete_handles_setup_msgpair_array; } state delete_handles_setup_msgpair_array { run create_delete_handles_setup_msgpair_array; success => delete_handles_xfer_msgpair_array; default => cleanup; } state delete_handles_xfer_msgpair_array { jump pvfs2_msgpairarray_sm; default => cleanup; } state cleanup { run create_cleanup; CREATE_RETRY => init;//可以继续重试的 default => terminate; } }服务器端的Create.sm
machine pvfs2_create_sm { state prelude { jump pvfs2_prelude_sm;//准备一下 success => create_metafile;//创建元数据文件 default => setup_final_response; } state create_metafile { run create_metafile;//创建元数据文件,元数据不是以key-value的方式存储在数据库中了吗?? success => check_stuffed;//检查是否需要填充 default => setup_final_response; } state check_stuffed { run check_stuffed; success => create_local_datafiles;//需要填充。。 default => setup_final_response; } state create_local_datafiles { run create_local_datafiles; success => setup_local_datafile_handles;//获得localdatafile的handle?? default => remove_metafile_object; } state setup_local_datafile_handles { run setup_local_datafile_handles; success => request_datafiles; default => remove_local_datafile_handles; } state request_datafiles { run request_datafiles;//请求datafile?? success => write_keyvals;//写key-value default => remove_local_datafile_handles; } state write_keyvals { run write_keyvals; success => setobj_attribs;//设置属性,这个地方是不是设置metafile中的各项属性呢 default => replace_remote_datafile_handles; } state setobj_attribs { run setattr_setobj_attribs; success => setup_resp; default => remove_keyvals; } state setup_resp { run setup_resp; default => setup_final_response; } state remove_local_datafile_handles { run remove_local_datafile_handles; default => remove_metafile_object; } state replace_remote_datafile_handles { run replace_remote_datafile_handles; REPLACE_DONE => remove_local_datafile_handles; default => replace_remote_datafile_handles; } state remove_metafile_object { run remove_metafile_object; default => setup_final_response; } state remove_keyvals { run remove_keyvals; success => replace_remote_datafile_handles; default => setup_final_response; } state setup_final_response { run setup_final_response; default => final_response; } state final_response { jump pvfs2_final_response_sm; default => cleanup; } state cleanup { run cleanup; default => terminate; } }服务器端创建新目录项的状态机为:
machine pvfs2_crdirent_sm { state prelude { jump pvfs2_prelude_sm; success => setup_op; default => final_response; } state setup_op { run crdirent_setup_op; default => validate; } state validate { run crdirent_validate; success => read_directory_entry_handle; INVALID_OBJECT => validation_object_type_failure; default => final_response; } state validation_object_type_failure { run validation_object_type_failure; default => final_response; } state read_directory_entry_handle { run crdirent_read_directory_entry_handle; success => write_directory_entry; default => final_response; } state write_directory_entry { run crdirent_write_directory_entry; success => check_for_req_dir_update; default => final_response; } state check_for_req_dir_update { run crdirent_check_for_req_dir_update; UPDATE_DIR_ATTR_REQUIRED => update_directory_attr; default => final_response; } state update_directory_attr { run crdirent_update_directory_attr; default => final_response; } state final_response { jump pvfs2_final_response_sm; default => cleanup; } state cleanup { run crdirent_cleanup; default => terminate; } }
删除文件
创建目录
删除目录
读取对象(目录或者文件)属性
列取目录
1 C----> P get parent directory attributes //读取父目录的属性 2 C---->P get the entries of the directory //读取父目录的目录项 3 C---->M for each entry get the attributes of the entry //对于每个目录项读取其属性信息
读取目录项readdir
1 C--->P get parent directory attributes
2 C--->P get the entries of the directory
实际上这个读取目录项就是上面列取目录的第二步骤,也就是说读取目录项readdir也分成两步,第一步是获取目录的属性的信息,第二步读取目录的表项。
客户端readdir的状态机
nested machine pvfs2_client_readdir_sm { state init { run readdir_init; default => readdir_getattr; } state readdir_getattr { jump pvfs2_client_getattr_sm; success => readdir_msg_setup_msgpair; default => cleanup; } state readdir_msg_setup_msgpair { run readdir_msg_setup_msgpair; success => readdir_msg_xfer_msgpair; default => readdir_msg_failure; } state readdir_msg_xfer_msgpair { jump pvfs2_msgpairarray_sm; success => cleanup; default => readdir_msg_failure; } state readdir_msg_failure { run readdir_msg_failure; default => cleanup; } state cleanup { run readdir_cleanup; default => return; } }readdirplus也就是list操作
machine pvfs2_client_readdirplus_sm { state init { jump pvfs2_client_readdir_sm; success => readdirplus_fetch_attrs_setup_msgpair; default => readdirplus_msg_failure; } state readdirplus_fetch_attrs_setup_msgpair { run readdirplus_fetch_attrs_setup_msgpair; NO_WORK => cleanup; success => readdirplus_fetch_attrs_xfer_msgpair; default => readdirplus_msg_failure; } state readdirplus_fetch_attrs_xfer_msgpair { jump pvfs2_msgpairarray_sm; success => readdirplus_fetch_sizes_setup_msgpair; default => readdirplus_msg_failure; } state readdirplus_fetch_sizes_setup_msgpair { run readdirplus_fetch_sizes_setup_msgpair; NO_WORK => cleanup; success => readdirplus_fetch_sizes_xfer_msgpair; default => readdirplus_msg_failure; } state readdirplus_fetch_sizes_xfer_msgpair { jump pvfs2_msgpairarray_sm; success => cleanup; default => readdirplus_msg_failure; } }
lookup 操作
lookup操作一段一段的查找,每一段都要获得该段的属性信息
machine pvfs2_client_lookup_sm { state lookup_segment_start { run lookup_segment_start; success => lookup_segment_query_ncache; default => lookup_segment_lookup_failure; } state lookup_segment_query_ncache { run lookup_segment_query_ncache; success => lookup_segment_verify_attr_present; default => lookup_segment_setup_msgpair; } state lookup_segment_setup_msgpair { run lookup_segment_setup_msgpair; success => lookup_segment_lookup_xfer_msgpair; default => lookup_segment_lookup_failure; } state lookup_segment_lookup_xfer_msgpair { jump pvfs2_msgpairarray_sm; success => lookup_segment_verify_attr_present; default => lookup_segment_lookup_failure; } state lookup_segment_lookup_failure { run lookup_segment_lookup_failure; default => lookup_cleanup; } state lookup_segment_verify_attr_present { run lookup_segment_verify_attr_present; success => lookup_segment_check_attr_type; default => lookup_segment_getattr; } state lookup_segment_getattr { jump pvfs2_client_getattr_sm; success => lookup_segment_check_attr_type; default => lookup_cleanup; } state lookup_segment_check_attr_type { run lookup_segment_check_attr_type; LOOKUP_TYPE_DIRECTORY => lookup_context_check_completion; LOOKUP_TYPE_METAFILE => lookup_context_check_completion; LOOKUP_TYPE_LN_NO_FOLLOW => lookup_context_check_completion; LOOKUP_TYPE_RELATIVE_LN => lookup_segment_handle_relative_link; LOOKUP_TYPE_ABSOLUTE_LN => lookup_segment_handle_absolute_link; default => lookup_cleanup; } 121,1 6%
rename 操作
rename操作操作的参数是两个路径名字,可能会涉及到创建删除目录项的符合操作。