MySQL 9.1.0
Source Code Documentation
classic_lazy_connect.h
Go to the documentation of this file.
1/*
2 Copyright (c) 2022, 2024, Oracle and/or its affiliates.
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License, version 2.0,
6 as published by the Free Software Foundation.
7
8 This program is designed to work with certain software (including
9 but not limited to OpenSSL) that is licensed under separate terms,
10 as designated in a particular file or component or in included license
11 documentation. The authors of MySQL hereby grant you an additional
12 permission to link the program and your derivative works with the
13 separately licensed software that they have either included with
14 the program or referenced in the documentation.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24*/
25
26#ifndef ROUTING_CLASSIC_LAZY_CONNECT_INCLUDED
27#define ROUTING_CLASSIC_LAZY_CONNECT_INCLUDED
28
29#include <system_error>
30
33#include "router_require.h"
34
35/**
36 * attach a server connection and initialize it.
37 *
38 * - if a server-connection is attached to the client connection, leave.
39 * - otherwise,
40 * - if a connection can be taken from the pool, take it.
41 * - otherwise, connect to the server and authenticate.
42 * - set tracking session-vars
43 * - set the client's schema, if it differs from the server-connection's.
44 *
45 * Precondition:
46 *
47 * - the client's cleartext password must be known.
48 */
50 public:
51 /**
52 * create a lazy-connector.
53 *
54 * @param conn a connection handle
55 * @param in_handshake if true, the client connection is in Greeting or
56 * ChangeUser right now.
57 * @param on_error function that's called if an error happened.
58 * @param parent_event parent event for the tracer
59 *
60 * If "in_handshake" the LazyConnector may ask the client for a
61 * "auth-method-switch" or a "plaintext-password".
62 */
64 MysqlRoutingClassicConnectionBase *conn, bool in_handshake,
65 std::function<void(const classic_protocol::message::server::Error &err)>
66 on_error,
67 TraceEvent *parent_event)
68 : ForwardingProcessor(conn),
69 in_handshake_{in_handshake},
70 on_error_(std::move(on_error)),
71 parent_event_(parent_event) {}
72
73 enum class Stage {
74 Init,
76 Connect,
82 SetVars,
94
97
98 Done,
99 };
100
102
104 [[nodiscard]] Stage stage() const { return stage_; }
105
107 std::optional<bool> ssl;
108 std::optional<bool> x509;
109 std::optional<std::string> issuer;
110 std::optional<std::string> subject;
111 };
112
113 void failed(
114 const std::optional<classic_protocol::message::server::Error> &err) {
115 failed_ = err;
116 }
117
118 std::optional<classic_protocol::message::server::Error> failed() const {
119 return failed_;
120 }
121
122 private:
144
147
149
151
153
154 std::function<void(const classic_protocol::message::server::Error &err)>
156
157 bool retry_connect_{false}; // set on transient failure
158 bool already_fallback_{false}; // set in fallback_to_write()
159
160 // start timepoint to calculate the connect-retry-timeout.
161 std::chrono::steady_clock::time_point started_{
162 std::chrono::steady_clock::now()};
163
164 std::optional<classic_protocol::message::server::Error> failed_;
165
166 std::string trx_stmt_;
167
178};
179
180#endif
a processor base class with helper functions.
Definition: forwarding_processor.h:38
attach a server connection and initialize it.
Definition: classic_lazy_connect.h:49
stdx::expected< Processor::Result, std::error_code > fallback_to_write()
Definition: classic_lazy_connect.cc:889
stdx::expected< Processor::Result, std::error_code > authenticated()
Definition: classic_lazy_connect.cc:495
stdx::expected< Processor::Result, std::error_code > set_vars_done()
Definition: classic_lazy_connect.cc:653
void failed(const std::optional< classic_protocol::message::server::Error > &err)
Definition: classic_lazy_connect.h:113
stdx::expected< Processor::Result, std::error_code > connected()
the handshake part.
Definition: classic_lazy_connect.cc:391
stdx::expected< Processor::Result, std::error_code > set_server_option_done()
Definition: classic_lazy_connect.cc:695
stdx::expected< Processor::Result, std::error_code > process() override
Definition: classic_lazy_connect.cc:231
stdx::expected< Processor::Result, std::error_code > wait_gtid_executed()
Definition: classic_lazy_connect.cc:814
stdx::expected< Processor::Result, std::error_code > fetch_sys_vars_done()
Definition: classic_lazy_connect.cc:755
stdx::expected< Processor::Result, std::error_code > set_trx_characteristics()
Definition: classic_lazy_connect.cc:936
std::function< void(const classic_protocol::message::server::Error &err)> on_error_
Definition: classic_lazy_connect.h:155
stdx::expected< Processor::Result, std::error_code > set_schema_done()
Definition: classic_lazy_connect.cc:790
TraceEvent * trace_event_authenticate_
Definition: classic_lazy_connect.h:170
std::string trx_stmt_
Definition: classic_lazy_connect.h:166
stdx::expected< Processor::Result, std::error_code > from_stash()
Definition: classic_lazy_connect.cc:306
stdx::expected< Processor::Result, std::error_code > wait_gtid_executed_done()
Definition: classic_lazy_connect.cc:857
Stage stage_
Definition: classic_lazy_connect.h:148
stdx::expected< Processor::Result, std::error_code > pool_or_close()
Definition: classic_lazy_connect.cc:880
TraceEvent * trace_event_set_schema_
Definition: classic_lazy_connect.h:173
TraceEvent * trace_event_fallback_to_write_
Definition: classic_lazy_connect.h:176
RouterRequireFetcher::Result required_connection_attributes_fetcher_result_
Definition: classic_lazy_connect.h:152
stdx::expected< Processor::Result, std::error_code > set_schema()
Definition: classic_lazy_connect.cc:766
bool already_fallback_
Definition: classic_lazy_connect.h:158
bool retry_connect_
Definition: classic_lazy_connect.h:157
bool in_handshake_
Definition: classic_lazy_connect.h:150
stdx::expected< Processor::Result, std::error_code > fetch_sys_vars()
Definition: classic_lazy_connect.cc:713
std::optional< classic_protocol::message::server::Error > failed_
Definition: classic_lazy_connect.h:164
LazyConnector(MysqlRoutingClassicConnectionBase *conn, bool in_handshake, std::function< void(const classic_protocol::message::server::Error &err)> on_error, TraceEvent *parent_event)
create a lazy-connector.
Definition: classic_lazy_connect.h:63
TraceEvent * trace_event_wait_gtid_executed_
Definition: classic_lazy_connect.h:174
TraceEvent * trace_event_set_trx_characteristics_
Definition: classic_lazy_connect.h:177
std::chrono::steady_clock::time_point started_
Definition: classic_lazy_connect.h:161
stdx::expected< Processor::Result, std::error_code > send_auth_ok()
Definition: classic_lazy_connect.cc:1043
stdx::expected< Processor::Result, std::error_code > fetch_user_attrs_done()
Definition: classic_lazy_connect.cc:1015
TraceEvent * trace_event_set_vars_
Definition: classic_lazy_connect.h:171
TraceEvent * trace_event_fetch_sys_vars_
Definition: classic_lazy_connect.h:172
stdx::expected< Processor::Result, std::error_code > set_trx_characteristics_done()
Definition: classic_lazy_connect.cc:976
stdx::expected< Processor::Result, std::error_code > set_server_option()
Definition: classic_lazy_connect.cc:667
Stage stage() const
Definition: classic_lazy_connect.h:104
Stage
Definition: classic_lazy_connect.h:73
stdx::expected< Processor::Result, std::error_code > connect()
Definition: classic_lazy_connect.cc:364
TraceEvent * trace_event_check_read_only_
Definition: classic_lazy_connect.h:175
stdx::expected< Processor::Result, std::error_code > fetch_user_attrs()
Definition: classic_lazy_connect.cc:996
TraceEvent * parent_event_
Definition: classic_lazy_connect.h:168
TraceEvent * trace_event_connect_
Definition: classic_lazy_connect.h:169
std::optional< classic_protocol::message::server::Error > failed() const
Definition: classic_lazy_connect.h:118
void stage(Stage stage)
Definition: classic_lazy_connect.h:103
stdx::expected< Processor::Result, std::error_code > init()
Definition: classic_lazy_connect.cc:299
stdx::expected< Processor::Result, std::error_code > set_vars()
Definition: classic_lazy_connect.cc:562
Definition: classic_connection_base.h:56
Definition: expected.h:286
borrowable::message::server::Error< false > Error
Definition: classic_protocol_message.h:1411
static Value err()
Create a Value object that represents an error condition.
Definition: json_binary.cc:908
Definition: gcs_xcom_synode.h:64
Definition: classic_lazy_connect.h:106
std::optional< bool > x509
Definition: classic_lazy_connect.h:108
std::optional< std::string > subject
Definition: classic_lazy_connect.h:110
std::optional< std::string > issuer
Definition: classic_lazy_connect.h:109
std::optional< bool > ssl
Definition: classic_lazy_connect.h:107
Definition: trace_span.h:35