Home

GameXG edited this page Nov 21, 2010 · 2 revisions
Clone this wiki locally

AllFileSync

文件同步系统

将仿照 git 来版本控制系统来将文件存放到 Google Storage 。不过为了方便用户在紧急的情况下通过标准的 Google Storage web界面读取文件(注1),修改 git blob 对象的存放方式,将主版本的每个文件压缩后直接按照普通的路径来存放文件,方便用户寻找需要的文件。

注1:为了能做到回退修改,要么只允许通过标准 Google Storage web 界面只读访问文件,要么每个文件存放两份,来防止用户通过标准 Google Storage web 界面修改文件时无法备份旧的版本。但是存放两份太占用空间,同时计划在向 Google Storage 存放文件时使用压缩程序压缩文件,所以决定不将文件存放两次,而是通过禁止用户通过标准 Google Storage web 界面修改文件来做到完全回滚支持。后期可以尝试使用约定的特定文件名来做到支持通过标准 Google Storage web 界面修改文件,或者增加专门的网站来做到全回退支持的文件在线修改。

流程

下面的都未考虑多机同时更新时冲突和更新中途中断,这部分需要以后补充。

新建文件流程

  1. 建立新的事务文件夹(名字为:建立时间+唯一客户端编号+本地唯一事务编号)
  2. 将新增的文件上传到事务目录下的对象文件夹,文件名是文件内容的希哈值。
  3. 下载需要更新的 tree 。
  4. 锁定整个库
  5. 检查是否在锁定前下载的 tree 是否有新版本,有则从新下载。
  6. 将新增文件存入主对象库,并拷贝一份到 root 目录。
  7. 存入新的目录节点文件,并建立新的 commit 。
  8. 将主版本指向本次提交。
  9. 释放锁,完成整个过程。

更新流程

1.将文件新版本上传到

删除流程

删除文件的流程。

压缩流程

压缩空间的流程,即将相近的内容以保存差异补丁的形式存放起来,以节省空间。

清理流程

删除比较旧的历史版本。

有些操作(更新文件、更新目录)希望获得锁来保证不会出现一个操作将另一个操作无提示覆盖的情况。

目前锁的获得方式为在锁目录建立一个文件的方式来获得(文件名为客户端编号+本地序列号+时间,内容为json格式的锁列表),所有的客户端在试图获得锁时都需要先获得锁文件夹得全部文件,并解析所有的文件确保希望获得的锁不会已被申请,然后客户端将建立锁预持有文件来表示自己将持有某些锁,等待一定时间后再次读取说文件夹来确保没有和其他同时获得锁的客户端冲突后可以确定客户端已经获得了锁。

无锁工作的后果

  • 在直接对 root 目录增加/修改/删除文件时可能会将同时建立的另一个版本覆盖掉。
  • 建立 commit 提交信息时可能会出现未发现同时提交的另一个版本,上一个版本指向上上个版本,而不是同时提交的上一个版本。

程序结构

主模块

主模块,负责初始化各个模块,并接受处理用户的命令。

同步控制中心

负责控制接受文件变更的通知,并通过调用其他的模块来实现文件的同步。

版本控制中心

负责版本的建立和维护。

文件变更监听控制中心

维护“文件变更监听”进程组,其中分为本地和远程类别。

本地监听器

独立的监听本地特定的文件夹。

主干监听器

监听中心主干的修改。

传输调度中心

上传或下载的的进程组的控制中心。

传输器

实际执行上传下载传输的进程。

锁控制中心

负责多个客户端的锁同步机制,目前打算使用 GAE 建立一个通用的锁来调用。

仓库文件结构

object(对象) 目录

存放大部分对象的目录,文件名是内容的希哈值(sha1+md5+size.object),内容是文件的内容。 注意:需要考虑基本不可能出现的希哈值相同,内容不同的情况。

tree (树) 目录

commit (提交) 目录

main 文件

指向最新的提交文件。

旧资料

多空间的组合方式:

软件维护一个像unix文件系统一样的根,各个网络空间都是挂载到这个根目录上的。 而用户可以将本地目录和根内的目录建立映射关系。

阵列的方式

为了防止单个网络空间损坏而造成文件丢失,本软件计划将文件存放在多个网络空间来防止故障。

文件的存放方式

直接使用方式

直接把完整的文件上传到空间。好处是即使不通过本软件也可以上传下载文件。坏处是大部分空间都不支持单独修改文件的一部分,只能重新上传完整的文件;如果文件超出空间允许的最大大小就没有办法存放了。

文件块存放方式

把文件按一定大小来拆分后上传,坏处是不能方便的不使用本软件来获得存放在网络上的文件。好处是可以如果只是修改文件的一部分只要重传相关的块就可以了;上传大文件时即使中途中断了也可以继续从上次中断的块重新上传;即使文件大小超过了空间允许的最大大小也可以分块存放。

同步的方式

?保留一些

参考资料: http://www.appinn.com/dropbox-lan-sync-mklink/ 1、针对 Windows XP 用户,请使用 junction.exe 工具

首先下载 junction.exe,如果你想让 D 盘下的 Data 文件夹与 Dropbox 连接使用,开始 > 运行 > cmd,输入如下命令

C:\>junction d:\data "d:\My Dropbox"

此时你会发现 Data 文件夹和 My Dropbox 文件夹内容相同,在 Data 的任意操作都会继承到 My Dropbox 里,反之相同。

2、针对 Vista、Win7 用户,请使用系统自带的 mklink 命令

例子相同,首先在开始菜单中右键 “命令提示符”,选中 “以管理员身份运行”,之后输入

C:\>mklink /d d:\data "E:\My Dropbox"

NTFS 新特性:Junction 应用详解 http://softbbs.pconline.com.cn/6346682.html