If notify() is called after the Baton's run() method does its final check of the queue and the point where wait() relocks the mutex, it will push an empty task to the queue which won't have a chance to run before the Baton is detached from the OperationContext. This causes an invariant failure when detach() asserts that the queue is empty.
This race also exists in 4.0 with a larger window: any time the operation is killed between the last call to run() and the call to detach().
The fix for both branches will be to not schedule the empty task on killop and instead just always tap the event fd.
Until this is fixed, it can be worked around by setting the AsyncRequestsSenderUseBaton server parameter to false.