1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

Fix for BUG#2477 "Slave stop with error after master reboot if use HEAP tables":

when we open the HEAP table for the first time since server restart,
in hp_open(), we set a flag to propagate this info to the handler level
which then writes a DELETE FROM this_heap_table to the binlog.
It is not a perfect solution for the bug, because between the server start and 
the first open of the table, the slave still had old data in his table so
a SELECT on the slave may show wrong content. But if there is a --init-file
to populate the HEAP table on master as startup, then this is a safe fix
(I'll put a note about init-file in the HEAP section of the manual).


heap/hp_info.c:
  new info variable implicit_emptied
heap/hp_open.c:
  If this is the first open of the HEAP table, it means it is empty,
  so we mark it.
include/heap.h:
  new variables implicit_emptied
  (we need one in HEAPINFO for the hp_info() call).
sql/ha_heap.cc:
  report info to upper level
sql/handler.h:
  new info 'implicit_emptied' in the handler level; only HEAP uses it.
sql/sql_base.cc:
  When a HEAP table is opened for the first time, write a DELETE FROM to the binlog,
  for replication and mysqlbinlog|mysql.
  Monty: I added the
  entry->file->implicit_emptied= 0;
This commit is contained in:
unknown
2004-01-30 00:05:34 +01:00
parent 8746a25554
commit bbd2adf4ba
8 changed files with 136 additions and 18 deletions

View File

@ -48,12 +48,13 @@ int heap_info(reg1 HP_INFO *info,reg2 HEAPINFO *x,
int flag __attribute__((unused)))
{
DBUG_ENTER("heap_info");
x->records = info->s->records;
x->deleted = info->s->deleted;
x->reclength = info->s->reclength;
x->data_length = info->s->data_length;
x->index_length= info->s->index_length;
x->max_records = info->s->max_records;
x->errkey = info->errkey;
x->records = info->s->records;
x->deleted = info->s->deleted;
x->reclength = info->s->reclength;
x->data_length = info->s->data_length;
x->index_length = info->s->index_length;
x->max_records = info->s->max_records;
x->errkey = info->errkey;
x->implicit_emptied= info->implicit_emptied;
DBUG_RETURN(0);
} /* heap_info */