2021SC@SDUSC
Seafile体系结构总结
本篇为系统综述。详细的代码分析和注释在我的一个Git仓库中:seafile-server-learn。
子模块
组件
-
底层组件
-
RPC协议
通过libsearpc库实现的RPC协议。
-
数据库管理
对各种数据库API的封装。
-
配置管理
对配置文件的管理。
-
消息队列
借助libevent实现的消息队列。
-
定时任务
借助libevent实现的定时任务。
-
加密
借助openssl实现的加密。
-
对象键值存储
借助文件系统或NoSQL数据库实现的对象键值存储。
-
-
子系统组件
-
块子系统
利用的是操作系统下的文件系统,借助CDC分块算法,结合底层加密组件,实现了块存储、块访问、分块等基本功能。是用于管理块的子系统。
-
文件子系统
利用的是操作系统下的文件系统,通过seafile对象和键值存储定义并实现了一个用户空间的文件系统结构。是用于管理和组织Seafile文件的子系统。
-
版本子系统
包含两个部分:提交、分支。提交是文件系统的指针,分支是提交的指针。前者基于文件子系统,后者基于数据库。
除了包含各自对应的功能外,还需要描述提交与提交间的交互作用,包括差异、合并。
-
仓库子系统
负责对仓库信息的维护,包括虚拟仓库。依赖前几个子系统。
-
用户与用户组子系统
对用户信息、用户组进行维护。只涉及到RPC和数据库管理。
-
-
功能组件
-
共享管理
基于用户与用户组子系统、仓库子系统的高层服务。用于管理仓库的共享。
-
Web令牌
基于用户与用户组子系统、文件子系统。用于减少认证的开销,加速访问。
-
密码管理
重用了仓库加密部分。
-
配额管理
基于仓库子系统和文件子系统,管理仓库的配额,限制仓库的最大容量。
-
仓库大小计算
基于仓库子系统和文件子系统,计算仓库的空间占用情况。
-
复制
基于文件子系统,复制文件或目录,支持中途取消。
-
Http文件访问
Http服务下的特有功能,基于Http协议访问文件。
-
Http文件上传
Http服务下的特有功能,基于Http协议上传文件。
-
Http服务器配置管理
Http服务下的特有功能,基于Http协议读取服务器配置。
-
服务
接口
内部接口
本项目为c语言编写,内部接口均以头文件组织。一个典型的例子如下:
typedef struct _CcnetGroupManagerPriv CcnetGroupManagerPriv; // private
struct _CcnetGroupManager // context
{
SeafileSession *session;
CcnetGroupManagerPriv *priv;
};
CcnetGroupManager* ccnet_group_manager_new (SeafileSession *session); // construct
int ccnet_group_manager_create_org_group (CcnetGroupManager *mgr,
int org_id,
const char *group_name,
const char *user_name,
int parent_group_id,
GError **error); // function
基本构成为:
- 借助typedef定义私有内容的内部正式名称
- 定义Manager结构体,作为接口上下文
- 定义Manager结构体的新建函数(类似构造函数)
- 定义具体的接口方法
通讯接口
-
Http
详情请见Http服务-服务注册。
-
RPC
详情请见RPC服务-服务注册。
-
外部通讯接口
为了简化其他需要和seafile-server通讯的程序定义和RPC服务所支持的接口相符的通讯过程,seafile-server中利用python和绑定的方式定义了一个seafserv包来满足外部的通讯需求。
只需要(在python项目中)引用seafserv包,就能以绑定的方式直接访问seafile-server中对外界提供的接口。这个通讯方式正是seahub所使用的。
测试与管理程序
-
整个服务器的主程序,可以作为守护进程运行。提供的是RPC服务和Http服务。(seahub中使用的是前者,表示服务器内部通讯;其他seafile客户端主要使用的是后者)
-
服务器自我维护的GC进程。选用。
-
用户空间文件系统的管理修复进程。选用。
-
其他测试进程
有的用于CI(持续集成)、有的用于编译。略。