diff options
author | guilhem@mysql.com <> | 2004-01-30 00:05:34 +0100 |
---|---|---|
committer | guilhem@mysql.com <> | 2004-01-30 00:05:34 +0100 |
commit | e71325caf95afbaaacac3581f38b0eafd2116620 (patch) | |
tree | 86a549cfea46d66ac122b39922323a8bd8a9e317 /heap | |
parent | 5ce227e78a2bc0530c3cab2cbebdd4672a0c40c1 (diff) | |
download | mariadb-git-e71325caf95afbaaacac3581f38b0eafd2116620.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).
Diffstat (limited to 'heap')
-rw-r--r-- | heap/hp_info.c | 15 | ||||
-rw-r--r-- | heap/hp_open.c | 3 |
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); |