@@ -193,6 +193,7 @@ struct Conn<C, E> {
193
193
#[ allow( dead_code) ]
194
194
last_err : Mutex < Option < E > > ,
195
195
created_at : Instant ,
196
+ brand_new : bool ,
196
197
}
197
198
198
199
impl < C , E > Conn < C , E > {
@@ -436,35 +437,14 @@ impl<M: Manager> Pool<M> {
436
437
loop {
437
438
let timeout = delay_until ( deadline) ;
438
439
try_times += 1 ;
439
- match self
440
- . inner_get_ctx ( GetStrategy :: CachedOrNewConn , timeout)
441
- . await
442
- {
443
- Ok ( mut conn) => {
444
- if !self . 0 . config . health_check {
445
- return Ok ( conn) ;
446
- }
447
- return {
448
- let raw_conn = conn. conn . as_mut ( ) . unwrap ( ) . raw . take ( ) . unwrap ( ) ;
449
- match self . 0 . manager . check ( raw_conn) . await {
450
- Ok ( raw) => conn. conn . as_mut ( ) . unwrap ( ) . raw = Some ( raw) ,
451
- Err ( e) => {
452
- if try_times == config. max_bad_conn_retries {
453
- return Err ( Error :: Inner ( e) ) ;
454
- }
455
- continue ;
456
- }
457
- }
458
- Ok ( conn)
459
- } ;
460
- }
440
+ match self . get_ctx ( GetStrategy :: CachedOrNewConn , timeout) . await {
441
+ Ok ( conn) => return Ok ( conn) ,
461
442
Err ( Error :: BadConn ) => {
462
443
if try_times == config. max_bad_conn_retries {
463
444
let timeout = delay_until ( deadline) ;
464
- return self
465
- . inner_get_ctx ( GetStrategy :: AlwaysNewConn , timeout)
466
- . await ;
445
+ return self . get_ctx ( GetStrategy :: AlwaysNewConn , timeout) . await ;
467
446
}
447
+ continue ;
468
448
}
469
449
Err ( err) => return Err ( err) ,
470
450
}
@@ -477,46 +457,52 @@ impl<M: Manager> Pool<M> {
477
457
loop {
478
458
let never_ot = futures:: future:: pending ( ) ;
479
459
try_times += 1 ;
480
- match self
481
- . inner_get_ctx ( GetStrategy :: CachedOrNewConn , never_ot)
482
- . await
483
- {
484
- Ok ( mut conn) => {
485
- if !self . 0 . config . health_check {
486
- return Ok ( conn) ;
487
- }
488
- return {
489
- let raw_conn = conn. conn . as_mut ( ) . unwrap ( ) . raw . take ( ) . unwrap ( ) ;
490
- match self . 0 . manager . check ( raw_conn) . await {
491
- Ok ( raw) => conn. conn . as_mut ( ) . unwrap ( ) . raw = Some ( raw) ,
492
- Err ( e) => {
493
- if try_times == config. max_bad_conn_retries {
494
- return Err ( Error :: Inner ( e) ) ;
495
- }
496
- continue ;
497
- }
498
- }
499
- Ok ( conn)
500
- } ;
501
- }
460
+ match self . get_ctx ( GetStrategy :: CachedOrNewConn , never_ot) . await {
461
+ Ok ( conn) => return Ok ( conn) ,
502
462
Err ( Error :: BadConn ) => {
503
463
if try_times == config. max_bad_conn_retries {
504
464
let never_ot = futures:: future:: pending ( ) ;
505
- return self
506
- . inner_get_ctx ( GetStrategy :: AlwaysNewConn , never_ot)
507
- . await ;
465
+ return self . get_ctx ( GetStrategy :: AlwaysNewConn , never_ot) . await ;
508
466
}
467
+ continue ;
509
468
}
510
469
Err ( err) => return Err ( err) ,
511
470
}
512
471
}
513
472
}
514
473
515
- async fn inner_get_ctx (
474
+ async fn get_ctx (
516
475
& self ,
517
476
strategy : GetStrategy ,
518
477
ctx : impl Future < Output = ( ) > + Unpin ,
519
478
) -> Result < Connection < M > , Error < M :: Error > > {
479
+ let mut c = self . inner_get_ctx ( strategy, ctx) . await ?;
480
+ let mut internals = self . 0 . internals . lock ( ) . await ;
481
+ if !c. brand_new && c. expired ( internals. config . max_lifetime ) {
482
+ c. close ( & mut internals) ;
483
+ return Err ( Error :: BadConn ) ;
484
+ }
485
+
486
+ if !c. brand_new {
487
+ let raw = c. raw . take ( ) . unwrap ( ) ;
488
+ match self . 0 . manager . check ( raw) . await {
489
+ Ok ( raw) => c. raw = Some ( raw) ,
490
+ Err ( e) => return Err ( Error :: Inner ( e) ) ,
491
+ }
492
+ }
493
+
494
+ let conn = Connection {
495
+ pool : Some ( self . clone ( ) ) ,
496
+ conn : Some ( c) ,
497
+ } ;
498
+ Ok ( conn)
499
+ }
500
+
501
+ async fn inner_get_ctx (
502
+ & self ,
503
+ strategy : GetStrategy ,
504
+ ctx : impl Future < Output = ( ) > + Unpin ,
505
+ ) -> Result < Conn < M :: Connection , M :: Error > , Error < M :: Error > > {
520
506
let mut ctx = ctx. fuse ( ) ;
521
507
522
508
let mut internals = self . 0 . internals . lock ( ) . await ;
@@ -529,18 +515,7 @@ impl<M: Manager> Pool<M> {
529
515
let num_free = internals. free_conns . len ( ) ;
530
516
if strategy == GetStrategy :: CachedOrNewConn && num_free > 0 {
531
517
let c = internals. free_conns . swap_remove ( 0 ) ;
532
-
533
- if c. expired ( internals. config . max_lifetime ) {
534
- c. close ( & mut internals) ;
535
- return Err ( Error :: BadConn ) ;
536
- }
537
-
538
- drop ( internals) ;
539
- let pooled = Connection {
540
- pool : Some ( self . clone ( ) ) ,
541
- conn : Some ( c) ,
542
- } ;
543
- return Ok ( pooled) ;
518
+ return Ok ( c) ;
544
519
}
545
520
546
521
if internals. config . max_open > 0 {
@@ -564,19 +539,7 @@ impl<M: Manager> Pool<M> {
564
539
}
565
540
conn = req_recv. fuse( ) => {
566
541
let c = conn. unwrap( ) ;
567
-
568
- let mut internals = self . 0 . internals. lock( ) . await ;
569
- if c. expired( internals. config. max_lifetime) {
570
- c. close( & mut internals) ;
571
- return Err ( Error :: BadConn ) ;
572
- }
573
- let pooled = Connection {
574
- pool: Some ( self . clone( ) ) ,
575
- conn: Some ( c) ,
576
- } ;
577
- return Ok ( pooled)
578
-
579
-
542
+ return Ok ( c)
580
543
}
581
544
}
582
545
}
@@ -592,13 +555,10 @@ impl<M: Manager> Pool<M> {
592
555
raw : Some ( c) ,
593
556
last_err : Mutex :: new ( None ) ,
594
557
created_at : Instant :: now ( ) ,
595
- } ;
596
- let pooled = Connection {
597
- pool : Some ( self . clone ( ) ) ,
598
- conn : Some ( conn) ,
558
+ brand_new : true ,
599
559
} ;
600
560
601
- return Ok ( pooled ) ;
561
+ return Ok ( conn ) ;
602
562
}
603
563
Err ( e) => {
604
564
let internals = self . 0 . internals . lock ( ) . await ;
@@ -649,10 +609,11 @@ async fn open_new_connection<M: Manager>(shared: &Weak<SharedPool<M>>) {
649
609
raw : Some ( c) ,
650
610
last_err : Mutex :: new ( None ) ,
651
611
created_at : Instant :: now ( ) ,
612
+ brand_new : true ,
652
613
} ;
653
614
return put_conn ( & shared, internals, conn) . await ;
654
615
}
655
- Err ( e ) => {
616
+ Err ( _ ) => {
656
617
internals. num_open -= 1 ;
657
618
return maybe_open_new_connection ( & shared, internals) . await ;
658
619
}
@@ -662,16 +623,20 @@ async fn open_new_connection<M: Manager>(shared: &Weak<SharedPool<M>>) {
662
623
async fn put_conn < M : Manager > (
663
624
shared : & Arc < SharedPool < M > > ,
664
625
mut internals : MutexGuard < ' _ , PoolInternals < M :: Connection , M :: Error > > ,
665
- conn : Conn < M :: Connection , M :: Error > ,
626
+ mut conn : Conn < M :: Connection , M :: Error > ,
666
627
) {
667
628
if conn. raw . is_none ( ) {
629
+ conn. close ( & mut internals) ;
668
630
return maybe_open_new_connection ( shared, internals) . await ;
669
631
}
670
632
671
633
if internals. config . max_open > 0 && internals. num_open > internals. config . max_open {
634
+ conn. close ( & mut internals) ;
672
635
return ;
673
636
}
674
637
638
+ conn. brand_new = false ;
639
+
675
640
if internals. conn_requests . len ( ) > 0 {
676
641
let key = internals. conn_requests . keys ( ) . next ( ) . unwrap ( ) . clone ( ) ;
677
642
let req = internals. conn_requests . remove ( & key) . unwrap ( ) ;
@@ -794,6 +759,13 @@ pub struct Connection<M: Manager> {
794
759
conn : Option < Conn < M :: Connection , M :: Error > > ,
795
760
}
796
761
762
+ impl < M : Manager > Connection < M > {
763
+ /// Returns true is the connection is newly established.
764
+ pub fn is_brand_new ( & self ) -> bool {
765
+ self . conn . as_ref ( ) . unwrap ( ) . brand_new
766
+ }
767
+ }
768
+
797
769
impl < M : Manager > Drop for Connection < M > {
798
770
fn drop ( & mut self ) {
799
771
let pool = self . pool . take ( ) . unwrap ( ) ;
0 commit comments