← ALL ARTICLES

文件版本代理与回收

全库目录221
本文目录9

场景7的加载器通过文件服务读取不可变版本A,发布者随后把清单从g7/A切到g8/B。本文追踪服务令牌、逻辑读取与持久版本保护,直到A可以删除。文件准备、发布回执及正式版本根由不可变文件发布定义;系统请求和解码缓冲的寿命见文件IO。

跨进程代理与回收

令牌和在途读取

跨进程消费者通过版本服务取得令牌,令牌包含服务纪元、租约ID、版本ID和期限。服务在同一事务或锁内选定版本并登记租约,然后才返回令牌;每次打开和读取由服务代理,在控制数据库事务中检查版本仍可读和令牌有效,并在执行设备请求前持久登记(服务实例纪元,版本ID)保护关系;同实例的重复读取可共享这条保守保护记录,内存在途计数只用于正常退出。发布CAS、租约接纳和Deleting判断都争用同一版本状态记录,多进程不能用各自的本地锁代替这份共同仲裁。服务保留文件句柄和应用缓冲到系统终态及发送消费者退出,随后减少在途计数。租约到期只禁止新的操作,已接纳读取继续结清。

消费者拿到完整响应后在自己的缓冲解码,这份字节不再依赖服务端文件;若返回映射句柄或共享缓冲,则另建立共享存储寿命协议,不能套用“响应已发送即可回收”。本页代理返回复制字节,并校验响应请求ID、版本及长度。分块读取一直使用同一令牌,块序号和内容哈希使重试可核对。旧令牌失效时丢弃未组成完整文件的片段,再取得有效版本重新读取,避免把两版本拼接。

服务重启与旧操作

服务启动先通过持久条件更新取得新的服务纪元。旧纪元令牌全部失效,客户端不能把上次租约拿到新进程继续使用。租约期限以服务端时钟判断,重启不从旧进程的单调时间戳继续计时;新纪元使旧租约统一关闭,新租约重新建立期限。

纪元只能拦住新请求,不能让旧进程已经发出的设备读取消失。单机重启在进程监管器确认旧进程及其IO代理工作进程退出、句柄和系统请求已被平台结清后,才把其内存在途计数视为结束。若旧进程只是失联,先关闭路由和其访问入口,保持旧纪元相关版本隔离,取得执行者退出的确认后才清理。多机代理由每个执行主机确认旧实例退出;无法确认的主机所持版本继续受保护,不能仅靠租约超时删除文件。

新服务从持久清单、发布回执和删除登记恢复当前版本,并扫描实例到版本的持久保护表。旧实例保护集合整体进入隔离,不能因重启后的内存在途计数为零就清除。监管器确认该实例及全部IO执行者退出后,服务才在控制事务内解除对应保护关系;正常关闭也先关闭该实例的新请求入口、等待所有请求和发送消费者结束,再清保护表。实例暂时没有在途请求时仍保留保护关系;零计数只描述此刻,关闭读取入口才能阻止下一次接纳。旧纪元响应晚到时,客户端按令牌纪元和请求ID丢弃;不能把它装进新请求缓冲。重启前已经完整交付并校验的不可变字节,可在原任务未失效且身份匹配时由消费者继续使用,但不会重新激活旧服务租约。请求取消、代理重启和业务资源代次因此分别控制系统访问、协议身份和最终采用。

运行中的版本排空

长驻服务持续保留所有读过的版本会使磁盘占用增长。服务为每个(实例纪元,版本ID)保护关系增加Open、Draining和Closed状态。退役版本开始排空时,在接纳请求所用的同一控制事务中把该关系改成Draining;该实例从此拒绝此版本的新读取,包括旧租约发来的下一块请求。已接纳操作继续完成,客户端遇到拒绝则按令牌规则重新取得完整版本。

服务在本地请求锁下确认全部系统子请求、等待续读的逻辑请求和发送消费者都已结束,再在控制事务中把Draining改为Closed并移除保护关系。等待续读的逻辑请求也算在途,因此一次短读后的间隙不会被误认为已经排空。读取接纳先登记逻辑请求和持久保护、再交设备执行;排空关闭与接纳通过同一入口排序,不能出现关闭后才补登记的请求。

回到场景7的加载:清单从g7/A发布到g8/B后,A的旧租约仍可按保留策略读完。到排空时点,实例关闭A的新读取入口,等A最后一个发送消费者退出,再解除自己的保护;B的服务继续运行。其他实例分别完成同样步骤,版本删除器才可能看到所有保护清零。实例在Draining期间崩溃时保留持久保护,由监管器确认其执行者退出后解除;恢复进程不能凭本地空队列直接宣布排空。关闭关系保持墓碑直到版本删除,防止旧租约重新打开同一实例的读取入口。

垃圾回收的状态转换

删除器只处理不再被正式入口、回滚版本、检查点或撤销记录保护的版本。它在控制事务内比较保护根、有效租约、在途读取、所有实例到该版本的持久保护关系以及旧实例隔离均已清除;仍运行但暂时无在途读取的实例保护关系也必须先按版本排空或实例关闭协议解除,再将版本从Retired改为Deleting;读者接纳也经过这份状态记录,Deleting禁止新引用和租约。先查零计数再无锁删除,会给新读者留下空隙。

实际删除在事务外执行,以版本ID和目录身份核对目标。中途失败保留Deleting记录,下次继续删除剩余文件;全部文件和平台要求的目录元数据操作完成后记Deleted。删除登记不能先于实际文件结束而清除,否则服务重启无法区分正在删除与可以重新发布的版本。相同版本目录不可复用于其他内容。

暂存目录也进入登记,携带工作项ID和所有者纪元。只回收没有提交引用、工作项已终止且执行者已退出的暂存内容;“目录很旧”不能证明后台构建已停。孤立文件扫描先与发布日志和暂存登记对账,登记不明时隔离等待核查,避免把刚写完、尚未提交引用的合法产物删除。当前引用、读取寿命和未完成发布因此共用一套回收规则。

验证方法

在短读续读间隙触发Draining,核对原逻辑请求仍计为在途,新块请求被拒绝;在旧代理失联和真正退出两种条件下重启服务,分别检查隔离保留与保护解除。删除中途失败应保留Deleting并继续收尾。

实现与证据

本页给出服务协议与状态推演。仓库文件替换样例覆盖单进程临时文件,未实现本页跨进程服务、监管器、租约与删除仲裁;真实平台IO结清和目录持久性需要集成验证。

相关主题

参考资料