Как установить тайм-аут в libvirt (используя Python) - PullRequest
1 голос
/ 08 апреля 2011


Я хотел бы установить короткий тайм-аут соединения (всего несколько секунд) при использовании libvirt в моей программе на Python вместо длинного по умолчанию.

Я нашел функцию C: virEventAddTimeoutFunc() в C libvirt API здесь:
http://libvirt.org/html/libvirt-libvirt.html#virEventAddTimeoutFunc

и eventInvokeTimeoutCallback(timer, callback, opaque) в libvirt.py вокруг строки # 150, но я не знаю, как это использовать. Я не нашел ни одного примера в сети.

Я пробовал это, но у меня ошибка сегментации: : - (

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:
    ...

Кто-нибудь может дать мне рабочий пример, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 11 октября 2011

Наконец-то мы нашли простой способ использовать обработчик сигналов тревоги и сигналов Python: http://docs.python.org/library/signal.html#example

Edit:

Вот идея:

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
0 голосов
/ 12 октября 2011

Я часто использовал monkeypatching, чтобы изменить библиотеку, чтобы время ожидания сокетов. Обычно вам просто нужно найти метод, который вызывает select или poll и monkeypatch в измененной версии. Иногда вам нужно настроить try-catch, который перехватывает socket.timeout и что-то делает, чтобы позволить ему просочиться до вашего кода, не вызывая при этом еще одной ошибки. Например, в одном случае мне пришлось создать действительный объект ответа вместо None.

0 голосов
/ 29 июня 2011

Я предполагаю, что libvirt обменивается данными через стандартный сокет. В этом случае вы можете установить тайм-аут для всего приложения, используя socket.settimeout.

Это не значит, что привязки libvirt для python сами по себе не вызывают эту функцию, но стоит попробовать.

...