• Dmitry Lenev's avatar
    Fix for bug #51105 "MDL deadlock in rqg_mdl_stability test · a7530fb2
    Dmitry Lenev authored
    on Windows".
    
    On platforms where read-write lock implementation does not
    prefer readers by default (Windows, Solaris) server might
    have deadlocked while detecting MDL deadlock.
    
    MDL deadlock detector relies on the fact that read-write
    locks which are used in its implementation prefer readers
    (see new comment for MDL_lock::m_rwlock for details).
    So far MDL code assumed that default implementation of
    read/write locks for the system has this property.
    Indeed, this turned out ot be wrong, for example, for
    Windows or Solaris. Thus MDL deadlock detector might have
    deadlocked on these systems.
    
    This fix simply adds portable implementation of read/write
    lock which prefer readers and changes MDL code to use this
    new type of synchronization primitive.
    
    No test case is added as existing rqg_mdl_stability test can
    serve as one.
    
    config.h.cmake:
      Check for presence of pthread_rwlockattr_setkind_np to be
      able to determine if system natively supports read-write
      locks for which we can specify if readers or writers should
      be preferred.
    configure.cmake:
      Check for presence of pthread_rwlockattr_setkind_np to be
      able to determine if system natively supports read-write
      locks for which we can specify if readers or writers should
      be preferred.
    configure.in:
      Check for presence of pthread_rwlockattr_setkind_np to be
      able to determine if system natively supports read-write
      locks for which we can specify if readers or writers should
      be preferred.
    include/my_pthread.h:
      Added support for portable read-write locks which prefer
      readers.
      To do so extended existing my_rw_lock_t implementation to
      support selection of whom to prefer depending on a flag.
    mysys/thr_rwlock.c:
      Extended existing my_rw_lock_t implementation to support
      selection of whom to prefer depending on a flag.
      Added rw_pr_init() function implementing initialization of
      read-write locks preferring readers.
    sql/mdl.cc:
      Use portable read-write locks which prefer readers instead of
      relying on that system implementation of read-write locks has
      this property (this was true for Linux/NPTL but was false,
      for example, for Windows and Solaris).
      Added comment explaining why preferring readers is important
      for MDL deadlock detector (thanks to Serg for example!).
    sql/mdl.h:
      Use portable read-write locks which prefer readers instead of
      relying on that system implementation of read-write locks has
      this property (this was true for Linux/NPTL but was false,
      for example, for Windows and Solaris).
    a7530fb2
thr_rwlock.c 5.16 KB