/* Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2.0, as published by the Free Software Foundation. This program is also distributed with certain software (including but not limited to OpenSSL) that is licensed under separate terms, as designated in a particular file or component or in included license documentation. The authors of MySQL hereby grant you an additional permission to link the program and your derivative works with the separately licensed software that they have included with MySQL. 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, version 2.0, 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CERTIFICATION_HANDLER_INCLUDE #define CERTIFICATION_HANDLER_INCLUDE #include #include #include "plugin/group_replication/include/certifier.h" class Certification_handler : public Event_handler { public: Certification_handler(); virtual ~Certification_handler(); int handle_event(Pipeline_event *ev, Continuation *cont); int handle_action(Pipeline_action *action); int initialize(); int terminate(); bool is_unique(); int get_role(); Certifier_interface *get_certifier(); int set_certification_info(std::map *cert_info); private: Certifier *cert_module; THD *applier_module_thd; rpl_sidno group_sidno; Data_packet *transaction_context_packet; Pipeline_event *transaction_context_pevent; /** Are view change on wait for application */ bool m_view_change_event_on_wait; /** View change information information stored for delay */ struct View_change_stored_info { Pipeline_event *view_change_pevent; std::string local_gtid_certified; rpl_gno view_change_event_gno; View_change_stored_info(Pipeline_event *vc_pevent, std::string &local_gtid_string, rpl_gno gno) : view_change_pevent(vc_pevent), local_gtid_certified(local_gtid_string), view_change_event_gno(gno) {} }; /** All the VC events pending application due to timeout */ std::list pending_view_change_events; /** Set transaction context for next event handler. @param[in] pevent Pipeline event that wraps Transaction_context_log_event. @return Operation status @retval 0 OK @retval !=0 Error */ int set_transaction_context(Pipeline_event *pevent); /** Get transaction context set on previous event handler. @param[in] pevent Pipeline event that wraps Gtid_log_event. @param[out] tcle Transaction_context_log_event. @return Operation status @retval 0 OK @retval !=0 Error */ int get_transaction_context(Pipeline_event *pevent, Transaction_context_log_event **tcle); /** Reset transaction context. */ void reset_transaction_context(); /** This method handles transaction context events by storing them so they can be used on next handler. @param[in] pevent the event to be injected @param[in] cont the object used to wait @return the operation status @retval 0 OK @retval !=0 Error */ int handle_transaction_context(Pipeline_event *pevent, Continuation *cont); /** This methods handles transaction identifier events, it does two tasks: 1. Using transaction context previously processed and stored, validate that this transaction does not conflict with any other; 2. If the transaction does not conflict and it is allowed to commit, it does inform the server of that decision and does update the transaction identifier if needed. @param[in] pevent the event to be injected @param[in] cont the object used to wait @return the operation status @retval 0 OK @retval !=0 Error */ int handle_transaction_id(Pipeline_event *pevent, Continuation *cont); /* This method extracts the certification db and the sequence number from the certifier injecting them in a View change event to be sent to a possible joiner. */ int extract_certification_info(Pipeline_event *pevent, Continuation *cont); /** This methods guarantees that the view change event is logged after local transactions are executed. @param local_gtid_certified_string The set to wait. If not defined, it extracts the current certified set @retval 0 OK @retval LOCAL_WAIT_TIMEOUT_ERROR Timeout error on wait @retval !=0 Wait or interface error */ int wait_for_local_transaction_execution( std::string &local_gtid_certified_string); /** Create a transactional block for the received log event GTID BEGIN EVENT COMMIT @param[in] pevent the event to be injected @param[in, out] event_gno The transaction GTID gno If -1, one will be generated. @param[in] cont the object used to wait @return the operation status @retval 0 OK @retval !=0 Error */ int inject_transactional_events(Pipeline_event *pevent, rpl_gno *event_gno, Continuation *cont); /** Try to log a view change event waiting for local certified transactions to finish. @param[in] view_pevent the event to be injected @param[in, out] local_gtid_string The local certified transaction set to wait If empty, one will be assigned even on timeout @param[in, out] event_gno The transaction GTID gno If -1, one will be generated. @param[in] cont the object used to wait @return the operation status @retval 0 OK @retval LOCAL_WAIT_TIMEOUT_ERROR Timeout error on wait for local transactions @retval !=0 Error */ int log_view_change_event_in_order(Pipeline_event *view_pevent, std::string &local_gtid_string, rpl_gno *event_gno, Continuation *cont); /** Store the event for future logging as a timeout occurred. This method does 2 things: 1. If not stored in the past, it stores the Pipeline event to be logged in the future 2. It queues again in the applier a fake View change log event to ensure the logging method will be invoked eventually @param[in] pevent The event to be stored @param[in] local_gtid_certified_string The local certified transaction set to wait @param[in] event_gno The transaction GTID gno @param[in] cont Used to discard or not the transaction @return the operation status @retval 0 OK @retval !=0 Error */ int store_view_event_for_delayed_logging( Pipeline_event *pevent, std::string &local_gtid_certified_string, rpl_gno event_gno, Continuation *cont); /** Logs all the delayed View Change log events stored. @param[in] cont the object used to mark error or success @return the operation status @retval 0 OK @retval LOCAL_WAIT_TIMEOUT_ERROR Timeout error on wait for local transactions @retval !=0 Error */ int log_delayed_view_change_events(Continuation *cont); }; #endif /* CERTIFICATION_HANDLER_INCLUDE */