mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 13:02:28 +01:00
8d9cf89e96
The Blackhole engine did not support row-based replication since the delete_row(), update_row(), and the index and range searching functions were not implemented. This patch adds row-based replication support for the Blackhole engine by implementing the two functions mentioned above, and making the engine pretend that it has found the correct row to delete or update when executed from the slave SQL thread by implementing index and range searching functions. It is necessary to only pretend this for the SQL thread, since a SELECT executed on the Blackhole engine will otherwise never return EOF, causing a livelock. mysql-test/extra/binlog_tests/blackhole.test: Blackhole now handles row-based replication. mysql-test/extra/rpl_tests/rpl_blackhole.test: Test helper file for testing that blackhole actually writes something to the binary log on the slave. mysql-test/suite/binlog/t/binlog_multi_engine.test: Replication now handles row-based replcation. mysql-test/suite/rpl/t/rpl_blackhole.test: Test that Blackhole works with primary key, index, or none. sql/log_event.cc: Correcting code to only touch filler bits and leave all other bits alone. It is necessary since there is no guarantee that the engine will be able to fill in the bits correctly (e.g., the blackhole engine). storage/blackhole/ha_blackhole.cc: Adding definitions for update_row() and delete_row() to return OK when executed from the slave SQL thread with thd->query == NULL (indicating that row-based replication events are being processed). Changing rnd_next(), index_read(), index_read_idx(), and index_read_last() to return OK when executed from the slave SQL thread (faking that the row has been found so that processing proceeds to update/delete the row). storage/blackhole/ha_blackhole.h: Enabling row capabilities for engine. Defining write_row(), update_row(), and delete_row(). Making write_row() private (as it should be).
100 lines
3.7 KiB
C++
100 lines
3.7 KiB
C++
/* Copyright (C) 2005 MySQL AB
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
#ifdef USE_PRAGMA_INTERFACE
|
|
#pragma interface /* gcc class implementation */
|
|
#endif
|
|
|
|
/*
|
|
Shared structure for correct LOCK operation
|
|
*/
|
|
struct st_blackhole_share {
|
|
THR_LOCK lock;
|
|
uint use_count;
|
|
uint table_name_length;
|
|
char table_name[1];
|
|
};
|
|
|
|
|
|
/*
|
|
Class definition for the blackhole storage engine
|
|
"Dumbest named feature ever"
|
|
*/
|
|
class ha_blackhole: public handler
|
|
{
|
|
THR_LOCK_DATA lock; /* MySQL lock */
|
|
st_blackhole_share *share;
|
|
|
|
public:
|
|
ha_blackhole(handlerton *hton, TABLE_SHARE *table_arg);
|
|
~ha_blackhole()
|
|
{
|
|
}
|
|
/* The name that will be used for display purposes */
|
|
const char *table_type() const { return "BLACKHOLE"; }
|
|
/*
|
|
The name of the index type that will be used for display
|
|
don't implement this method unless you really have indexes
|
|
*/
|
|
const char *index_type(uint key_number);
|
|
const char **bas_ext() const;
|
|
ulonglong table_flags() const
|
|
{
|
|
return(HA_NULL_IN_KEY | HA_CAN_FULLTEXT | HA_CAN_SQL_HANDLER |
|
|
HA_BINLOG_STMT_CAPABLE | HA_BINLOG_ROW_CAPABLE |
|
|
HA_CAN_INDEX_BLOBS | HA_AUTO_PART_KEY |
|
|
HA_FILE_BASED | HA_CAN_GEOMETRY | HA_CAN_INSERT_DELAYED);
|
|
}
|
|
ulong index_flags(uint inx, uint part, bool all_parts) const
|
|
{
|
|
return ((table_share->key_info[inx].algorithm == HA_KEY_ALG_FULLTEXT) ?
|
|
0 : HA_READ_NEXT | HA_READ_PREV | HA_READ_RANGE |
|
|
HA_READ_ORDER | HA_KEYREAD_ONLY);
|
|
}
|
|
/* The following defines can be increased if necessary */
|
|
#define BLACKHOLE_MAX_KEY 64 /* Max allowed keys */
|
|
#define BLACKHOLE_MAX_KEY_SEG 16 /* Max segments for key */
|
|
#define BLACKHOLE_MAX_KEY_LENGTH 1000
|
|
uint max_supported_keys() const { return BLACKHOLE_MAX_KEY; }
|
|
uint max_supported_key_length() const { return BLACKHOLE_MAX_KEY_LENGTH; }
|
|
uint max_supported_key_part_length() const { return BLACKHOLE_MAX_KEY_LENGTH; }
|
|
int open(const char *name, int mode, uint test_if_locked);
|
|
int close(void);
|
|
int rnd_init(bool scan);
|
|
int rnd_next(uchar *buf);
|
|
int rnd_pos(uchar * buf, uchar *pos);
|
|
int index_read_map(uchar * buf, const uchar * key, key_part_map keypart_map,
|
|
enum ha_rkey_function find_flag);
|
|
int index_read_idx_map(uchar * buf, uint idx, const uchar * key,
|
|
key_part_map keypart_map,
|
|
enum ha_rkey_function find_flag);
|
|
int index_read_last_map(uchar * buf, const uchar * key, key_part_map keypart_map);
|
|
int index_next(uchar * buf);
|
|
int index_prev(uchar * buf);
|
|
int index_first(uchar * buf);
|
|
int index_last(uchar * buf);
|
|
void position(const uchar *record);
|
|
int info(uint flag);
|
|
int external_lock(THD *thd, int lock_type);
|
|
int create(const char *name, TABLE *table_arg,
|
|
HA_CREATE_INFO *create_info);
|
|
THR_LOCK_DATA **store_lock(THD *thd,
|
|
THR_LOCK_DATA **to,
|
|
enum thr_lock_type lock_type);
|
|
private:
|
|
virtual int write_row(uchar *buf);
|
|
virtual int update_row(const uchar *old_data, uchar *new_data);
|
|
virtual int delete_row(const uchar *buf);
|
|
};
|