1
0
mirror of https://github.com/MariaDB/server.git synced 2025-12-24 11:21:21 +03:00

bug#2831 - --extenral-locking does not fully work with --myisam-recover.

Changed the semantics of open_count so that it is decremented
at every unlock (if it was incremented due to data changes).
So it indicates a crash, if it is non-zero after a lock.
The table will then be repaired.


myisam/mi_close.c:
  bug#2831 - --extenral-locking does not fully work with --myisam-recover.
  To avoid flushing the open_count at every unlock,
  we need to do so at close at least.
myisam/mi_locking.c:
  bug#2831 - --extenral-locking does not fully work with --myisam-recover.
  open_count is now decremented at unlock (from a writelock) with
  mi_unlock_open_count(). After every new lock the state is read
  from the index file and the open_count checked. If not zero,
  another server must have crashed, so the table is marked as crashed.
  In certain situations the decremented open_count mut be flushed to
  the index file. I tried to keep these extra flushes as seldom as possible.
sql/ha_myisam.cc:
  bug#2831 - --extenral-locking does not fully work with --myisam-recover.
  Added code to repair the table, if it is marked crashed after
  successful locking and the --myisam-recover option is set.
sql/sql_table.cc:
  This does not really belong to the bugfix for #2831.
  But it was detected during fixing the external locking.
This commit is contained in:
unknown
2004-09-18 20:33:39 +02:00
parent c36356b6a4
commit a7919a11fc
4 changed files with 111 additions and 11 deletions

View File

@@ -2208,7 +2208,12 @@ copy_data_between_tables(TABLE *from,TABLE *to,
if (!(copy= new Copy_field[to->fields]))
DBUG_RETURN(-1); /* purecov: inspected */
to->file->external_lock(thd,F_WRLCK);
if (to->file->external_lock(thd, F_WRLCK))
{
/* We must always unlock, even when lock failed. */
(void) to->file->external_lock(thd, F_UNLCK);
DBUG_RETURN(-1);
}
to->file->extra(HA_EXTRA_WRITE_CACHE);
from->file->info(HA_STATUS_VARIABLE);
to->file->deactivate_non_unique_index(from->file->records);
@@ -2308,11 +2313,12 @@ copy_data_between_tables(TABLE *from,TABLE *to,
error=1;
if (ha_commit(thd))
error=1;
if (to->file->external_lock(thd,F_UNLCK))
error=1;
err:
free_io_cache(from);
*copied= found_count;
*deleted=delete_count;
/* we must always unlock the table on return. */
if (to->file->external_lock(thd,F_UNLCK))
error=1;
DBUG_RETURN(error > 0 ? -1 : 0);
}