到底怎么回事,这里实在是很迷糊。
之前能够同时写入的情况是在create 新文件时发生。
但是接下来。
出现的是a b 写入,然后 a c 写入。
mfs 的机制本身是可以做到数据写入肯定是顺序的。
从源头出发,什么地方会出现文件这样的写入。两次不同的打开。然后随意写入。
可能是不同软件。
写入的意义。
这是少量情况。
如果采用,写入这个文件就不让另外的形式来打开。
也可以解决,但是和传统的不吻合的。
当然并不一定要和传统的一样。
但是传统本身优秀的地方,能够保持的就要保持。
我们做到让它写入的数据是同一份。
nas proxy 在 open write release 几处做处理。
open 时看文件是否被open 过,如果已经被open了。
那么就是用已经被open的文件。
这里对于读文件是否存在问题。
文件读每次的状态是独立的。不存在问题。
写入也是更具offset 查找文件位置,
write 应该锁住,针对file 进行锁。
因为里面的过程如果交错是无法判断那里出现什么问题的。
如其中的cfile 文件。打开写的时候,其他数据也要受保护。
release 时查看nlinks。如果有n_link-- 后不是0,说明还有
其他对象在使用它,那么返回。
等于0时彻底释放。
是否会造成一个文件如果一直被写入,那么会一直无法释放。
或者打开一个文件后一直不释放。
这种属于可能但是不正确的用户操作了。
使用flush 是否利于解决这个问题。
release 只有一次起作用,那相当于把两次写操作和并在一起。
这合理吗。从文件系统的角度看是不合理的。
但是我们如果作为一个同步的工具来看。
反而有一定的优势。(除开过长时间修改,造成版本不一致问题。)
在open时 也需要对map 加锁。
两个open 同时进行。检查插入前可能没有,
找到一个文件的过程是很漫长的。
找的过程中,另外一个文件也开始找了。
多次请求readdir 的事情从哪里来?
上面这种情况解释了这个。
我们读取一个目录,
同步情况要了解会发生些什么,才知道如何安排好大家的顺序。
没办法对同一个文件进行锁。
对程序进行改造,把需要进行map 操作的地方转移。
如果文件正在被释放,这个时候去打开呢?
许多地方都需要考虑锁了。 nlink 的改变,文件对象的改变。
17:51:49[INFO][340874][159894384][ proxyfs_open],fi 164152456 file: /aa ,Size:9 oflags:0
17:51:49[INFO][340874][151501680][ proxyfs_write],start fi->fh 164152456 /aa 9 9
17:51:49[INFO][340908][151501680][ proxyfs_write], initcfile
17:51:49[INFO][340909][151501680][ proxyfs_write],end /aa 9 9 file->Size:9
17:51:49[INFO][340934][130784112][ proxyfs_open],fi 164152456 file: /aa ,Size:18 oflags:0
17:51:49[INFO][340935][122391408][ proxyfs_truncate],filep :164152456 file /aa 0
17:51:49[INFO][340936][122391408][ proxyfs_truncate],file is not changed
17:51:49[INFO][340973][159894384][ proxyfs_write],start fi->fh 164152456 /aa 0 5
17:51:49[INFO][340973][159894384][ proxyfs_write],end /aa 0 5 file->Size:0
17:51:50[INFO][341696][97213296][ send_data_pre], get File md5 56f0e29e61dc86a5bcc0eee19c397ed6
17:51:50[ERROR][341788][88820592][ read],file /home/chentao/.proxyfs_cache/70924j5agWR fail:fd -1 error message Bad file descriptor
17:51:50[ERROR][341798][88820592][ send_data_pre], GetFileMd5 error
17:51:50[INFO][341799][88820592][ send_data_pre], get File md5
17:51:50[ERROR][341800][88820592][ proxyfs_release], send_data_pre error
17:51:50[ERROR][341837][97213296][ PutFile],file /aa size 5
17:51:50[ERROR][341838][97213296][ proxyfs_release],send_data_proc: error!
17:51:53[INFO][345113][113998704][ real_update], Test update delete dir /
如果一个文件先写,然后被截断。文件在open时,发现已经存在。
但是在release 过程中,打开了该文件。release 会依然释放文件内容。
这样open 实际上就没有什么真正的内容了。
如果一个文件已经在释放过程中了,就可以不需要合并了。
文件对象如果采用共享。
应该减少这种数据共同使用的情况。
一个文件同时被两次写的情况,可以通过
还有path 被两次的插入了一个文件,
open 可能一个文件被多次打开。插入
以路径名作为map的索引不合适。
什么在一次中是独立的。
truncate 这种情况怎么处理。
最好有 oflags 。
阅读(506) | 评论(0) | 转发(0) |