我们的团队有一个本地托管的 yum 存储库。在构建过程结束时,Jenkins:
- 创建新的 RPM
- 将新 RPM 移动到 yum 服务器包含 rpm 的目录
- 在我们的 yum 存储库上运行 createrepo
如果有人yum update
在执行上述任何步骤时跑步,会发生什么?进一步来说:
- 如果在 createrepo 更新存储库时运行 yum update 会发生什么?
- 如果 yum update 在旧版本的 RPM 上运行,但 createrepo 删除并添加了新的 RPM 版本,会发生什么情况?
我很感激任何帮助。谢谢!
答案1
不,不是竞争条件,而是由于数据不一致而导致的客户端错误。
存储库有一个文件,其中包含其中包含的项目/包的列表。该文件是在存储库创建/更新结束时创建/更新的。
如果客户端在写入时打开存储库并读取内容文件,他们yum
将因错误而退出。
如果未写入文件但您正在更改存储库内容,则数据可能会不一致。客户yum
端将退出,因为内容文件中的文件引用不可读。
如果您希望最大程度地减少问题,您可以处理存储库的副本(取决于其大小);
# rm -fr newrepo oldrepo
# rsync -ua repo/ newrepo/
# cd newrepo
(then update this copy or the repository)
# cd ..
# mv repo oldrepo; mv newrepo repo
# rm -fr oldrepo
这将使转换时间更短,但不能完全避免客户端错误。