S3 UFS 中的静默间歇性缓存块损坏 (长度正确,头/尾相同,中间区域不同)
**Alluxio 版本:** 2.9.5 (OSS) **UFS:** 通过 `s3a` 文件系统下的 S3 兼容云对象存储。访问模式:将一个块暂时存储到工作缓存中一次(同步 `CacheRequest`),然后通过短路本地读取提供后续读取。 **描述错误** 有时,在块被缓存后,工作节点上的缓存块文件与 UFS 对象不匹配,尽管: - 缓存文件大小等于 UFS 对象大小; - 开始和结束部分与 UFS 对象完全相同; - 中间的有限区域不同 - 无移位的原位替换(所有后面的区域都与 UFS 对象完全相同且在相同偏移处)。它并不总是可重现的。在填充期间,工作日志中没有错误或警告 - 只有 `Received sync cache request: ...`(`CacheRequestManager`)。填充返回成功,但写入了错误的字节。一旦块以这种方式被缓存,所有后续短路读取都返回受损的字节(下游解压失败)。缓存块的 md5 不等于直接从存储下载的对象的 md5(长度相同)。 **影响:** 从缓存中提供的静默数据损坏。 **可疑的原始代码路径** 1. `UfsInputStreamCache` 根据文件 ID 重复使用可寻址的 UFS 输入流,在重用时调用 `seek(offset)`(对于对象存储:中止 + 以新范围重新打开 HTTP 流)。重用一个已到达的位置的流可能会静默地返回来自错误偏移的字节。(`UfsInputStreamCache.acquire`,由 `alluxio.worker.ufs.instream.cache.enabled` 进行锁定。) 2. `CacheRequestManager` 对相同块 ID 的并发缓存请求进行去重(`mActiveCacheRequests.putIfAbsent`),但这与数据服务器上的被动缓存读取填充路径(`UnderFileSystemBlockReader`)没有协调。同一个块的同步 `CacheRequest` 填充和并发被动缓存填充似乎没有互斥,因此对同一个(临时)块的写入可能会交织并产生原位中块覆盖 - 与间歇性和有限中间签名一致。 **问题** - 这是一个已知问题吗? - 对于同一个块,是否期望同步 `CacheRequest` 驱动的填充和被动缓存读取填充之间存在互斥? - 2.10.x / master 中是否有相关修复(`UfsInputStreamCache` 重复使用流或块填充并发性)?
内容来源: Alluxio/alluxio