Lance 表维护 API 提供数据文件合并、标量/向量索引创建、索引优化、历史版本清理等异步任务的提交、查询、列举与删除接口。
API 总览
Lance 表维护(Lance table maintenance)共提供 8 个对外 HTTP API:5 个异步任务提交接口,3 个任务查询、列举和删除接口。
Lance Operation | HTTP Method | Endpoint Pattern |
POST | /lance/oss/v1/table/{id}/compact | |
POST | /lance/oss/v1/table/{id}/create_scalar_index | |
POST | /lance/oss/v1/table/{id}/create_vector_index | |
POST | /lance/oss/v1/table/{id}/optimize_indices | |
POST | /lance/oss/v1/table/{id}/cleanup | |
GET | /lance/oss/v1/table/{id}/tasks/{task_id} | |
GET | /lance/oss/v1/table/{id}/tasks | |
DELETE | /lance/oss/v1/table/{id}/tasks/{task_id} |
访问地址与表标识
全部接口必须通过 Table Bucket 三级域名访问;请求中的 {tableBucketHost} 使用目标 Table Bucket 对应的域名。服务端从 Host 获取 Table Bucket 身份,URI 不携带 Table Bucket ARN。
接口前缀是 /lance/oss/v1,与普通 Lance 表管理接口的 /lance/v1 前缀不同。
参数 | 位置 | 是否必须 | 描述 |
id | path | 是 | 表标识,格式为"命名空间$表名",例如 prod$documents 表示命名空间 prod 下的 documents 表。此处不是表 UUID。 |
delimiter | query | 否 | 用于拆分 id 中命名空间与表名的分隔符,8 个接口均支持。默认为 $,不传或传空字符串时均按 $ 拆分。 |
task_id | path | Get/Delete 必填 | 提交任务时返回的任务 ID。服务端仅校验该字段非空,不校验 UUID 格式。 |
服务端处理 id 时,先做 URL Decode,再按 delimiter 拆分,必须恰好得到非空的命名空间和表名两段。仅支持一级命名空间(如 prod),不支持多级(如 a.b)。表名沿用 Lance 表管理接口的校验规则;命名空间允许的字符集取决于 Table Bucket 类型。
自定义 delimiter 不能包含 /、:、-,支持多个字符。示例:
POST /lance/oss/v1/table/prod__documents/compact?delimiter=__ HTTP/1.1
Host: {tableBucketHost}
Date: GMT Date
Authorization: SignatureValue
Content-Type: application/json所有操作都会校验表存在、调用权限以及表格式为 LANCE。任务以真实 Table ARN 隔离;删除后重建的同名表不能通过名称读取旧表任务。
请求与响应头
SignatureValue 是签名占位符,实际请求应由客户端按已配置的 OSS/Table 签名方式生成。
Host: {tableBucketHost}
Date: GMT Date
Authorization: SignatureValue
Content-Type: application/jsonBody 使用 JSON。非空 Body 的请求建议提供 Content-MD5;提供时服务端会校验与 Body 的一致性。
8 个接口的成功响应均设置:
x-oss-table-id: {table_id}此处的 table_id 是服务端表元数据中的真实 ID,与 URI 中的 namespace$table_name 不同。JSON 成功响应的 Content-Type 为 application/json;Delete 成功响应没有 Body。
权限
API | RAM Action | 授权范围 |
5 个 Submit API | oss:PutTableMaintenanceConfiguration | 当前表 |
GetLanceTaskStatus、ListLanceTasks | oss:GetTableMaintenanceJobStatus | 当前表 |
DeleteLanceTask | oss:PutTableMaintenanceConfiguration | 当前表 |
服务端使用查表得到的真实 Table ARN,结合 RAM、Table Bucket Policy 和 Table Policy 完成鉴权。本组接口复用已有维护类 Action。
异步提交、参数保存与任务额度
Submit 成功返回 HTTP 200,表示任务已经持久化,初始 status 为 submitted;不表示维护操作执行完成。
每次 POST 都创建新的任务 ID。当前没有客户端请求去重或 Idempotency-Key 语义;重复提交可能创建多个任务。
服务端将已识别参数补齐默认值后写入任务 params。未知 JSON 字段通常被忽略,不会自动成为任务参数;例如已移除的 Compact batch_size。
提交时仅校验请求格式和基础参数;列或索引是否存在、参数组合能否实际执行等,在任务执行时才检查。因此提交成功的任务仍可能进入 failed 状态。
当前默认每个 Table ARN + task_type 最多保留 1000 条任务(包含 submitted、running、completed、failed)。终态(任务状态为
completed、failed)不会自动释放额度,需要通过DeleteLanceTask删除记录后释放。达到额度返回 429 / TaskQuotaExceeded / 10002,客户端应捕获并重试。额度限制为尽力保证,高并发下可能短暂超出上限,不应在客户端依赖此上限做断言。
任务状态
status | 含义 | 能否 Delete | 是否占用额度 |
submitted | 已提交,等待执行 | 否 | 是 |
running | 执行中 | 否 | 是 |
completed | 执行成功,终态 | 是 | 是,直到删除 |
failed | 执行失败,终态 | 是 | 是,直到删除 |
状态流转:submitted → running → completed;submitted 与 running 可直接转为 failed。终态(completed、failed)不可回退。Get/List会原样透传存储中出现的未知状态,以兼容后续扩展,未知状态仍计入额度;当前仅支持删除 completed 和 failed 两个终态。
任务执行失败和查询失败是两种情况:如果 GetLanceTaskStatus 成功读到一条失败任务,HTTP 仍返回 200,任务对象中status="failed"且error非空;只有查询请求本身失败(如任务不存在、参数非法)才使用下述顶层错误结构。
错误响应格式
本组接口使用 Lance 的统一 JSON 错误格式:
{
"error": "TaskNotFound",
"code": 10000,
"detail": "The specified Lance maintenance task does not exist.",
"instance": "{request_id}"
}detail 为示例文本,以实际服务端返回为准。
HTTP 状态码 | error | Lance code | 触发场景 |
400 | InvalidInput | 13 | 必填参数缺失、非法枚举或范围、表标识结构错误、非 Lance 表、List 使用 mode/status 等。 |
400 | MalformedJson | 13 | JSON 解析失败或已识别字段类型错误。 |
400 | InvalidContinuationToken | 13 | marker 为空、非法或超出当前表/任务类型作用域。 |
403 | LanceThirdLevelDomainRequired | 0 | 未通过 Table Bucket 三级域名访问。该错误按具体 error 映射为 UNSUPPORTED。 |
403 | AccessDenied | 15 | 缺少所需访问权限。 |
403 | SignatureDoesNotMatch / InvalidAccessKeyId | 16 | 签名或访问身份无效,按具体 error 映射为 UNAUTHENTICATED。 |
404 | NamespaceNotExists | 1 | namespace 不存在;部分名称校验失败也映射为此错误。 |
404 | TableNotExists | 4 | 表不存在;部分表名校验失败也映射为此错误。 |
404 | TaskNotFound | 10000 | Get/Delete 的任务不存在、已删除或不属于当前表。 |
409 | TaskStateConflict | 10001 | 删除非终态或当前实现不识别为终态的任务。 |
409 | TableOperationConflict | 14 | 鉴权查表后,实际处理时检测到表身份变化。 |
429 | TaskQuotaExceeded | 10002 | 当前表和任务类型下的保留任务数达到配置额度。 |
500 | InternalError | 18 | 任务存储未配置、存储错误被转换、记录损坏、服务端 Compact 默认值非法等。 |
还可能返回通用 OSS 请求校验错误。错误数字优先根据 error 精确映射,不应仅根据 HTTP 状态码推算。
接入顺序示例
对
prod$documents调用一个Submit API,记录响应task_id。使用同一
Table Bucket、同一表调用 GetLanceTaskStatus,读取task_info.status。需要查看历史任务时,按完整
task_type调用ListLanceTasks,并将响应返回的next_marker作为下次请求的marker循环翻页,直至next_marker为空。对
completed / failed任务读取并保存需要的结果后调用 DeleteLanceTask API,释放任务记录额度。