xend调用xenstore的出错揭秘
近期发现几例问题,均是xend里面报了同一个错误
File "/usr/lib64/python2.4/site-packages/xen/xend/xenstore/xstransact.py", line 29, in __init__
self.transaction = xshandle().transaction_start()
Error: (2, 'No such file or directory')
好吧,可能有人会觉得我们太土了,怎么还在用xend,我也很鄙视自己。不管怎样,既然有问题,就得解决。刚好xenstore的实现之前也不是非常了解,借此好好学习下。
根据xend报错的路径,可以发现xshandle这个方法,里面的一个实例,只在xend start初始化一次即可。那么可以排除xshandle()这个方法出错。
transaction_start这个方法是python调用xenstore的c库方法。
xenstore一般大家都理解成一个小型db,里面存了各种domain有用的信息,我们用的还是c版的,社区已有一个ocalm写的,不过还没试用过。还好是c的,还能看懂,换了ocalm的,又要多花点一点时间了。
具体代码逻辑也就不多说了,看了应该都能明白。大致流程简单说下,就是打开xenstore的时候,建立一个连接,有对应的connection的数据结构,还有一个全局的context的东西,它里面的保存着最新数据的文件fd,及相关数据信息。所以有时候,读xenstore,可以直接内存返回,有的时候,需要重新读文件,写文件,这个就是transaction做的事情。
一个transaction_start,就是会用原来的fd读取所有数据,然后把它写到一个新的文件, transaction_end的时候,会rename成原来的文件,这就是事务的实现方法。
所以看到这里,结合errorcode,就很容易怀疑是文件操作出错之类,然后翻看系统的message日志,果然,在xend出错的时间点都对应有磁盘出错的日志。
谜底揭晓:系统盘出错导致xend调用xenstore出错
解决方案:可以临时把/var/lib/xenstored/ 软连接到/dev/shm, 再把tdb考到/dev/shm下。中间最好xend stop,避免信息出现不一致问题。