写入路径与缓存
只有对象数据已存入本地缓存、元数据已提交到 PostgreSQL 后,SynapS3 才对 S3 写入返回成功。任一步失败,客户端都会收到错误。Filecoin 存储在响应之后才开始,因此写入延迟不受存储提供方影响。
写入
- 写入在读取请求体之前,先按声明的大小预留缓存容量。缓存放不下时,写入失败并返回
503 SlowDown,不会保存任何数据。 - 响应带有 S3 兼容的 ETag;分段上传返回 S3 multipart ETag。
- 写入存储桶中已有的相同字节时,会创建新版本,但不会再上传一次到 Filecoin。
- 分段上传的各个分段保存在本地缓存中,直到上传完成或中止。完成上传时,除各分段外,还需要能容纳组装后对象的空闲缓存容量。
读取
GetObject 从本地缓存读取。缓存未命中时,SynapS3 从存储提供方读取已提交的副本,在交付最后的字节前校验完整对象;完整读取后尝试把对象恢复到缓存,cache.eviction_policy 为 after_upload 时除外。缓存未命中时的 Range 请求仍会下载整个对象用于校验。客户端提前关闭的读取不会留下不完整的缓存条目。
以下读取会把缓存中的版本标记为最近使用,影响 lru 淘汰:S3 读取(包括 Range 读取);从缓存读取的 CopyObject 源对象;仪表盘下载;版本恢复。HeadObject 和后台上传不会。
缓存淘汰
只有同时满足以下条件时,SynapS3 才会从缓存中删除一个版本:
- 该版本已达到所在存储桶的最小持久副本数,这些副本已提交且可读。
- 没有进行中的上传或批次提交还需要这份缓存数据。
淘汰不会删除分段上传的分段,并会等待该版本正在进行的读取结束。符合条件的版本何时被删除,由 cache.eviction_policy 决定,见缓存。删除在后台进行。清理跟不上,或没有可删除的版本时,写入失败并返回 503 SlowDown,见缓存已满。
删除后,该版本的读取改从存储提供方获取。