[置顶] pvfs2.8.2元数据操作

相关于元数据I/O的主要操作包括以下:

创建文件

[置顶] pvfs2.8.2元数据操作_第1张图片

第一步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;
    }
}



删除文件

[置顶] pvfs2.8.2元数据操作_第2张图片

创建目录

[置顶] pvfs2.8.2元数据操作_第3张图片

删除目录

[置顶] pvfs2.8.2元数据操作_第4张图片

读取对象(目录或者文件)属性

[置顶] pvfs2.8.2元数据操作_第5张图片

列取目录

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操作
首先是readdir操作
然后是将所有的目录项的属性一次性带过来
最后是如果需要文件大小这个属性的话,一次性将所有的文件的数据文件的大小带过来。。。

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操作操作的参数是两个路径名字,可能会涉及到创建删除目录项的符合操作。

你可能感兴趣的:(object,服务器)