[置顶] pvfs2.7.1的基本操作


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

服务器端执行的操作顺序是

[置顶] pvfs2.7.1的基本操作_第1张图片

1也就是先获得 PVFS_SERV_GETCONFIG = 13,

2然后查看一下目录的属性信息

3然后分别创建了metafile

4创建一个datafile

5然后设置文件属性信息

6最后在目录项上添加一个表项

如果没有权限执行最后一步,那么结果会出现如下(比如在一个root目录权限下,一个普通用户想创建文件)

[置顶] pvfs2.7.1的基本操作_第2张图片

也就是会将原来的创建元数据文件和数据文件再删除掉。



删除一个文件的操作

在客户端执行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的时候

服务器端执行的步骤为

[置顶] pvfs2.7.1的基本操作_第3张图片

步骤为:

1首先还是活的config文件

2.查找目录dir3

3查找目录dir4

4查找目录dir5

5查找目录dir6

6查找目录dir7

7查找目录dir8

8获得父目录的属性信息

9创建目录

10在父目录中创建目录项

同理在在一个长目录下创建文件也是类似的。



读取目录项readdir的步骤


在客户端执行pvfs2-ls

那么服务器端执行的步骤为:

[置顶] pvfs2.7.1的基本操作_第4张图片


列取目录的骤上面已经分析过了,这里看看readdir的步骤

很明显readdir分成两步,第一步获取目录的属性信息,第二部读取目录项,这里为什么会有两个readdir呢,这是因为pvfs2设定了每次读取目录项的个数,当一个目录的目录项的个数超过一定值的时候,就分成若干次readdir来完成。







你可能感兴趣的:(timer,object,struct,服务器,insert,nested)