2011-04-08 7 views
1


Je voudrais définir un délai d'attente de connexion court (seulement quelques secondes) lors de l'utilisation de libvirt dans mon programme Python au lieu du long par défaut.Comment définir un délai d'expiration dans libvirt (en utilisant Python)

Je trouve la fonction C: virEventAddTimeoutFunc() dans la C API libvirt ici:
http://libvirt.org/html/libvirt-libvirt.html#virEventAddTimeoutFunc

et eventInvokeTimeoutCallback(timer, callback, opaque) dans libvirt.py autour de la ligne # 150, mais je ne sais pas comment l'utiliser. Je n'ai trouvé aucun exemple sur le net.

J'ai essayé, mais je reçois une erreur de segmentation: :-(

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

Est-ce que quelqu'un peut me donner un exemple de travail s'il vous plaît

Répondre

0

Nous avons finalement trouvé un moyen simple de procéder à l'aide d'alarme Python & gestionnaire de signal: http://docs.python.org/library/signal.html#example

Edit:

Voici l'idée:

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

Les réponses qui ne contiennent que des liens sont [considérées comme une mauvaise pratique] (http://meta.stackexchange.com/q/8231). Veuillez résumer le contenu ici (ne pas copier/coller) afin que la réponse puisse se suffire à elle-même. Si vous ne le faites pas, vous courez le risque que votre réponse soit supprimée, surtout si le lien meurt jamais. –

+0

Bonjour Martijn Pieters, je viens d'ajouter du code Python pour compléter ma réponse. – PixEye

0

Je suppose libvirt communique sur une prise standard? Si cela est le cas, vous pouvez définir un délai d'attente à l'échelle de l'application à l'aide de socket.settimeout

Cela ne veut pas dire que les bindings libvirt pour python n'appellent pas cette fonction, mais cela en vaut la peine. y.

0

Je l'ai souvent utilisé monkeypatching pour changer une bibliothèque afin que les sockets expirent. Habituellement, vous avez juste besoin de trouver la méthode qui appelle select ou poll et monkeypatch dans une version modifiée. Parfois, vous devez configurer un try-catch qui attrape socket.timeout et fait quelque chose pour lui permettre de s'infiltrer dans votre code sans causer une autre erreur sur le chemin. Dans un cas, j'ai dû créer un objet réponse valide au lieu de None, par exemple.

Questions connexes