From 1077f320e42323528c02757ba5dd17275cf47617 Mon Sep 17 00:00:00 2001 From: Monty Date: Sat, 6 Oct 2018 16:49:54 +0300 Subject: [PATCH] Added backup handler calls Part of MDEV-5336 Implement LOCK FOR BACKUP Added support for backup calls in Aria to protect removal of redo logs. --- sql/handler.cc | 37 +++++++++++++++++++++++++++++++++++ sql/handler.h | 7 +++++++ storage/maria/ha_maria.cc | 18 +++++++++++++++++ storage/maria/ma_loghandler.c | 26 ++++++++++++++++++++++-- storage/maria/ma_loghandler.h | 3 +++ 5 files changed, 89 insertions(+), 2 deletions(-) diff --git a/sql/handler.cc b/sql/handler.cc index c015e997f96..78a48c952ed 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -822,6 +822,43 @@ void ha_kill_query(THD* thd, enum thd_kill_levels level) } +/***************************************************************************** + Backup functions +******************************************************************************/ + +static my_bool plugin_prepare_for_backup(THD *unused1, plugin_ref plugin, + void *not_used) +{ + handlerton *hton= plugin_hton(plugin); + if (hton->state == SHOW_OPTION_YES && hton->prepare_for_backup) + hton->prepare_for_backup(); + return FALSE; +} + +void ha_prepare_for_backup() +{ + plugin_foreach_with_mask(0, plugin_prepare_for_backup, + MYSQL_STORAGE_ENGINE_PLUGIN, + PLUGIN_IS_DELETED|PLUGIN_IS_READY, 0); +} + +static my_bool plugin_end_backup(THD *unused1, plugin_ref plugin, + void *not_used) +{ + handlerton *hton= plugin_hton(plugin); + if (hton->state == SHOW_OPTION_YES && hton->end_backup) + hton->end_backup(); + return FALSE; +} + +void ha_end_backup() +{ + plugin_foreach_with_mask(0, plugin_end_backup, + MYSQL_STORAGE_ENGINE_PLUGIN, + PLUGIN_IS_DELETED|PLUGIN_IS_READY, 0); +} + + /* ======================================================================== ======================= TRANSACTIONS ===================================*/ diff --git a/sql/handler.h b/sql/handler.h index ea514634b86..df31ae4898a 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -1613,6 +1613,10 @@ struct handlerton @return transaction commit ID @retval 0 if no system-versioned data was affected by the transaction */ ulonglong (*prepare_commit_versioned)(THD *thd, ulonglong *trx_id); + + /* backup */ + void (*prepare_for_backup)(void); + void (*end_backup)(void); }; @@ -4676,6 +4680,7 @@ public: { DBUG_ASSERT(ht); return partition_ht()->flags & HTON_NATIVE_SYS_VERSIONING; } virtual void update_partition(uint part_id) {} + protected: Handler_share *get_ha_share_ptr(); void set_ha_share_ptr(Handler_share *arg_ha_share); @@ -4754,6 +4759,8 @@ int ha_create_table(THD *thd, const char *path, HA_CREATE_INFO *create_info, LEX_CUSTRING *frm); int ha_delete_table(THD *thd, handlerton *db_type, const char *path, const LEX_CSTRING *db, const LEX_CSTRING *alias, bool generate_warning); +void ha_prepare_for_backup(); +void ha_end_backup(); /* statistics and info */ bool ha_show_status(THD *thd, handlerton *db_type, enum ha_stat_type stat); diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc index 04b684ed132..c551923f660 100644 --- a/storage/maria/ha_maria.cc +++ b/storage/maria/ha_maria.cc @@ -3443,6 +3443,21 @@ int maria_checkpoint_state(handlerton *hton, bool disabled) } +/* + Handle backup calls +*/ + +void maria_prepare_for_backup() +{ + translog_disable_purge(); +} + +void maria_end_backup() +{ + translog_enable_purge(); +} + + #define SHOW_MSG_LEN (FN_REFLEN + 20) /** @@ -3643,6 +3658,9 @@ static int ha_maria_init(void *p) #endif maria_hton->flush_logs= maria_flush_logs; maria_hton->show_status= maria_show_status; + maria_hton->prepare_for_backup= maria_prepare_for_backup; + maria_hton->end_backup= maria_end_backup; + /* TODO: decide if we support Maria being used for log tables */ maria_hton->flags= HTON_CAN_RECREATE | HTON_SUPPORT_LOG_TABLES; bzero(maria_log_pagecache, sizeof(*maria_log_pagecache)); diff --git a/storage/maria/ma_loghandler.c b/storage/maria/ma_loghandler.c index 158904f6692..724beb7136c 100644 --- a/storage/maria/ma_loghandler.c +++ b/storage/maria/ma_loghandler.c @@ -56,6 +56,8 @@ static mysql_cond_t COND_soft_sync; static MA_SERVICE_THREAD_CONTROL soft_sync_control= {0, FALSE, FALSE, &LOCK_soft_sync, &COND_soft_sync}; +uint log_purge_disabled= 0; + /* transaction log file descriptor */ typedef struct st_translog_file @@ -3620,6 +3622,7 @@ my_bool translog_init_with_table(const char *directory, translog_syncs= 0; flush_start= 0; id_to_share= NULL; + log_purge_disabled= 0; log_descriptor.directory_fd= -1; log_descriptor.is_everything_flushed= 1; @@ -8668,7 +8671,7 @@ my_bool translog_purge(TRANSLOG_ADDRESS low) mysql_rwlock_unlock(&log_descriptor.open_files_lock); translog_close_log_file(file); } - if (log_purge_type == TRANSLOG_PURGE_IMMIDIATE) + if (log_purge_type == TRANSLOG_PURGE_IMMIDIATE && ! log_purge_disabled) { char path[FN_REFLEN], *file_name; file_name= translog_filename_by_fileno(i, path); @@ -8721,7 +8724,7 @@ my_bool translog_purge_at_flush() mysql_mutex_lock(&log_descriptor.purger_lock); - if (unlikely(log_descriptor.min_need_file == 0)) + if (unlikely(log_descriptor.min_need_file == 0 || log_purge_disabled)) { DBUG_PRINT("info", ("No info about min need file => exit")); mysql_mutex_unlock(&log_descriptor.purger_lock); @@ -9285,3 +9288,22 @@ void dump_page(uchar *buffer, File handler) } dump_datapage(buffer, handler); } + + +/* + Handle backup calls +*/ + +void translog_disable_purge() +{ + mysql_mutex_lock(&log_descriptor.purger_lock); + log_purge_disabled++; + mysql_mutex_unlock(&log_descriptor.purger_lock); +} + +void translog_enable_purge() +{ + mysql_mutex_lock(&log_descriptor.purger_lock); + log_purge_disabled--; + mysql_mutex_unlock(&log_descriptor.purger_lock); +} diff --git a/storage/maria/ma_loghandler.h b/storage/maria/ma_loghandler.h index 3fb9e7d37bf..07d6a96557d 100644 --- a/storage/maria/ma_loghandler.h +++ b/storage/maria/ma_loghandler.h @@ -367,6 +367,8 @@ extern void dump_page(uchar *buffer, File handler); extern my_bool translog_log_debug_info(TRN *trn, enum translog_debug_info_type type, uchar *info, size_t length); +extern void translog_disable_purge(void); +extern void translog_enable_purge(void); enum enum_translog_status { @@ -520,6 +522,7 @@ typedef enum } enum_maria_translog_purge_type; extern ulong log_purge_type; extern ulong log_file_size; +extern uint log_purge_disabled; /* For backup */ typedef enum {