Функция обратного вызова события, вызываемая дважды для каждого события в libvirt

#python #virtual-machine #qemu #libvirt #hypervisor

#python #виртуальная машина #qemu #libvirt #гипервизор

Вопрос:

newVM это функция, которая создает новую виртуальную машину. Для каждой гостевой виртуальной машины функция обратного вызова события выполняется 2 раза, хотя обратный вызов таймера выполняется корректно только один раз за каждый интервал. Я не могу выяснить причину того же

 eventLoopThread = None
libvirt.virEventRegisterDefaultImpl()

def virEventLoopNativeStart():
    global eventLoopThread
    eventLoopThread = threading.Thread(target=virEventLoopNativeRun, name="libvirtEventLoop")
    eventLoopThread.setDaemon(True)
    eventLoopThread.start()

def domainEventCallback(conn, dom, event, detail, opaque):
    print(" event callback %s %s %s", event, dom.name(), dom.state())

def domainTimeoutCalllback(timer, opaque):
    print(" Timeout ")

def virEventLoopNativeRun():
    while True:
        libvirt.virEventRunDefaultImpl()

virEventLoopNativeStart()
conn = libvirt.open('qemu:///system')
if conn == None:
    print('Failed to open connection to qemu:///system', file=sys.stderr)
    exit(1)
conn.domainEventRegister(domainEventCallback, None)
conn.setKeepAlive(5, 3)

def newVM(xmldata): #xmldata is XML to define guest machine
    try: 
        conn = libvirt.open('qemu:///system')
        if conn == None:
            print('Failed to open connection to qemu:///system', file=sys.stderr)
            exit(1)

        dom = conn.defineXML(xmldata)
        if dom == None:
            print('Failed to define a domain from an XML definition.', file=sys.stderr)
            exit(1)

        if dom.create() < 0:
            print('Can not boot guest domain.', file=sys.stderr)
            exit(1)
    
        libvirt.virEventAddTimeout(runTime, domainTimeoutCalllback, None)
    except libvirt.libvirtError:
        abort(404, "Libvirt could not be configured")


  

Ответ №1:

Обычно обратный вызов события домена вызывается много раз во время запуска — каждый раз ему будут присваиваться разные значения аргументов.

Комментарии:

1. Я проверил, зарегистрировав на консоли dom.state, событие, dom. Идентификатор, dom.name временная метка внутри функции обратного вызова события. Я получаю две записи для каждого события с разницей во временной метке менее 0,0001. Даже если я вызываю ‘virsh destroy domain’, это вызывает обратный вызов событий с одним и тем же журналом, выполняемым дважды.