开发者

How to set a timeout in libvirt (using Python)

I would like to set a short connection timeout (only some seconds) when using libvirt in my Python program instead of the long default one.

I found the 开发者_StackOverflow社区C function: virEventAddTimeoutFunc() in the C libvirt API here:

http://libvirt.org/html/libvirt-libvirt.html#virEventAddTimeoutFunc

and eventInvokeTimeoutCallback(timer, callback, opaque) in libvirt.py around the line#150 but I do not know how to use it. I did not find any example on the net.

I tried this but I get a segmentation fault: :-(

import libvirt

def timeout_cb_d():
    print 'Timeout !'

try:
    # try to set the libvirt timeout to 2 seconds:
    t = libvirt.eventInvokeTimeoutCallback(2, timeout_cb_d, "from dom0_class")
except:
    ...

Does anyone can give me a working example please?


We finally found a simple way to proceed using Python alarm & signal handler: http://docs.python.org/library/signal.html#example

Edit:

Here is the idea:

import string, time, sys, signal

class Host:

# (...)

def timeout_handler(self, sig_code, frame):
    if 14 == sig_code: sig_code = 'SIGALRM'
    print time.strftime('%F %T -'), 'Signal handler called with signal:', sig_code
    raise Exception('Timeout!')

def libVirtConnect(self):
    try:
        # Enable the timeout with an alarm:
        signal.signal(signal.SIGALRM, self.timeout_handler)
        signal.alarm(self._libvirt_timeout_in_seconds)

        self._virt_conn = libvirt.open('xen+tcp://'+self._ip)

        signal.alarm(0)      # Disable the alarm
    except Exception, e:
        signal.alarm(0)      # Disable the alarm


I'm assuming libvirt communicates over a standard socket. If that's the case, you can set an application-wide timeout using socket.settimeout.

That's not to say the libvirt bindings for python don't call that function themselves, but it's worth a try.


I have often used monkeypatching to change a library so that sockets timeout. Usually you just need to find the method which calls select or poll and monkeypatch in a modified version. Sometimes you need to set up a try-catch which catches socket.timeout and does something to allow it to percolate up to your code without causing another error on the way. In one case I had to create a valid response object instead of None, for instance.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜