幂等复制
- Tracking Issue: https://github.com/databendlabs/databend/issues/6338
概要
当将 stage 文件流式复制到表中时,某些文件可能已经被复制,因此需要一些方法来避免重复复制文件,使其成为一个 idempotent
操作。
将复制到表中的 stage 文件元信息保存在元数据服务中
每当将 stage 文件复制到表中时,将 stage 文件元信息保存到元数据服务中:
- 键:与
(tenant, database, table, file name)
组合。 - 值:值必须包含 stage 文件的所有元数据,例如
content-length
、etag
、last modified
。
stage 文件元信息的过期时间默认为 64 天。
避免将 stage 文件复制到表时出现重复
使用 stage 文件元信息,每当将 stage 文件复制到表中时,请按照以下步骤操作:
- 首先,获取要复制到表中的复制 stage 文件的所有表文件元信息(如果有)。
- 其次,获取所有 stage 文件元信息。
- 第三,比较表文件元信息与 stage 文件元信息:
- 如果它们匹配,则忽略此文件而不进行复制。
- 否则,复制 stage 文件并向上插入到表 stage 文件元数据中。
以上图为例:
-
客户端发出将三个文件(file1、file2、file3)复制到表中的请求。
-
获取(file1、file2、file3)的表 stage 文件元数据。
-
在元数据服务中,仅找到(file1、file3)stage 文件信息。
-
将表 stage 文件信息与 stage 文件信息进行比较,发现 file1 没有更改,因此在此复制操作中将忽略 file1,并且将复制(file2、file3)。
-
复制新文件后,(file2、file3)stage 文件信息将保存到表文件信息中。