@@ -234,39 +234,19 @@ void MysqlRoutingClassicConnectionBase::async_recv_client(Function next) {
234
234
}
235
235
236
236
++active_work_;
237
- this ->socket_splicer ()->async_recv_client ([this , next](std::error_code ec,
238
- size_t transferred) {
239
- (void )transferred;
240
-
241
- --active_work_;
242
-
243
- if (ec == std::errc::operation_canceled) {
244
- // cancelled by:
245
- //
246
- // - request to shutdown
247
- // - timer
248
- // - read-from-client-xor-server
249
- if (recv_from_either () ==
250
- MysqlRoutingClassicConnectionBase::FromEither::RecvedFromServer) {
251
- recv_from_either (MysqlRoutingClassicConnectionBase::FromEither::None);
252
-
253
- return call_next_function (next);
254
- }
255
- } else {
256
- read_timer ().cancel ();
257
- }
237
+ this ->socket_splicer ()->async_recv_client (
238
+ [this , next](std::error_code ec, size_t transferred [[maybe_unused]]) {
239
+ --active_work_;
258
240
259
- if (ec) return recv_client_failed (ec);
241
+ if (ec != std::errc::operation_canceled) {
242
+ read_timer ().cancel ();
243
+ }
260
244
261
- if (recv_from_either () ==
262
- MysqlRoutingClassicConnectionBase::FromEither::Started) {
263
- recv_from_either (
264
- MysqlRoutingClassicConnectionBase::FromEither::RecvedFromClient);
265
- }
245
+ if (ec) return recv_client_failed (ec);
266
246
267
- return trace_and_call_function (Tracer::Event::Direction:: kClientToRouter ,
268
- " io::recv" , next);
269
- });
247
+ return trace_and_call_function (
248
+ Tracer::Event::Direction:: kClientToRouter , " io::recv" , next);
249
+ });
270
250
}
271
251
272
252
void MysqlRoutingClassicConnectionBase::async_send_server (Function next) {
@@ -302,6 +282,59 @@ void MysqlRoutingClassicConnectionBase::async_recv_server(Function next) {
302
282
}
303
283
304
284
++active_work_;
285
+
286
+ this ->socket_splicer ()->async_recv_server (
287
+ [this , next](std::error_code ec, size_t transferred [[maybe_unused]]) {
288
+ --active_work_;
289
+
290
+ if (ec) return recv_server_failed (ec);
291
+
292
+ return trace_and_call_function (
293
+ Tracer::Event::Direction::kServerToRouter , " io::recv" , next);
294
+ });
295
+ }
296
+
297
+ void MysqlRoutingClassicConnectionBase::async_recv_both (Function next) {
298
+ if (disconnect_requested ()) {
299
+ return recv_client_failed (make_error_code (std::errc::operation_canceled));
300
+ }
301
+
302
+ recv_from_either (MysqlRoutingClassicConnectionBase::FromEither::Started);
303
+
304
+ ++active_work_; // client
305
+ ++active_work_; // server
306
+
307
+ this ->socket_splicer ()->async_recv_client ([this , next](std::error_code ec,
308
+ size_t transferred
309
+ [[maybe_unused]]) {
310
+ --active_work_;
311
+
312
+ if (ec == std::errc::operation_canceled) {
313
+ // cancelled by:
314
+ //
315
+ // - request to shutdown
316
+ // - timer
317
+ // - read-from-client-xor-server
318
+ if (recv_from_either () ==
319
+ MysqlRoutingClassicConnectionBase::FromEither::RecvedFromServer) {
320
+ recv_from_either (MysqlRoutingClassicConnectionBase::FromEither::None);
321
+
322
+ return call_next_function (next);
323
+ }
324
+ }
325
+
326
+ if (ec) return recv_client_failed (ec);
327
+
328
+ if (recv_from_either () ==
329
+ MysqlRoutingClassicConnectionBase::FromEither::Started) {
330
+ recv_from_either (
331
+ MysqlRoutingClassicConnectionBase::FromEither::RecvedFromClient);
332
+ }
333
+
334
+ return trace_and_call_function (Tracer::Event::Direction::kClientToRouter ,
335
+ " io::recv" , next);
336
+ });
337
+
305
338
this ->socket_splicer ()->async_recv_server ([this , next](std::error_code ec,
306
339
size_t transferred) {
307
340
(void )transferred;
@@ -764,9 +797,7 @@ void MysqlRoutingClassicConnectionBase::loop() {
764
797
case Processor::Result::RecvFromServer:
765
798
return async_recv_server (Function::kLoop );
766
799
case Processor::Result::RecvFromBoth:
767
- async_recv_client (Function::kLoop );
768
- async_recv_server (Function::kLoop );
769
- return ;
800
+ return async_recv_both (Function::kLoop );
770
801
case Processor::Result::SendToClient:
771
802
return async_send_client (Function::kLoop );
772
803
case Processor::Result::SendToServer:
0 commit comments