MySQL 8.3.0
Source Code Documentation
classic_connection_base.h
Go to the documentation of this file.
1/*
2 Copyright (c) 2020, 2023, 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 also distributed 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 included with MySQL.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23*/
24
25#ifndef ROUTING_CLASSIC_CONNECTION_BASE_INCLUDED
26#define ROUTING_CLASSIC_CONNECTION_BASE_INCLUDED
27
28#include <chrono>
29#include <functional>
30#include <memory>
31#include <optional>
32#include <string>
33#include <unordered_map>
34#include <variant>
35#include <vector>
36
37#include "channel.h"
39#include "connection.h" // MySQLRoutingConnectionBase
46#include "processor.h"
47#include "sql_exec_context.h"
48#include "trace_span.h"
49#include "tracer.h"
50
51/**
52 * protocol state of a classic protocol connection.
53 */
55 public:
57
61 std::optional<classic_protocol::message::server::Greeting>
63 std::string username, //
64 std::string schema, //
65 std::string attributes)
66 : server_caps_{server_caps},
67 client_caps_{client_caps},
69 username_{std::move(username)},
70 schema_{std::move(schema)},
72
74 server_caps_ = caps;
75 }
76
78 client_caps_ = caps;
79 }
80
82 return client_caps_;
83 }
84
86 return server_caps_;
87 }
88
91 }
92
93 std::optional<classic_protocol::message::client::Greeting> client_greeting()
94 const {
95 return client_greeting_;
96 }
97
99 std::optional<classic_protocol::message::client::Greeting> msg) {
100 client_greeting_ = std::move(msg);
101 }
102
103 std::optional<classic_protocol::message::server::Greeting> server_greeting()
104 const {
105 return server_greeting_;
106 }
107
109 std::optional<classic_protocol::message::server::Greeting> msg) {
110 server_greeting_ = std::move(msg);
111 }
112
113 uint8_t &seq_id() { return seq_id_; }
114 uint8_t seq_id() const { return seq_id_; }
115
116 void seq_id(uint8_t id) { seq_id_ = id; }
117
118 struct FrameInfo {
119 uint8_t seq_id_; //!< sequence id.
120 size_t frame_size_; //!< size of the whole frame.
121 size_t forwarded_frame_size_; //!< size of the whole frame that's already
122 //!< forwarded.
123 };
124
125 std::optional<FrameInfo> &current_frame() { return current_frame_; }
126 std::optional<uint8_t> &current_msg_type() { return msg_type_; }
127
128 uint64_t columns_left{};
129 uint32_t params_left{};
130
131 [[nodiscard]] std::string auth_method_name() const {
132 return auth_method_name_;
133 }
134
135 void auth_method_name(std::string name) {
136 auth_method_name_ = std::move(name);
137 }
138
139 [[nodiscard]] std::string auth_method_data() const {
140 return auth_method_data_;
141 }
142
143 void auth_method_data(std::string data) {
144 auth_method_data_ = std::move(data);
145 }
146
147 std::string username() { return username_; }
148 void username(std::string user) { username_ = std::move(user); }
149
150 void password(std::optional<std::string> pw) { password_ = std::move(pw); }
151 const std::optional<std::string> &password() const { return password_; }
152
153 std::string schema() { return schema_; }
154 void schema(std::string s) { schema_ = std::move(s); }
155
156 // connection attributes there were received.
157 std::string attributes() { return recv_attributes_; }
158 void attributes(std::string attrs) { recv_attributes_ = std::move(attrs); }
159
160 // connection attributes that were sent.
161 std::string sent_attributes() { return sent_attributes_; }
162 void sent_attributes(std::string attrs) {
163 sent_attributes_ = std::move(attrs);
164 }
165
166 using PreparedStatements = std::unordered_map<uint32_t, PreparedStatement>;
167
169 return prepared_stmts_;
170 }
172
174 return status_flags_;
175 }
176
178 status_flags_ = val;
179 }
180
181 /**
182 * trace the events of the commands.
183 *
184 * - enabled by ROUTER SET trace = 1
185 * - disabled by ROUTER SET trace = 0, change-user or reset-connection.
186 *
187 * @retval true if 'ROUTER SET trace' is '1'
188 * @retval false if 'ROUTER SET trace' is '0'
189 */
190 bool trace_commands() const { return trace_commands_; }
191 void trace_commands(bool val) { trace_commands_ = val; }
192
193 // executed GTIDs for this connection.
194 void gtid_executed(const std::string &gtid_execed) {
195 gtid_executed_ = gtid_execed;
196 }
197 std::string gtid_executed() const { return gtid_executed_; }
198
201
204 }
207 }
208
209 enum class AccessMode {
210 ReadWrite,
211 ReadOnly,
212 };
213
214 std::optional<AccessMode> access_mode() const { return access_mode_; }
215 void access_mode(std::optional<AccessMode> v) { access_mode_ = v; }
216
217 private:
220
221 std::optional<classic_protocol::message::client::Greeting> client_greeting_{};
222 std::optional<classic_protocol::message::server::Greeting> server_greeting_{};
223
224 std::optional<FrameInfo> current_frame_{};
225 std::optional<uint8_t> msg_type_{};
226
227 uint8_t seq_id_{255}; // next use will increment to 0
228
229 std::string username_;
230 std::optional<std::string> password_;
231 std::string schema_;
232 std::string recv_attributes_;
233 std::string sent_attributes_;
234
235 std::string auth_method_name_;
236 std::string auth_method_data_;
237
239
240 // status flags of the last statement.
242
243 // if commands shall be traced.
244 bool trace_commands_{false};
245
246 std::string gtid_executed_;
247
251
252 std::optional<AccessMode> access_mode_{};
253};
254
257 public std::enable_shared_from_this<MysqlRoutingClassicConnectionBase> {
258 protected:
259 // constructor
260 //
261 // use ::create() instead.
263 MySQLRoutingContext &context, RouteDestination *route_destination,
264 std::unique_ptr<ConnectionBase> client_connection,
265 std::unique_ptr<RoutingConnectionBase> client_routing_connection,
266 std::function<void(MySQLRoutingConnectionBase *)> remove_callback)
267 : MySQLRoutingConnectionBase{context, std::move(remove_callback)},
268 route_destination_{route_destination},
271 : Destinations{}},
273 TlsSwitchableConnection{std::move(client_connection),
274 std::move(client_routing_connection),
279 read_timer_{socket_splicer()->client_conn().connection()->io_ctx()},
280 connect_timer_{socket_splicer()->client_conn().connection()->io_ctx()},
283
284 public:
285 // create a new shared_ptr<ThisClass>
286 //
287 template <typename... Args>
288 [[nodiscard]] static std::shared_ptr<MysqlRoutingClassicConnectionBase>
290 // clang-format off
291 Args &&... args) {
292 // clang-format on
293
294 // can't use make_unique<> here as the constructor is private.
295 return std::shared_ptr<MysqlRoutingClassicConnectionBase>(
296 new MysqlRoutingClassicConnectionBase(std::forward<Args>(args)...));
297 }
298
299 // get a shared-ptr that refers the same 'this'
300 std::shared_ptr<MysqlRoutingClassicConnectionBase> getptr() {
301 return shared_from_this();
302 }
303
305 std::vector<uint8_t> &error_frame, const uint8_t seq_id,
307 const uint16_t error_code, const std::string &msg,
308 const std::string &sql_state);
309
312
314 return this->socket_splicer()->source_ssl_mode();
315 }
316
318 return this->socket_splicer()->dest_ssl_mode();
319 }
320
323 }
324
325 std::string get_client_address() const override {
326 return socket_splicer()->client_conn().endpoint();
327 }
328
329 std::string get_server_address() const override {
330 return socket_splicer()->server_conn().endpoint();
331 }
332
333 void disconnect() override;
334
335 virtual void async_run() {}
336
337 void send_server_failed(std::error_code ec, bool call_finish = true);
338
339 void recv_server_failed(std::error_code ec, bool call_finish = true);
340
341 void send_client_failed(std::error_code ec, bool call_finish = true);
342
343 void recv_client_failed(std::error_code ec, bool call_finish = true);
344
345 void server_socket_failed(std::error_code ec, bool call_finish = true);
346
347 virtual void client_socket_failed(std::error_code ec,
348 bool call_finish = true);
349
350 // resume
351 //
352 // A Processor may suspend by returning Result::Suspend. When woken,
353 // typically using an async timer, the Processor calls resume() to execute
354 // the next loop() iteration. This allows waiting asynchronously for a
355 // condition other than async io.
357
358 protected:
359 enum class Function {
360 kLoop,
361
362 kFinish,
363 };
364
366 switch (next) {
368 return finish();
369
370 case Function::kLoop:
371 return loop();
372 }
373 }
374
375 private:
376 // a stack of processors
377 //
378 // take the last processor until its done.
379 //
380 // Flow -> Greeting | Command
381 // Greeting -> Connect -> Server::Greeting
382 // Server::Greeting -> Server::Greeting::Greeting |
383 // Server::Greeting::Error Server::Greeting::Error -> Error::Fatal
384 // Server::Greeting::Greeting -> Client::Greeting
385 // Client::Greeting -> TlsConnect | Server::Greeting::Response
386 // TlsConnect -> Client::Greeting::Full | Error::Fatal
387 // Client::Greeting::Full -> Server::Ok | Auth::Switch | Server::Error
388 // Auth::Switch -> ...
389 // Auth
390 // Server::Ok -> Command
391 // Command ->
392 //
393 std::vector<std::unique_ptr<BasicProcessor>> processors_;
394
395 public:
396 void push_processor(std::unique_ptr<BasicProcessor> processor) {
397 return processors_.push_back(std::move(processor));
398 }
399
400 void pop_processor() { processors_.pop_back(); }
401
403 net::const_buffer session_trackers,
405 bool ignore_some_state_changed = false);
406
407 /**
408 * reset the connection's settings to the initial-values.
409 */
410 void reset_to_initial();
411
412 private:
414 std::string_view stage, Function func);
415
416 void async_send_client(Function next);
417
418 void async_recv_client(Function next);
419
420 void async_send_server(Function next);
421
422 void async_recv_server(Function next);
423
424 void async_recv_both(Function next);
425
427
429
431
432 private:
433 // the client didn't send a Greeting before closing the connection.
434 //
435 // Generate a Greeting to be sent to the server, to ensure the router's IP
436 // isn't blocked due to the server's max_connect_errors.
438
439 // main processing loop
440 void loop();
441
442 // after a QUIT, we should wait until the client closed the connection.
443
444 // called when the connection should be closed.
445 //
446 // called multiple times (once per "active_work_").
447 void finish();
448
449 // final state.
450 //
451 // removes the connection from the connection-container.
452 virtual void done();
453
454 public:
456 return dynamic_cast<ClassicProtocolState *>(
458 }
459
461 return dynamic_cast<const ClassicProtocolState *>(
463 }
464
466 return dynamic_cast<ClassicProtocolState *>(
468 }
469
471 return dynamic_cast<const ClassicProtocolState *>(
473 }
474
476 return socket_splicer_.get();
477 }
478
480
481 std::string get_destination_id() const override {
485 }
486
487 void destination_id(const std::string &id) {
491 }
492
493 std::string read_only_destination_id() const override {
494 return ro_destination_id_;
495 }
496 void read_only_destination_id(const std::string &destination_id) {
498 }
499
500 std::string read_write_destination_id() const override {
501 return rw_destination_id_;
502 }
503 void read_write_destination_id(const std::string &destination_id) {
505 }
506
507 /**
508 * check if the connection is authenticated.
509 *
510 * 'true' after the initial handshake and change-user finished with "ok".
511 * 'false' at connection start and after change-user is started.
512 *
513 * @retval true if the connection is authenticated.
514 * @return false otherwise
515 */
516 bool authenticated() const { return authenticated_; }
517 void authenticated(bool v) { authenticated_ = v; }
518
519 /**
520 * check if connection sharing is possible.
521 *
522 * - the configuration enabled it
523 */
524 bool connection_sharing_possible() const;
525
526 /**
527 * check if connection sharing is allowed.
528 *
529 * - connection sharing is possible.
530 * - no active transaction
531 * - no SET TRANSACTION
532 */
533 bool connection_sharing_allowed() const;
534
535 /**
536 * reset the connection-sharing state.
537 *
538 * - after COM_RESET_CONNECTION::ok
539 * - after COM_CHANGE_USER::ok
540 */
542
543 /**
544 * @return a string representing the reason why sharing is blocked.
545 */
546 std::string connection_sharing_blocked_by() const;
547
548 private:
550
551 bool authenticated_{false};
552
554
555 public:
557 void client_greeting_sent(bool sent) { client_greeting_sent_ = sent; }
558
559 /**
560 * if the router is sending the initial server-greeting.
561 *
562 * if true, the router sends the initial greeting to the client,
563 * if false, the server is sending the initial greeting and router is forward
564 * it.
565 */
566 bool greeting_from_router() const {
567 return !((source_ssl_mode() == SslMode::kPassthrough) ||
570 }
571
572 /// set if the server-connection requires TLS
573 void requires_tls(bool v) { requires_tls_ = v; }
574
575 /// get if the server-connection requires TLS
576 bool requires_tls() const { return requires_tls_; }
577
578 /// set if the server-connection requires a client cert
580
581 /// get if the server-connection requires a client cert
583
585
588 }
591 }
592
595
596 void gtid_at_least_executed(const std::string &gtid) {
598 }
599 std::string gtid_at_least_executed() const { return gtid_at_least_executed_; }
600
603 }
606 }
607
610
613 }
614
617 }
618
619 std::optional<classic_protocol::session_track::TransactionCharacteristics>
622 }
623
624 std::optional<classic_protocol::session_track::TransactionState> trx_state()
625 const {
626 return trx_state_;
627 }
628
629 private:
632
633 std::unique_ptr<ProtocolSplicerBase> socket_splicer_;
634
635 std::string rw_destination_id_; // read-write destination-id
636 std::string ro_destination_id_; // read-only destination-id
637
638 /**
639 * client side handshake isn't finished yet.
640 */
641 bool in_handshake_{true};
642
643 std::optional<classic_protocol::session_track::TransactionState> trx_state_;
644 std::optional<classic_protocol::session_track::TransactionCharacteristics>
647
649
650 bool requires_tls_{true};
651
653
654 public:
657
658 private:
660
661 public:
663
664 Tracer &tracer() { return tracer_; }
665
666 private:
668
669 public:
672
673 void connect_error_code(const std::error_code &ec) { connect_ec_ = ec; }
674 std::error_code connect_error_code() const { return connect_ec_; }
675
678 }
680
681 const TraceSpan &events() const { return events_; }
682 TraceSpan &events() { return events_; }
683
684 enum class FromEither {
685 None,
686 Started,
689 };
690
692
694
695 private:
698
699 std::error_code connect_ec_{};
700
702
704
705 // events for router.trace.
707
708 // where to target the server-connections if access_mode is kAuto
709 //
710 // - Unavailable -> any destination (at connect)
711 // - ReadOnly -> a read-only destination (if available)
712 // - ReadWrite -> a read-write destination (if available)
715
716 // wait for 'gtid_at_least_executed_' with switch to a read-only destination?
718
719 // GTID to wait for. May be overwritten by client with query attributes.
721
722 // timeout for read your own writes. Setable with query attributes.
724};
725
726#endif
Kerberos Client Authentication nullptr
Definition: auth_kerberos_client_plugin.cc:250
protocol state of a classic protocol connection.
Definition: classic_connection_base.h:54
classic_protocol::capabilities::value_type server_caps_
Definition: classic_connection_base.h:218
uint8_t seq_id() const
Definition: classic_connection_base.h:114
std::string schema()
Definition: classic_connection_base.h:153
ClassicProtocolState()=default
PreparedStatements & prepared_statements()
Definition: classic_connection_base.h:171
std::chrono::seconds wait_for_my_writes_timeout_
Definition: classic_connection_base.h:249
void sent_attributes(std::string attrs)
Definition: classic_connection_base.h:162
void seq_id(uint8_t id)
Definition: classic_connection_base.h:116
std::string gtid_executed() const
Definition: classic_connection_base.h:197
std::string auth_method_name() const
Definition: classic_connection_base.h:131
void wait_for_my_writes(bool v)
Definition: classic_connection_base.h:199
void status_flags(classic_protocol::status::value_type val)
Definition: classic_connection_base.h:177
void trace_commands(bool val)
Definition: classic_connection_base.h:191
bool trace_commands_
Definition: classic_connection_base.h:244
uint8_t & seq_id()
Definition: classic_connection_base.h:113
std::unordered_map< uint32_t, PreparedStatement > PreparedStatements
Definition: classic_connection_base.h:166
bool wait_for_my_writes_
Definition: classic_connection_base.h:248
std::optional< classic_protocol::message::server::Greeting > server_greeting() const
Definition: classic_connection_base.h:103
void server_capabilities(classic_protocol::capabilities::value_type caps)
Definition: classic_connection_base.h:73
std::string auth_method_data() const
Definition: classic_connection_base.h:139
std::chrono::seconds wait_for_my_writes_timeout() const
Definition: classic_connection_base.h:202
const std::optional< std::string > & password() const
Definition: classic_connection_base.h:151
bool wait_for_my_writes() const
Definition: classic_connection_base.h:200
void password(std::optional< std::string > pw)
Definition: classic_connection_base.h:150
std::string sent_attributes()
Definition: classic_connection_base.h:161
std::string auth_method_name_
Definition: classic_connection_base.h:235
void client_greeting(std::optional< classic_protocol::message::client::Greeting > msg)
Definition: classic_connection_base.h:98
void server_greeting(std::optional< classic_protocol::message::server::Greeting > msg)
Definition: classic_connection_base.h:108
std::string sent_attributes_
Definition: classic_connection_base.h:233
std::optional< FrameInfo > & current_frame()
Definition: classic_connection_base.h:125
std::optional< uint8_t > msg_type_
Definition: classic_connection_base.h:225
std::string gtid_executed_
Definition: classic_connection_base.h:246
std::optional< uint8_t > & current_msg_type()
Definition: classic_connection_base.h:126
classic_protocol::capabilities::value_type client_caps_
Definition: classic_connection_base.h:219
uint8_t seq_id_
Definition: classic_connection_base.h:227
void client_capabilities(classic_protocol::capabilities::value_type caps)
Definition: classic_connection_base.h:77
uint64_t columns_left
Definition: classic_connection_base.h:128
void schema(std::string s)
Definition: classic_connection_base.h:154
std::optional< AccessMode > access_mode_
Definition: classic_connection_base.h:252
std::optional< classic_protocol::message::server::Greeting > server_greeting_
Definition: classic_connection_base.h:222
std::string username_
Definition: classic_connection_base.h:229
void auth_method_name(std::string name)
Definition: classic_connection_base.h:135
void attributes(std::string attrs)
Definition: classic_connection_base.h:158
classic_protocol::status::value_type status_flags() const
Definition: classic_connection_base.h:173
std::optional< AccessMode > access_mode() const
Definition: classic_connection_base.h:214
std::optional< FrameInfo > current_frame_
Definition: classic_connection_base.h:224
ClassicProtocolState(classic_protocol::capabilities::value_type server_caps, classic_protocol::capabilities::value_type client_caps, std::optional< classic_protocol::message::server::Greeting > server_greeting, std::string username, std::string schema, std::string attributes)
Definition: classic_connection_base.h:58
void gtid_executed(const std::string &gtid_execed)
Definition: classic_connection_base.h:194
classic_protocol::capabilities::value_type client_capabilities() const
Definition: classic_connection_base.h:81
uint32_t params_left
Definition: classic_connection_base.h:129
bool trace_commands() const
trace the events of the commands.
Definition: classic_connection_base.h:190
classic_protocol::status::value_type status_flags_
Definition: classic_connection_base.h:241
void auth_method_data(std::string data)
Definition: classic_connection_base.h:143
std::optional< classic_protocol::message::client::Greeting > client_greeting() const
Definition: classic_connection_base.h:93
std::string auth_method_data_
Definition: classic_connection_base.h:236
PreparedStatements prepared_stmts_
Definition: classic_connection_base.h:238
std::optional< classic_protocol::message::client::Greeting > client_greeting_
Definition: classic_connection_base.h:221
std::string recv_attributes_
Definition: classic_connection_base.h:232
AccessMode
Definition: classic_connection_base.h:209
classic_protocol::capabilities::value_type server_capabilities() const
Definition: classic_connection_base.h:85
void username(std::string user)
Definition: classic_connection_base.h:148
void access_mode(std::optional< AccessMode > v)
Definition: classic_connection_base.h:215
std::string username()
Definition: classic_connection_base.h:147
std::optional< std::string > password_
Definition: classic_connection_base.h:230
const PreparedStatements & prepared_statements() const
Definition: classic_connection_base.h:168
void wait_for_my_writes_timeout(std::chrono::seconds timeout)
Definition: classic_connection_base.h:205
std::string attributes()
Definition: classic_connection_base.h:157
classic_protocol::capabilities::value_type shared_capabilities() const
Definition: classic_connection_base.h:89
std::string schema_
Definition: classic_connection_base.h:231
A forward iterable container of destinations.
Definition: destination.h:106
execution context for SQL.
Definition: sql_exec_context.h:42
Definition: connection.h:42
MySQLRoutingContext & context()
Definition: connection.h:51
MySQLRoutingContext holds data used by MySQLRouting (1 per plugin instances) and MySQLRoutingConnecti...
Definition: context.h:58
Definition: classic_connection_base.h:257
std::chrono::seconds wait_for_my_writes_timeout() const
Definition: classic_connection_base.h:601
std::optional< classic_protocol::session_track::TransactionCharacteristics > trx_characteristics_
Definition: classic_connection_base.h:645
bool wait_for_my_writes_
Definition: classic_connection_base.h:717
bool authenticated_
Definition: classic_connection_base.h:551
RouteDestination * destinations()
Definition: classic_connection_base.h:608
void destination_id(const std::string &id)
Definition: classic_connection_base.h:487
mysqlrouter::ServerMode expected_server_mode_
Definition: classic_connection_base.h:713
void requires_client_cert(bool v)
set if the server-connection requires a client cert
Definition: classic_connection_base.h:579
std::optional< classic_protocol::session_track::TransactionCharacteristics > trx_characteristics() const
Definition: classic_connection_base.h:620
void reset_to_initial()
reset the connection's settings to the initial-values.
Definition: classic_connection_base.cc:987
TraceSpan events_
Definition: classic_connection_base.h:706
bool connection_sharing_possible() const
check if connection sharing is possible.
Definition: classic_connection_base.cc:831
bool authenticated() const
check if the connection is authenticated.
Definition: classic_connection_base.h:516
bool collation_connection_maybe_dirty_
Definition: classic_connection_base.h:648
bool requires_client_cert_
Definition: classic_connection_base.h:652
void on_handshake_received()
Definition: classic_connection_base.cc:93
void recv_server_failed(std::error_code ec, bool call_finish=true)
Definition: classic_connection_base.cc:132
Destinations destinations_
Definition: classic_connection_base.h:631
std::optional< classic_protocol::session_track::TransactionState > trx_state() const
Definition: classic_connection_base.h:624
void pop_processor()
Definition: classic_connection_base.h:400
void async_recv_server(Function next)
Definition: classic_connection_base.cc:279
virtual void async_run()
Definition: classic_connection_base.h:335
ExecutionContext exec_ctx_
Definition: classic_connection_base.h:659
ClassicProtocolState * server_protocol()
Definition: classic_connection_base.h:465
void wait_for_my_writes(bool v)
Definition: classic_connection_base.h:593
net::steady_timer connect_timer_
Definition: classic_connection_base.h:697
static stdx::expected< size_t, std::error_code > encode_error_packet(std::vector< uint8_t > &error_frame, const uint8_t seq_id, const classic_protocol::capabilities::value_type caps, const uint16_t error_code, const std::string &msg, const std::string &sql_state)
Definition: classic_connection_base.cc:55
void server_socket_failed(std::error_code ec, bool call_finish=true)
Definition: classic_connection_base.cc:159
void call_next_function(Function next)
Definition: classic_connection_base.h:365
void client_greeting_sent(bool sent)
Definition: classic_connection_base.h:557
bool diagnostic_area_changed_
Definition: classic_connection_base.h:701
void collation_connection_maybe_dirty(bool val)
Definition: classic_connection_base.h:611
std::unique_ptr< ProtocolSplicerBase > socket_splicer_
Definition: classic_connection_base.h:633
void authenticated(bool v)
Definition: classic_connection_base.h:517
const ProtocolSplicerBase * socket_splicer() const
Definition: classic_connection_base.h:475
const ClassicProtocolState * client_protocol() const
Definition: classic_connection_base.h:460
net::steady_timer & connect_timer()
Definition: classic_connection_base.h:671
void send_client_failed(std::error_code ec, bool call_finish=true)
Definition: classic_connection_base.cc:141
bool connection_sharing_allowed() const
check if connection sharing is allowed.
Definition: classic_connection_base.cc:942
bool requires_tls() const
get if the server-connection requires TLS
Definition: classic_connection_base.h:576
SslMode source_ssl_mode() const
Definition: classic_connection_base.h:313
bool client_greeting_sent() const
Definition: classic_connection_base.h:556
void async_send_server(Function next)
Definition: classic_connection_base.cc:252
stdx::expected< void, std::error_code > track_session_changes(net::const_buffer session_trackers, classic_protocol::capabilities::value_type caps, bool ignore_some_state_changed=false)
Definition: classic_connection_base.cc:474
void trace_and_call_function(Tracer::Event::Direction dir, std::string_view stage, Function func)
Definition: classic_connection_base.cc:781
std::string connection_sharing_blocked_by() const
Definition: classic_connection_base.cc:949
std::string read_only_destination_id() const override
Definition: classic_connection_base.h:493
std::string ro_destination_id_
Definition: classic_connection_base.h:636
virtual void client_socket_failed(std::error_code ec, bool call_finish=true)
Definition: classic_connection_base.cc:176
void read_write_destination_id(const std::string &destination_id)
Definition: classic_connection_base.h:503
void connect_error_code(const std::error_code &ec)
Definition: classic_connection_base.h:673
std::optional< classic_protocol::session_track::TransactionState > trx_state_
Definition: classic_connection_base.h:643
void async_send_client(Function next)
Definition: classic_connection_base.cc:204
void on_handshake_aborted()
Definition: classic_connection_base.cc:106
std::shared_ptr< MysqlRoutingClassicConnectionBase > getptr()
Definition: classic_connection_base.h:300
void disconnect() override
Definition: classic_connection_base.cc:390
Destinations & current_destinations()
Definition: classic_connection_base.h:609
bool some_state_changed_
Definition: classic_connection_base.h:646
bool requires_tls_
Definition: classic_connection_base.h:650
int active_work_
Definition: classic_connection_base.h:549
std::string rw_destination_id_
Definition: classic_connection_base.h:635
void gtid_at_least_executed(const std::string &gtid)
Definition: classic_connection_base.h:596
TraceSpan & events()
Definition: classic_connection_base.h:682
static std::shared_ptr< MysqlRoutingClassicConnectionBase > create(Args &&... args)
Definition: classic_connection_base.h:289
void requires_tls(bool v)
set if the server-connection requires TLS
Definition: classic_connection_base.h:573
SslMode dest_ssl_mode() const
Definition: classic_connection_base.h:317
void async_recv_client(Function next)
Definition: classic_connection_base.cc:231
void connection_sharing_allowed_reset()
reset the connection-sharing state.
Definition: classic_connection_base.cc:981
void send_server_failed(std::error_code ec, bool call_finish=true)
Definition: classic_connection_base.cc:123
void some_state_changed(bool v)
Definition: classic_connection_base.h:584
bool requires_client_cert() const
get if the server-connection requires a client cert
Definition: classic_connection_base.h:582
void server_side_client_greeting()
Definition: classic_connection_base.cc:412
void async_wait_send_server(Function next)
Definition: classic_connection_base.cc:371
ProtocolSplicerBase * socket_splicer()
Definition: classic_connection_base.h:479
FromEither
Definition: classic_connection_base.h:684
void expected_server_mode(mysqlrouter::ServerMode v)
Definition: classic_connection_base.h:586
std::vector< std::unique_ptr< BasicProcessor > > processors_
Definition: classic_connection_base.h:393
RouteDestination * route_destination_
Definition: classic_connection_base.h:630
FromEither recv_from_either_
Definition: classic_connection_base.h:703
ClassicProtocolState * client_protocol()
Definition: classic_connection_base.h:455
void push_processor(std::unique_ptr< BasicProcessor > processor)
Definition: classic_connection_base.h:396
FromEither recv_from_either() const
Definition: classic_connection_base.h:693
std::string gtid_at_least_executed_
Definition: classic_connection_base.h:720
bool in_handshake_
client side handshake isn't finished yet.
Definition: classic_connection_base.h:641
std::error_code connect_ec_
Definition: classic_connection_base.h:699
ExecutionContext & execution_context()
Definition: classic_connection_base.h:655
net::impl::socket::native_handle_type get_client_fd() const override
Definition: classic_connection_base.h:321
net::steady_timer & read_timer()
Definition: classic_connection_base.h:670
void read_only_destination_id(const std::string &destination_id)
Definition: classic_connection_base.h:496
const TraceSpan & events() const
Definition: classic_connection_base.h:681
std::string get_client_address() const override
Returns address of client which connected to router.
Definition: classic_connection_base.h:325
void async_recv_both(Function next)
Definition: classic_connection_base.cc:297
void loop()
Definition: classic_connection_base.cc:791
void recv_from_either(FromEither v)
Definition: classic_connection_base.h:691
std::string get_destination_id() const override
Definition: classic_connection_base.h:481
bool wait_for_my_writes() const
Definition: classic_connection_base.h:594
std::chrono::seconds wait_for_my_writes_timeout_
Definition: classic_connection_base.h:723
bool client_greeting_sent_
Definition: classic_connection_base.h:553
virtual void done()
Definition: classic_connection_base.cc:471
void resume()
Definition: classic_connection_base.h:356
std::string get_server_address() const override
Returns address of server to which connection is established.
Definition: classic_connection_base.h:329
net::steady_timer read_timer_
Definition: classic_connection_base.h:696
Tracer tracer_
Definition: classic_connection_base.h:667
void recv_client_failed(std::error_code ec, bool call_finish=true)
Definition: classic_connection_base.cc:150
void finish()
Definition: classic_connection_base.cc:426
void diagnostic_area_changed(bool diagnostic_area_changed)
Definition: classic_connection_base.h:676
Function
Definition: classic_connection_base.h:359
const ExecutionContext & execution_context() const
Definition: classic_connection_base.h:656
std::string read_write_destination_id() const override
Definition: classic_connection_base.h:500
bool greeting_from_router() const
if the router is sending the initial server-greeting.
Definition: classic_connection_base.h:566
mysqlrouter::ServerMode expected_server_mode() const
Definition: classic_connection_base.h:589
const ClassicProtocolState * server_protocol() const
Definition: classic_connection_base.h:470
Tracer & tracer()
Definition: classic_connection_base.h:664
void trace(Tracer::Event e)
Definition: classic_connection_base.h:662
MysqlRoutingClassicConnectionBase(MySQLRoutingContext &context, RouteDestination *route_destination, std::unique_ptr< ConnectionBase > client_connection, std::unique_ptr< RoutingConnectionBase > client_routing_connection, std::function< void(MySQLRoutingConnectionBase *)> remove_callback)
Definition: classic_connection_base.h:262
bool diagnostic_area_changed() const
Definition: classic_connection_base.h:679
void wait_for_my_writes_timeout(std::chrono::seconds timeout)
Definition: classic_connection_base.h:604
std::error_code connect_error_code() const
Definition: classic_connection_base.h:674
std::string gtid_at_least_executed() const
Definition: classic_connection_base.h:599
bool collation_connection_maybe_dirty() const
Definition: classic_connection_base.h:615
splices two connections together.
Definition: basic_protocol_splicer.h:481
TlsSwitchableConnection & client_conn()
Definition: basic_protocol_splicer.h:518
SslMode dest_ssl_mode() const
Definition: basic_protocol_splicer.h:534
SslMode source_ssl_mode() const
Definition: basic_protocol_splicer.h:530
TlsSwitchableConnection & server_conn()
Definition: basic_protocol_splicer.h:524
Definition: basic_protocol_splicer.h:290
Manage destinations for a Connection Routing.
Definition: destination.h:187
a Connection that can be switched to TLS.
Definition: basic_protocol_splicer.h:305
std::string endpoint() const
Definition: basic_protocol_splicer.h:424
net::impl::socket::native_handle_type native_handle() const
Definition: basic_protocol_splicer.h:405
ProtocolStateBase * protocol()
Definition: basic_protocol_splicer.h:446
Events of a command.
Definition: trace_span.h:76
Definition: tracer.h:60
Direction
Definition: tracer.h:72
traces the timestamps of events in a stderr log.
Definition: tracer.h:48
void trace(Event e)
Definition: tracer.h:127
Definition: timer.h:56
Definition: buffer.h:134
char * user
Definition: mysqladmin.cc:64
std::bitset< 32 > value_type
Definition: classic_protocol_constants.h:72
std::bitset< 16 > value_type
Definition: classic_protocol_constants.h:167
std::string dir
Double write files location.
Definition: buf0dblwr.cc:76
static bool timeout(bool(*wait_condition)())
Timeout function.
Definition: log0meb.cc:497
Unique_ptr< T, std::nullptr_t > make_unique(size_t size)
In-place constructs a new unique pointer with no specific allocator and with array type T.
ServerMode
Definition: datatypes.h:54
int native_handle_type
Definition: socket_constants.h:50
constexpr const std::chrono::seconds kDefaultWaitForMyWritesTimeout
Default Wait For My Writes timeout.
Definition: routing.h:130
constexpr const bool kDefaultWaitForMyWrites
Default Wait For My Writes timeout.
Definition: routing.h:125
Definition: varlen_sort.h:174
SslMode
Definition: ssl_mode.h:28
@ kPassthrough
case opt name
Definition: sslopt-case.h:32
Definition: classic_connection_base.h:118
size_t forwarded_frame_size_
size of the whole frame that's already forwarded.
Definition: classic_connection_base.h:121
size_t frame_size_
size of the whole frame.
Definition: classic_connection_base.h:120
uint8_t seq_id_
sequence id.
Definition: classic_connection_base.h:119
double seconds()
Definition: task.cc:309
unsigned long id[MAX_DEAD]
Definition: xcom_base.cc:509