• M
    esx: Improve blocked task detection and fix race condition · 25e34b70
    Matthias Bolte 提交于
    esxVI_WaitForTaskCompletion can take a UUID to lookup the
    corresponding domain and check if the current task for it
    is blocked by a question. It calls another function to do
    this: esxVI_LookupAndHandleVirtualMachineQuestion looks up
    the VirtualMachine and checks for a question. If there is
    a question it calls esxVI_HandleVirtualMachineQuestion to
    handle it.
    
    If there was no question or it has been answered the call
    to esxVI_LookupAndHandleVirtualMachineQuestion returns 0.
    If any error occurred during the lookup and answering
    process -1 is returned. The problem with this is, that -1
    is also returned when there was no error but the question
    could not be answered. So esxVI_WaitForTaskCompletion cannot
    distinguish between this two situations and reports that a
    question is blocking the task even when there was actually
    another problem.
    
    This inherent problem didn't surface until vSphere 4.1 when
    you try to define a new domain. The driver tries to lookup
    the domain that is just in the process of being registered.
    There seems to be some kind of race condition and the driver
    manages to issue a lookup command before the ESX server was
    able to register the domain. This used to work before.
    
    Due to the return value problem described above the driver
    reported a false error message in that case.
    
    To solve this esxVI_WaitForTaskCompletion now takes an
    additional occurrence parameter that describes whether or
    not to expect the domain to be existent. Also add a new
    parameter to esxVI_LookupAndHandleVirtualMachineQuestion
    that allows to distinguish if the call returned -1 because
    of an actual error or because the question could not be
    answered.
    25e34b70
esx_driver.c 124.6 KB