virsh detach 后 domblklist 有短暂延时,detach 成功后立即 detach 相同卷也能成功,两次重复 detach 后再 attach 会失败。根因是 libvirt 不是实时状态,有一定延时。

现象

已测试:连续 attach、detach、attach、detach… 反复是没有问题的。

有问题的:

  1. detach 后,virsh domblklist 是没有卸载的,要过一两秒,有短暂延时;
  2. detach 成功后,立即 detach 相同的卷,居然也可以成功。预期应该是会报错提示没有对应的卷;
  3. 两次重复的 detach 后,再 attach,attach 命令成功,但实际没有把卷挂载上。

根因

我们挺多奇怪的问题,可能都是类似的原因造成的。

libvirt 和 qemu:

  • libvirt 不是实时状态,有一定延时;
  • 然后一些重复操作,看上去是幂等的,但是它对后续操作有影响(其实也是 libvirt 的 bug)。

比如之前有过 domblk 和 qmp 查询卷不一样的情况,造成后续丢数据等。

设计思考

做重试之前,要充分测试。

  • 是否达到了重试条件(状态、时间);
  • 这个动作是否幂等;
  • 对后续动作是否有影响。

重试不是灵药,可能是毒药。

小结

  • virsh detach 后 domblklist 有短暂延时,要过一两秒;
  • detach 成功后立即 detach 相同卷也能成功,不符合预期;
  • 两次重复 detach 后再 attach,attach 成功但实际没挂载上;
  • 根因是 libvirt 不是实时状态,有一定延时;
  • 做重试之前要充分测试,重试不是灵药,可能是毒药。