Kosmos Filesystem中有关读后写的问题

来源:互联网 发布:黄播软件 编辑:程序博客网 时间:2024/06/05 02:58

KFS给出的测试程序中,所有的测试都是针对单独的读文件操作和单独的写文件操作进行的测试,然后读文件和写文件交叉进行会出现什么现象呢?

 

在读文件之后马上进行写文件,会造成系统阻塞!

 

测试:

在一个程序中创建一个新文件或者打开一个原有文件,然后对该文件进行以下序列的操作:写->读->写->读。

 

运行过程:

GETLAYOUT

SIZE

ALLOCATE

SIZE

WRITE_ID_ALLOC

WRITE_PREPARE

data transfer...

WRITE_SYNC

LEASE_ACQUIRE

READ

WRITE_ID_ALLOC

WRITE_PREPARE

data transfer...

WRITE_SYNC   XXX:-1001

 

结果:

程序在WRITE_SYNC一步出现错误,返回值为-1001。

 

分析:

libClient程序无论在打开文件或关闭文件时,都不会与服务器进行通信,而只有在读写文件的时候才向服务器申请对应的lease。在ALLOCATE一步,服务端会检查该文件对应的chunk是否有读写lease,如果都没有,则分配写lease,用于写文件。而在读文件时,libClient程序会发送ALLOCATE命令到服务端,此时服务端并不进行任何检查(检查是否有写lease或者读lease),直接插入读lease到lease列表中。

这样,当再次调用写操作时,由于lease列表中已经存在读lease(并且这些lease没有失效),则无法进行下一次的写操作,返回错误。

 

解决方案之一:

在open和close函数中加入对服务器端状态进行清空的操作,保证lease及时释放;对于每一个文件的操作,只能进行读或写中的一个,而不能同时进行;当有一个用户读取文件时,其他用户可以进行读操作,任何用户不能进行写操作;有一个用户进行写操作时,其他用户不能进行读操作。

 

解决方案二:

在完成每一次的读操作之后,进行lease的清除操作。

 

注:还没有分析完整代码,可能会有错误!仅供参考。

原创粉丝点击