summaryrefslogtreecommitdiff
path: root/heap
diff options
context:
space:
mode:
authorunknown <guilhem@mysql.com>2004-01-30 00:05:34 +0100
committerunknown <guilhem@mysql.com>2004-01-30 00:05:34 +0100
commite7a906466492beae3d7bf24a8b3916849a4c4ac4 (patch)
tree86a549cfea46d66ac122b39922323a8bd8a9e317 /heap
parentebbd056fd904e2deb06c72b132675d6768f531ba (diff)
downloadmariadb-git-e7a906466492beae3d7bf24a8b3916849a4c4ac4.tar.gz
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;
Diffstat (limited to 'heap')
-rw-r--r--heap/hp_info.c15
-rw-r--r--heap/hp_open.c3
2 files changed, 11 insertions, 7 deletions
diff --git a/heap/hp_info.c b/heap/hp_info.c
index 3e9d6b6a90b..c8cdfc58c2d 100644
--- a/heap/hp_info.c
+++ b/heap/hp_info.c
@@ -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 */
diff --git a/heap/hp_open.c b/heap/hp_open.c
index ec8b5fea904..3bf2881667a 100644
--- a/heap/hp_open.c
+++ b/heap/hp_open.c
@@ -30,6 +30,7 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef,
uint reclength, ulong max_records, ulong min_records)
{
uint i,j,key_segs,max_length,length;
+ my_bool implicit_emptied= 0;
HP_INFO *info;
HP_SHARE *share;
HP_KEYSEG *keyseg;
@@ -39,6 +40,7 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef,
if (!(share=_hp_find_named_heap(name)))
{
DBUG_PRINT("info",("Initializing new table"));
+ implicit_emptied= 1;
for (i=key_segs=max_length=0 ; i < keys ; i++)
{
key_segs+= keydef[i].keysegs;
@@ -127,6 +129,7 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef,
#ifndef DBUG_OFF
info->opt_flag=READ_CHECK_USED; /* Check when changing */
#endif
+ info->implicit_emptied= implicit_emptied;
DBUG_PRINT("exit",("heap: %lx reclength: %d records_in_block: %d",
info,share->reclength,share->block.records_in_block));
DBUG_RETURN(info);