• James Bardin's avatar
    always wait for a RunningOperation to return · 7cba6832
    James Bardin authored
    If the user wishes to interrupt the running operation, only the first
    interrupt was communicated to the operation by canceling the provided
    context. A second interrupt would start the shutdown process, but not
    communicate this to the running operation. This order of event could
    cause partial writes of state.
    
    What would happen is that once the command returns, the plugin system
    would stop the provider processes. Once the provider processes dies, all
    pending Eval operations would return return with an error, and quickly
    cause the operation to complete. Since the backend code didn't know that
    the process was shutting down imminently, it would continue by
    attempting to write out the last known state. Under the right
    conditions, the process would exit part way through the writing of the
    state file.
    
    Add Stop and Cancel CancelFuncs to the RunningOperation, to allow it to
    easily differentiate between the two signals. The backend will then be
    able to detect a shutdown and abort more gracefully.
    
    In order to ensure that the backend is not in the process of writing the
    state out, the command will always attempt to wait for the process to
    complete after cancellation.
    7cba6832