lakeFS Java SDK 中的 GarbageCollectionRules:垃圾回收保留策略的数据模型与配置实战
数据工程数据湖大数据对象存储后端【免费下载链接】lakeFSlakeFS - Data version control for your data lake | Git for data项目地址https://gitcode.com/gh_mirrors/la/lakeFS点击查看免费下载本文以 GarbageCollectionRules.md 为骨架系统讲解 lakeFS 垃圾回收Garbage Collection保留策略在 Java SDK 中的数据结构、API 调用方式与服务端实现原理。读完你将掌握如何通过RepositoriesApi读取、写入、删除仓库的 GC 规则理解default_retention_days与按分支规则branches的组合语义并能基于源码定位规则的实际存储与生效逻辑为数据湖对象存储成本治理提供可落地的配置方案。一、模型概览GC 规则由「全局默认 分支覆盖」两层组成GarbageCollectionRules是 lakeFS API版本 1.0.0中用于描述仓库级垃圾回收保留策略的 OpenAPI 模型它只有两个字段结构非常精炼名称类型说明必填defaultRetentionDaysInteger仓库内所有分支的默认保留天数是branchesListGarbageCollectionRule针对特定分支单独设置的保留规则列表是两个字段在 OpenAPI 规范中均被标记为 required见 openapi.yaml也就是说一个合法的 GC 规则对象必须同时包含默认保留天数与分支规则数组数组可为空。1.1 JSON 表示与 Java 属性的映射由于 SDK 由 OpenAPI Generator 自动生成HTTP 传输的 JSON 键名使用 snake_case而 Java 属性使用 camelCase{ default_retention_days: 30, branches: [ { branch_id: main, retention_days: 90 }, { branch_id: experiment, retention_days: 7 } ] }这一点在模型源码的SERIALIZED_NAME常量中有明确体现GarbageCollectionRules.javapublic static final String SERIALIZED_NAME_DEFAULT_RETENTION_DAYS default_retention_days; SerializedName(SERIALIZED_NAME_DEFAULT_RETENTION_DAYS) private Integer defaultRetentionDays; public static final String SERIALIZED_NAME_BRANCHES branches; SerializedName(SERIALIZED_NAME_BRANCHES) private ListGarbageCollectionRule branches new ArrayList();需要特别留意default_retention_days与branches都被加入openapiRequiredFields因此 SDK 反序列化时会强制校验这两个字段是否存在否则抛出IllegalArgumentException见 GarbageCollectionRules.java 中的validateJsonElement逻辑。二、分支级规则 GarbageCollectionRulebranches数组中的每个元素都是 GarbageCollectionRule该模型只有两个字段名称类型说明必填branchIdString分支标识branch ID是retentionDaysInteger该分支的保留天数是对应到 OpenAPI 定义openapi.yamlJSON 键名为branch_id与retention_days在 Java SDK 中则通过链式方法构建GarbageCollectionRule.javanew GarbageCollectionRule() .branchId(main) .retentionDays(90);三、在 Java SDK 中读写 GC 规则RepositoriesApi 实战GC 规则的读取与写入入口集中在RepositoriesApi中RepositoriesApi.java对应三个 REST 端点定义见 openapi.yaml方法HTTP 请求说明getGCRulesGET /repositories/{repository}/settings/gc_rules获取仓库 GC 规则返回GarbageCollectionRules200setGCRulesPUT /repositories/{repository}/settings/gc_rules覆盖式写入 GC 规则204无响应体deleteGCRulesDELETE /repositories/{repository}/settings/gc_rules删除 GC 规则204无响应体3.1 读取仓库 GC 规则完整可运行的示例来源RepositoriesApi.mdimport io.lakefs.clients.sdk.ApiClient; import io.lakefs.clients.sdk.ApiException; import io.lakefs.clients.sdk.Configuration; import io.lakefs.clients.sdk.auth.*; import io.lakefs.clients.sdk.RepositoriesApi; import io.lakefs.clients.sdk.model.GarbageCollectionRules; public class GetGCRulesExample { public static void main(String[] args) { ApiClient defaultClient Configuration.getDefaultApiClient(); defaultClient.setBasePath(https://lakefs.example.com/api/v1); // 配置 HTTP 基础认证用户名/密码或访问密钥对 HttpBasicAuth basic_auth (HttpBasicAuth) defaultClient.getAuthentication(basic_auth); basic_auth.setUsername(YOUR ACCESS KEY ID); basic_auth.setPassword(YOUR SECRET ACCESS KEY); // 也可以使用 cookie_authAPI Key或 jwt_tokenBearer Token认证 // ApiKeyAuth cookie_auth (ApiKeyAuth) defaultClient.getAuthentication(cookie_auth); // HttpBearerAuth jwt_token (HttpBearerAuth) defaultClient.getAuthentication(jwt_token); RepositoriesApi apiInstance new RepositoriesApi(defaultClient); String repository my-repo; // 仓库名称 try { GarbageCollectionRules result apiInstance.getGCRules(repository).execute(); System.out.println(默认保留天数: result.getDefaultRetentionDays()); result.getBranches().forEach(rule - System.out.println(分支 rule.getBranchId() 保留 rule.getRetentionDays() 天)); } catch (ApiException e) { System.err.println(Status code: e.getCode()); System.err.println(Reason: e.getResponseBody()); } } }3.2 写入覆盖GC 规则setGCRules的请求体即GarbageCollectionRules对象属于覆盖式语义——整份规则会被整体替换而不是增量合并示例来源RepositoriesApi.mdimport io.lakefs.clients.sdk.RepositoriesApi; import io.lakefs.clients.sdk.model.GarbageCollectionRule; import io.lakefs.clients.sdk.model.GarbageCollectionRules; // 构建规则默认保留 30 天main 分支保留 90 天feature-* 类临时分支保留 7 天 GarbageCollectionRules rules new GarbageCollectionRules() .defaultRetentionDays(30) .addBranchesItem(new GarbageCollectionRule().branchId(main).retentionDays(90)) .addBranchesItem(new GarbageCollectionRule().branchId(feature-data).retentionDays(7)); RepositoriesApi apiInstance new RepositoriesApi(defaultClient); String repository my-repo; try { apiInstance.setGCRules(repository, rules).execute(); System.out.println(GC 规则已更新); } catch (ApiException e) { System.err.println(Status code: e.getCode()); System.err.println(Reason: e.getResponseBody()); }值得注意的响应语义写入成功返回204 No Content400表示请求体校验失败、401未认证、403无权限、404仓库不存在、429请求过于频繁、0default表示服务端内部错误。3.3 删除 GC 规则apiInstance.deleteGCRules(repository).execute();删除同样返回 204。删除后仓库将回到未配置规则状态GC 运行前需要重新准备规则数据。3.4 旧版内部端点已废弃在 API 演进过程中/repositories/{repository}/gc/rules下的internalGetGarbageCollectionRules、internalSetGarbageCollectionRules、internalDeleteGarbageCollectionRules已被标记为Deprecated见 InternalApi.md官方建议改用前文的getGCRules/setGCRules/deleteGCRules。此外还提供了setGarbageCollectionRulesPreflightGET /repositories/{repository}/gc/rules/set_allowed用于预检当前用户是否有权限设置 GC 规则openapi.yaml。四、服务端实现规则如何存储与生效4.1 规则以 protobuf 形式存储在对象存储中GC 规则最终由服务端的GarbageCollectionManager持久化到与仓库同命名空间的对象存储上而不是 KV 数据库。从 garbage_collection_manager.go 可以看到其存储路径模板configFileSuffixTemplate %s/retention/gc/rules/config.json即规则文件位于对象存储的{committed_block_storage_prefix}/retention/gc/rules/config.json。SaveRules使用proto.Marshal序列化后调用blockAdapter.Put写入GetRules则读取该对象并proto.Unmarshal解析garbage_collection_manager.go。若文件不存在或为空返回graveler.ErrNotFound——这正是getGCRules接口返回 404 的底层原因。protobuf 消息定义位于 graveler.proto与 API 模型一一对应message GarbageCollectionRules { int32 default_retention_days 1; mapstring, int32 branch_retention_days 2; }注意服务端内部的branch_retention_days是map分支 ID → 保留天数而 API 层把它展开为branches数组——这个转换发生在 API 控制器中见下文。4.2 API 控制器与权限控制HTTP 端点对应的服务端实现位于 pkg/api/controller.goGetGCRules先通过authorize校验retention:GetGarbageCollectionRules权限再从c.Catalog.GetGarbageCollectionRules取出规则将内部 map 转换成apigen.GarbageCollectionRule{BranchId, RetentionDays}数组返回SetGCRules校验retention:SetGarbageCollectionRules权限后将请求体中的branches数组重新折叠回BranchRetentionDaysmap调用c.Catalog.SetGarbageCollectionRules持久化成功返回 204。对应的权限动作常量定义在 pkg/permissions/actions.goGetGarbageCollectionRulesAction retention:GetGarbageCollectionRules SetGarbageCollectionRulesAction retention:SetGarbageCollectionRules4.3 调用链全貌从 Java SDK 到规则落盘完整调用链为RepositoriesApi.getGCRules/setGCRules (Java SDK) → REST: /repositories/{repository}/settings/gc_rules → pkg/api/controller.go 中 Controller.GetGCRules / SetGCRules含权限校验 → pkg/catalog/catalog.go 的 Catalog.GetGarbageCollectionRules / SetGarbageCollectionRules → pkg/graveler/graveler.go 的 Graveler.GetGarbageCollectionRules / SetGarbageCollectionRules → retention.GarbageCollectionManager.GetRules / SaveRules → 对象存储 {prefix}/retention/gc/rules/config.jsonprotobuf 序列化其中Graveler层的实现非常薄graveler.go只是对GarbageCollectionManager的转发。五、保留天数如何决定对象生死active commits 算法GC 规则的价值最终体现在哪些 commit及其引用的对象是活跃的、可以被回收的计算上核心逻辑在 active_commits.go对每个起点 commit分支 HEAD 或游离 commit取保留天数优先查rules.BranchRetentionDays[branchID]查不到才回退到rules.DefaultRetentionDays见 L200-L218。这正是GarbageCollectionRules两段式设计的运行语义branches中命中的分支用分支自己的天数未命中的分支统一使用全局默认值。计算该分支的过期阈值now.AddDate(0, 0, -retentionDays)即当前时刻往前推 N 天L222。沿 commit 祖先链回溯凡是创建时间晚于阈值的 commit其父提交都会被标记为活跃跨越多条路径时取最长的过期阈值L234-L259。这样保证只要某 commit 仍在任一分支的保留期内它引用的对象就不会被回收。由此可以推断retentionDays 0的含义阈值等于当前时刻分支 HEAD 之后几乎不再有 commit 被标记为活跃等价于该分支历史对象尽快进入可回收状态——与 openapi.yaml 示例中default_retention_days: 0的取值语义一致。六、配套模型与进一步阅读GC 规则模型不是孤立存在的它与下列模型/API 共同构成 lakeFS GC 体系GarbageCollectionConfiggracePeriod宽限期单位为秒用于保护近期创建的对象不被收集属于 GC 的全局配置GarbageCollectionPrepareResponseprepare_commits接口的响应包含 GC run 的元数据RepositoriesApi.mdgetGCRules/setGCRules/deleteGCRules的完整文档与示例InternalApi.mdprepareGarbageCollectionCommits同步/异步、prepareGarbageCollectionUncommitted、internalGetGarbageCollectionRules等内部端点openapi.yamlGarbageCollectionRules与GarbageCollectionRule的 OpenAPI Schema 权威定义含 example服务端源码pkg/api/controller.go、pkg/graveler/graveler.go、pkg/graveler/retention/garbage_collection_manager.go、pkg/graveler/retention/active_commits.go、pkg/graveler/graveler.proto。七、实践建议与注意事项先读取再覆盖setGCRules是整体覆盖语义建议先getGCRules拉取现有规则在原有branches基础上追加或修改后再提交避免误删已有分支规则。明确默认值兜底为仓库设置合理的defaultRetentionDays使新分支自动纳入 GC 保护临时分支通过branches设置更短的保留天数可显著降低存储成本。注意 required 校验default_retention_days与branches均为必填构建请求体时二者缺一不可否则服务端会返回 400。权限最小化设置 GC 规则需要retention:SetGarbageCollectionRules权限读取需要retention:GetGarbageCollectionRules权限可通过setGarbageCollectionRulesPreflight预检后再发起写操作。配合宽限期若担心对象被过早回收可结合gracePeriod秒级为最近创建的对象设置保护窗口。通过本文你已经掌握了GarbageCollectionRules从 Java 对象构造、HTTP 调用到服务端 protobuf 落盘、再到 active commits 计算的全链路可以据此在业务代码中安全地自动化管理 lakeFS 仓库的 GC 保留策略。赞分享数据工程数据湖大数据对象存储后端【免费下载链接】lakeFSlakeFS - Data version control for your data lake | Git for data项目地址https://gitcode.com/gh_mirrors/la/lakeFS点击查看免费下载相关推荐lakeFS Java SDK 中的 GarbageCollectionRule数据湖 GC 保留策略的数据模型与实战lakeFS Java SDK 中的 GarbageCollectionRule数据湖 GC 保留策略的数据模型与实战 本指南以 lakeFS 官方 Java数据工程数据湖大数据对象存储后端Relay 数据驻留与垃圾回收指南理解 presence-of-data、Query Retention 与 GC 策略Relay 数据驻留与垃圾回收指南理解 presence of data、Query Retention 与 GC 策略 Relay 在客户端内存 Store前端开发工具Relay 缓存数据的存续性理解 Relay 垃圾回收、Query Retention 与 GC 策略配置Relay 缓存数据的存续性理解 Relay 垃圾回收、Query Retention 与 GC 策略配置 Relay 的核心设计之一是内置的规范化缓存no前端开发工具上一篇3个场景教你轻松玩转B站视频批量下载BilibiliDown完整指南下一篇Minecraft RCON网页控制台5分钟搭建远程服务器管理平台创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

PS5游戏信息聚合工具实战:Python爬虫、数据清洗与全文搜索构建记录

PS5游戏信息聚合工具实战:Python爬虫、数据清洗与全文搜索构建记录

先交代一下背景。我是个游戏库存控,平时最大的爱好就是逛各个商店页面和评分站,看看最近有什么值得入手的PS5游戏。可时间一长,我发现自己每天至少要在五六个不同站点之间来回切换——想确认口碑得去媒体评分站,想比价格得看商店页…

2026/10/12 4:22:36 阅读更多 →
DMA读旧数据真相:Cache一致性与内存屏障实战指南

DMA读旧数据真相:Cache一致性与内存屏障实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 4:22:36 阅读更多 →
ESP32S3开发板深度解析:双核+USB OTG+PSRAM+AI加速实战指南

ESP32S3开发板深度解析:双核+USB OTG+PSRAM+AI加速实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 4:22:36 阅读更多 →

最新新闻

mediamtx v1.21.2发布:UDP、JWT、RTSP、RTMP、HLS、WebRTC全面修复,稳定性与安全性再提升

mediamtx v1.21.2发布:UDP、JWT、RTSP、RTMP、HLS、WebRTC全面修复,稳定性与安全性再提升

2026年10月10日,mediamtx 发布 v1.21.2 最新版本。本次更新以“修复与改进”为主,覆盖通用逻辑、API、Media-Over-QUIC、RTSP、RTMP、HLS、WebRTC 以及依赖库升级等多个方向。 v1.21.2 没有引入新的功能模块,而是集中处理实际运行中可能出现的…

2026/10/12 5:43:21 阅读更多 →
哪个品牌密码锁最安全 高端市场占比领先全维安防更靠谱安心

哪个品牌密码锁最安全 高端市场占比领先全维安防更靠谱安心

在智能家居全面普及的今天,智能密码锁已经成为了家庭安全防护的核心入口。哪个品牌密码锁最安全,不仅关乎家庭财产安全,更影响着日常进出的便捷体验与全场景安防体验。2026年以来,国内智能门锁行业技术迭代加速,市场格…

2026/10/12 5:43:21 阅读更多 →
2026家用智能锁品牌推荐:德施曼热门产品深度解析

2026家用智能锁品牌推荐:德施曼热门产品深度解析

随着智能家居行业的快速发展,智能门锁已经成为了千家万户的入户安防首选。相较于传统机械锁,智能门锁不仅提供了更加便捷的多种解锁方式,还集成了猫眼可视、AI安防、远程对讲等功能,全方位提升家庭入户安全与使用体验。在2026年上…

2026/10/12 5:43:21 阅读更多 →
本地化企业知识库方案拆解:8 步把文档变成知识库

本地化企业知识库方案拆解:8 步把文档变成知识库

## 背景在项目复盘场景里,企业文档散落各处、找人问半天是效率的主要损耗点。## 核心能力- 全程本地运行,原始文档与知识数据不出电脑- 8 步流水线自动化:解析→结构化→质检→复核→分片→向量库→验收- 内置本地大模型,离线推理…

2026/10/12 5:43:21 阅读更多 →
81 极物科技 | KNX调试 - 个体地址过滤与报文隔离

81 极物科技 | KNX调试 - 个体地址过滤与报文隔离

极物科技 | KNX调试 - 个体地址过滤与报文隔离 前言 工程品质是 KNX 国际标准三十年立足全球的根基,而可观测性是品质的前提。 报文追踪把“看不见的总线”变成“看得见的证据”:每一次收发都有记录、每一次异常都有据可查。本文围绕报文追踪的接收链路、…

2026/10/12 5:43:21 阅读更多 →
百万级缺陷样本开源:工业视觉的「地基」被补上了

百万级缺陷样本开源:工业视觉的「地基」被补上了

1.工业质检的两道坎 ▍坎一:数据各管各的现成的工业缺陷数据集,几乎都窝在单一行当里。VisA、3CAD 盯着 3C 电子,PKU-GoodsAD 盯着包装,Real-IAD、MulSen-AD 盯着材料。覆盖面稍宽些的 VISION、MVTec AD、MMAD,又卡在…

2026/10/12 5:42:21 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →