MySQL 8.4.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 {
75 Connect,
81 SetVars,
93
96
97 Done,
98 };
99
101
103 [[nodiscard]] Stage stage() const { return stage_; }
104
106 std::optional<bool> ssl;
107 std::optional<bool> x509;
108 std::optional<std::string> issuer;
109 std::optional<std::string> subject;
110 };
111
112 void failed(
113 const std::optional<classic_protocol::message::server::Error> &err) {
114 failed_ = err;
115 }
116
117 std::optional<classic_protocol::message::server::Error> failed() const {
118 return failed_;
119 }
120
121 private:
142
145
147
149
151
152 std::function<void(const classic_protocol::message::server::Error &err)>
154
155 bool retry_connect_{false}; // set on transient failure
156 bool already_fallback_{false}; // set in fallback_to_write()
157
158 // start timepoint to calculate the connect-retry-timeout.
159 std::chrono::steady_clock::time_point started_{
160 std::chrono::steady_clock::now()};
161
162 std::optional<classic_protocol::message::server::Error> failed_;
163
164 std::string trx_stmt_;
165
176};
177
178#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:885
stdx::expected< Processor::Result, std::error_code > authenticated()
Definition: classic_lazy_connect.cc:479
stdx::expected< Processor::Result, std::error_code > set_vars_done()
Definition: classic_lazy_connect.cc:628
void failed(const std::optional< classic_protocol::message::server::Error > &err)
Definition: classic_lazy_connect.h:112
stdx::expected< Processor::Result, std::error_code > connected()
the handshake part.
Definition: classic_lazy_connect.cc:376
stdx::expected< Processor::Result, std::error_code > set_server_option_done()
Definition: classic_lazy_connect.cc:670
stdx::expected< Processor::Result, std::error_code > process() override
Definition: classic_lazy_connect.cc:225
stdx::expected< Processor::Result, std::error_code > wait_gtid_executed()
Definition: classic_lazy_connect.cc:790
stdx::expected< Processor::Result, std::error_code > fetch_sys_vars_done()
Definition: classic_lazy_connect.cc:731
stdx::expected< Processor::Result, std::error_code > set_trx_characteristics()
Definition: classic_lazy_connect.cc:929
std::function< void(const classic_protocol::message::server::Error &err)> on_error_
Definition: classic_lazy_connect.h:153
stdx::expected< Processor::Result, std::error_code > set_schema_done()
Definition: classic_lazy_connect.cc:766
TraceEvent * trace_event_authenticate_
Definition: classic_lazy_connect.h:168
std::string trx_stmt_
Definition: classic_lazy_connect.h:164
stdx::expected< Processor::Result, std::error_code > from_stash()
Definition: classic_lazy_connect.cc:291
stdx::expected< Processor::Result, std::error_code > wait_gtid_executed_done()
Definition: classic_lazy_connect.cc:833
Stage stage_
Definition: classic_lazy_connect.h:146
stdx::expected< Processor::Result, std::error_code > pool_or_close()
Definition: classic_lazy_connect.cc:856
TraceEvent * trace_event_set_schema_
Definition: classic_lazy_connect.h:171
TraceEvent * trace_event_fallback_to_write_
Definition: classic_lazy_connect.h:174
RouterRequireFetcher::Result required_connection_attributes_fetcher_result_
Definition: classic_lazy_connect.h:150
stdx::expected< Processor::Result, std::error_code > set_schema()
Definition: classic_lazy_connect.cc:742
bool already_fallback_
Definition: classic_lazy_connect.h:156
bool retry_connect_
Definition: classic_lazy_connect.h:155
bool in_handshake_
Definition: classic_lazy_connect.h:148
stdx::expected< Processor::Result, std::error_code > fetch_sys_vars()
Definition: classic_lazy_connect.cc:688
std::optional< classic_protocol::message::server::Error > failed_
Definition: classic_lazy_connect.h:162
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:172
TraceEvent * trace_event_set_trx_characteristics_
Definition: classic_lazy_connect.h:175
std::chrono::steady_clock::time_point started_
Definition: classic_lazy_connect.h:159
stdx::expected< Processor::Result, std::error_code > send_auth_ok()
Definition: classic_lazy_connect.cc:1036
stdx::expected< Processor::Result, std::error_code > fetch_user_attrs_done()
Definition: classic_lazy_connect.cc:1008
TraceEvent * trace_event_set_vars_
Definition: classic_lazy_connect.h:169
TraceEvent * trace_event_fetch_sys_vars_
Definition: classic_lazy_connect.h:170
stdx::expected< Processor::Result, std::error_code > set_trx_characteristics_done()
Definition: classic_lazy_connect.cc:969
stdx::expected< Processor::Result, std::error_code > set_server_option()
Definition: classic_lazy_connect.cc:642
Stage stage() const
Definition: classic_lazy_connect.h:103
Stage
Definition: classic_lazy_connect.h:73
stdx::expected< Processor::Result, std::error_code > connect()
Definition: classic_lazy_connect.cc:349
TraceEvent * trace_event_check_read_only_
Definition: classic_lazy_connect.h:173
stdx::expected< Processor::Result, std::error_code > fetch_user_attrs()
Definition: classic_lazy_connect.cc:989
TraceEvent * parent_event_
Definition: classic_lazy_connect.h:166
TraceEvent * trace_event_connect_
Definition: classic_lazy_connect.h:167
std::optional< classic_protocol::message::server::Error > failed() const
Definition: classic_lazy_connect.h:117
void stage(Stage stage)
Definition: classic_lazy_connect.h:102
stdx::expected< Processor::Result, std::error_code > set_vars()
Definition: classic_lazy_connect.cc:554
Definition: classic_connection_base.h:56
Definition: expected.h:284
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:927
Definition: gcs_xcom_synode.h:64
Definition: classic_lazy_connect.h:105
std::optional< bool > x509
Definition: classic_lazy_connect.h:107
std::optional< std::string > subject
Definition: classic_lazy_connect.h:109
std::optional< std::string > issuer
Definition: classic_lazy_connect.h:108
std::optional< bool > ssl
Definition: classic_lazy_connect.h:106
Definition: trace_span.h:35