• unknown's avatar
    Fix Bug #18559 "log tables cannot change engine, and · 9fa8fba8
    unknown authored
                    gets deadlocked when dropping w/ log on"
    
    Log tables rely on concurrent insert machinery to add data.
    This means that log tables are always opened and locked by
    special (artificial) logger threads. Because of this, the thread
    which tries to drop a log table starts to wait for the table
    to be unlocked. Which will happen only if the log table is disabled.
    Alike situation happens if one tries to alter a log table.
    However in addition to the problem above, alter table calls
    check_if_locking_is_allowed() routine for the engine. The
    routine does not allow alter for the log tables. So, alter
    doesn't start waiting forever for logs to be disabled, but 
    returns with an error.
    Another problem is that not all engines could be used for
    the log tables. That's because they need concurrent insert.
    
    In this patch we:
    (1) Explicitly disallow to drop/alter a log table if it
        is currently used by the logger.
    (2) Update MyISAM to support log tables
    (3) Allow to drop log tables/alter log tables if log is
        disabled
    At the same time we (4) Disallow to alter log tables to
    unsupported engine (after this patch CSV and MyISAM are 
    alowed)
    Recommit with review fixes.
    
    
    mysql-test/r/log_tables.result:
      Update result file.
      Note: there are warnings in result file. This is because of CSV
      bug (Bug #21328). They should go away after it is fixed.
    mysql-test/t/log_tables.test:
      Add a test for the bug
    sql/ha_myisam.cc:
      Add log table handling to myisam: as log tables
      use concurrent insert, they are typically
      locked with TL_CONCURRERENT_INSERT lock. So,
      disallow other threads to attempt locking of
      the log tables in incompatible modes. Because
      otherwise the threads will wait for the tables
      to be unlocked forever.
    sql/handler.cc:
      Add a function to check if a table we're going to lock
      is a log table and if the lock mode we want allowed
    sql/handler.h:
      Add a new function to check compatibility of the locking
    sql/log.cc:
      we shouldn't close the log table if and only
      if this particular table is already closed
    sql/log.h:
      add new functions to check if a log is enabled
    sql/share/errmsg.txt:
      add new error messages
    sql/sql_table.cc:
      DROP and ALTER TABLE should not work on log
      tables if the log tables are enabled
    storage/csv/ha_tina.cc:
      move function to check if the locking for the log
      tables allowed to handler class, so that we can
      reuse it in other engines.
    storage/myisam/mi_extra.c:
      add new ::extra() flag processing to myisam
    storage/myisam/mi_open.c:
      init log table flag
    storage/myisam/mi_write.c:
      update status after each write if it's a log table
    storage/myisam/myisamdef.h:
      Add new log table flag to myisam share.
      We need it to distinguish between usual
      and log tables, as for the log tables we
      should provide concurrent insert in a
      different way than for usual tables: we
      want new rows to be immediately visible
      to other threads.
    9fa8fba8
mi_open.c 40.2 KB