• Sergey Vojtovich's avatar
    Moved early check for table existance to mysql_execute_command() · 8cf7e345
    Sergey Vojtovich authored
    MDEV-17772 - 3 way lock : ALTER, MDL, BACKUP STAGE BLOCK_DDL
    
    While waiting for a (potentially long) RO transaction or SELECT, DDL and
    LOCK TABLES ... WRITE hold protection against FTWRL and BACKUP STAGE.
    
    This effectively makes FTWRL/BACKUP STAGE indirectly wait for this RO
    transaction or SELECT to finish. Which is not great, as otherwise we
    could do something useful meanwhile.
    
    With this patch BACKUP lock is attempted to be acquired after TABLE/SCHEMA
    locks. If this attempt fails, TABLE/SCHEMA locks gets released and we
    start waiting for BACKUP lock. When wait finishes, BACKUP lock is released
    (to avoid deadlocks) and we attempt to acquire all locks once again.
    
    Other changes:
    - Take MDL lock before testing if table exists as part of
      CREATE TABLE ... IF EXISTS.  This change was an effect of changes in
      lock_table_name and removes an inconsistency where one could get
      different error messages from CREATE TABLE .. IF EXISTS depending on
      active mdl locks.
      One effect of this change is that we don't binary log CREATE TABLE IF
      EXISTS if the table exists.  This was done because old code was sometimes
      behaving inconsistenly (it was logged some time and not other times)
      and sending the query to the slave could make the slave even more
      inconsistent as there is not guarantee that the new table will have
      the same definition as the old table on the master.
    8cf7e345
flush_read_lock.test 65.6 KB