这个问题的解决并没有那么直截了当。原因之一,是Systemd使用了同一个cookie变量来兼容dbus1和dbus2。对于dbus1来说,cookie是32位的,这个值在经过Systemd在三五个月中频繁创建和删除unit之后,是肯定会溢出的;而dbus2的cookie是64位的,可能到了“时间的尽头”它也不会溢出。
另外一个原因是,我们并不能简单地让cookie折返来解决溢出问题。因为这有可能导致Systemd使用同一个cookie来加封不同的消息,这样的结果将是灾难性的。
最终的修复方法是,同样使用32位cookie来处理dbus1和dbus2两种情形。在cookie达到0xfffffff之后,下一个cookie则变成0x80000000,即用最高位来标记cookie已经处于溢出状态。检查到cookie处于这种状态时,我们需要检查是否下一个cookie正在被其他message使用,以避免cookie冲突。