• Guido van Rossum's avatar
    The mystery of the Win98 hangs in the checkReconnectSwitch() test · da28b620
    Guido van Rossum authored
    until I added an is_connected() test to testConnection() is solved.
    
    After the ConnectThread has switched the client to the new, read-write
    connection, it closes the read-only connection(s) that it was saving
    up in case there was no read-write connection.  But closing a
    ManagedConnection calls notify_closed() on the manager, which
    disconnected the manager and the client from its brand new read-write
    connection.  The mistake here is that this should only be done when
    closing the manager's current connection!
    
    The fix was to add an argument to notify_closed() that passes the
    connection object being closed; notify_closed() returns without doing
    a thing when that is not the current connection.
    
    I presume this didn't happen on Linux because there the sockets
    happened to connect in a different order, and there was no read-only
    connection to close yet (just a socket trying to connect).
    
    I'm taking out the previous "fix" to ClientStorage, because that only
    masked the problem in this relatively simple test case.  The problem
    could still occur when both a read-only and a read-write server are up
    initially, and the read-only server connects first; once the
    read-write server connects, the read-write connection is installed,
    and then the saved read-only connection is closed which would again
    mistakenly disconnect the read-write connection.
    
    Another (related) fix is not to call self.mgr.notify_closed() but to
    call self.mgr.connection.close() when reconnecting.  (Hmm, I wonder if
    it would make more sense to have an explicit reconnect callback to the
    manager and the client?  Later.)
    da28b620
connection.py 16.3 KB