文件锁和事务

时间:2015-05-24 23:23:13

标签: unix pipeline atomicity file-locking filelock

我正在编写一个非常简单的管道来处理上传的文件,我选择将管道状态保留在文件系统而不是数据库上。管道本身非常简单,因为文件在临时位置处理,然后原子地移动到指示管道的特定阶段完成的文件夹中。将文件移动到下一阶段的文件夹后,将删除上一阶段的文件。管道是一个单独的进程,并且一次只有一个处于活动状态,因此不需要担心竞争条件或崩溃情况。在最坏的情况下,我们重复以前完成的工作并浪费一些磁盘空间。

问题出在管道的第一步。处理文件上载的服务器将文件移动到特定文件夹以使其可供客户端访问,同时在另一个文件夹中创建符号链接以指示管道进程有工作要做。由于这里存在竞争条件,我使用文件锁来创建和删除符号链接。管道进程锁定符号链接,处理文件,删除符号链接并释放锁定。上传过程执行相同的操作,除了它用于创建符号链接。这会处理删除符号链接和创建符号链接之间的竞争条件,但这里仍然存在错误。

在将文件移动到位之后但在创建符号链接以指示存在需要处理的文件之前,上载过程可能会崩溃。我想知道处理这种情况的最佳方法是什么。理论上,我可以在上传过程开始时创建一个文件,然后在成功创建符号链接后将其删除,以指示成功创建符号链接但这又会导致与之前相同的锁定问题,因为需要多个上载过程相互协调。

是否有更简单的方法来处理崩溃的上传过程?

1 个答案:

答案 0 :(得分:0)

解决此类问题的常用方法是检查"陈旧"文件。

如果锁定文件的修改日期超过X秒,则假定创建它的进程已经死亡并将其删除。

如果数据文件的修改日期超过X秒,则假定创建它的进程已经死亡并将其删除。

如果你想要非常安全,并且文件不是特别大,你可以让X变得像一天(60 * 60 * 24秒)那样荒谬。

相关问题