跳到主要内容

文件本地编辑V1提案No.1

· 阅读需 7 分钟
何丰良
技术支持人员

文件本地编辑功能广受用户欢迎,是核心功能。最近时有用户反馈在多人协作场景下的文件本地编辑不可靠,低几率发生文件冲突和内容不实时同步等问题。

本地编辑过程中的上传/下载是通过一种基于文件时间戳的对比机制触发,如果用户系统时间与服务器系统时间差异较大会造成不稳定因素,因此我们决定对其机制进行升级优化。本篇文章中我将悦库团队的最终讨论结果做为优化提案进行汇总,用于指导用户理解文件本地编辑的交互过程,也用于指导团队开发人员理解业务细节,保证本提案准确落地。

在本提案中我们将基于时间戳的文件对比机制,调整为基于文件版本和内容散列值的对比机制。

什么是文件本地编辑

在网盘客户端中直接点击文件自动下载到缓存位置,并使用本地默认程序打开,本地编辑完成后可自动上传到网盘中。

本地编辑

什么是文件版本

文件版本是指在文件的编辑过程中,对每一次变更作为一个版本号进行记录,以便将来查阅特定历史版本的变更情况。

在多人编辑场景下,一个文件的版本生成过程如下:

image-20220607171234814 悦库网盘的历史版本实例:

这是悦库持续集成系统使用yshell命令行工具自动上传文件产生的历史版本,可以看到每个历史版本中都有对应一个唯一版本号。

image-20220607171255843 在文件的版本列表中可以追溯任意版本的数据,便于查看文件变更情况。

什么是文件内容散列值

通过将文件分块,对每个块进行散列计算,然后对所有块散列值再散列生成文件的内容散列值,以下图例是拥有4个块的文件内容散列值生成过程:

image-20220602151114017

新的本地编辑功能实施

本地编辑功能包括本地打开、自动上传两部分。

本地打开

当用户在客户端中以本地编辑方式打开文件时,首先检查文件的编辑锁定状态,如果文件已被锁定且锁定者不是当前用户,则提示用户文件已被锁定,但可以以只读方式打开,下载打开后文件不能编辑和上传。如果文件没有锁定或锁定者是当前用户,则下载后以读写方式打开文件。

打开文件时,如果文件没有下载,则直接下载,并记录文件的版本号、ID、内容散列值、本地全路径、打开时间、状态等。

如果文件已下载,则检查远程版本号和本地版本号是否一致:

如果一致则不需要下载,直接打开本地文件。

如果远程版本号大于本地版本号,则先计算本地文件的内容散列值,然后与下载时记录的原始散列值进行对比:

  • 如果不一致说明用户在下载文件后做了修改,这时如果强制下载就会覆盖用户本地修改的内容,这就产生了下载冲突,需要提示用户将远程版本的内容和本地修改的内容合并。

  • 如果一致则直接下载并覆盖本地文件,更新本地记录文件的版本号、内容散列值,然后打开本地文件。

自动上传

文件以读写方式本地打开后,网盘会一直监控文件的修改时间,如果发生变更则自动上传。

上传时,如果本地版本号等于远程版本号则直接上传,上传完成后更新本地版本号和内容散列值。

如果本地版本号小于远程版本号,则说明远程文件已经被别人修改过,如果强制上传会覆盖别人的修改,这就产生了上传冲突,需要提示用户将远程版本的内容和本地修改的内容合并。

当用户编辑完成后,需要对文件执行自动解锁操作,由于文件可以进行独占和共享打开,没有通用的方法确认用户是否已经编辑完成,只能用两种模式识别文件编辑完成状态:

  1. 对于已知的独占打开的文件格式,如office文件,可以轮询确认文件是否已经解除占用,如果解除占用则解锁。
  2. 对于其他的文件格式,如文本文件,使用进程关联的方式,轮询打开文件的进程,如果进程退出则解锁。

如果编辑时退出客户端,就不能自动上传,下次启动客户端时,会检查编辑未上传文件,如果有则认为编辑已完成,尝试上传并自动解锁。

参考资料:

版本控制

加密散列函数