@@ -66,6 +66,8 @@ sub new {
6666 request => ' AnyEvent::HTTP::Server::Req' ,
6767 sockets => {},
6868 @_ ,
69+ active_requests => 0,
70+ active_connections => 0,
6971 }, $pkg ;
7072
7173 eval qq{ use $self ->{request}; 1}
@@ -227,8 +229,18 @@ sub drop {
227229 $self -> {active_connections }--;
228230 %{ $r } = () if $r ;
229231
230- ( delete $self -> {graceful } )-> ()
231- if $self -> {graceful } and $self -> {active_requests } == 0;
232+ if ($self -> {graceful } ) {
233+ if (
234+ $self -> {active_requests } == 0
235+ # and $self->{active_connections} == 0
236+ and 0+keys %{ $self -> {wss } } == 0
237+ ) {
238+ ( delete $self -> {graceful } )-> ();
239+ }
240+ else {
241+ warn " wait for $self ->{active_requests} / @{[ 0+keys %{ $self ->{wss} } ]} for graceful shutdown" ;
242+ }
243+ }
232244}
233245
234246sub req_wbuf_len {
@@ -416,7 +428,6 @@ sub incoming {
416428 reqcount => \$self -> {active_requests },
417429 server => $self ,
418430 version => $version ,
419- # guard => guard { $self->{active_requests}--; },
420431 );
421432 my @rv = $self -> {cb }-> ($req );
422433 # my @rv = $self->{cb}->( $req = bless [ $method, $uri, \%h, $write ], 'AnyEvent::HTTP::Server::Req' );
@@ -572,7 +583,11 @@ sub incoming {
572583 $req -> handle($h );
573584 $rv [1]-> ($h );
574585 $h -> {__cnn_drop_guard } = guard {
575- $self -> drop($id ) if $self ;
586+ # use postpone to unroll destruction loop
587+ # waiting for request to decrement active_resuests
588+ AE::postpone {
589+ $self -> drop($id ) if $self ;
590+ };
576591 };
577592 weaken($req );
578593 %r = ( );
@@ -681,17 +696,24 @@ sub ws_close {
681696 for (values %{ $self -> {wss } }) {
682697 $_ && $_ -> close ();
683698 }
684- warn " $self ->{active_requests} / $self ->{active_connections}" ;
685699}
686700
687701sub graceful {
688702 my $self = shift ;
689703 my $cb = pop ;
690704 delete $self -> {aws };
691705 close $_ for values %{ $self -> {fhs } };
692- if ($self -> {active_requests } == 0 or $self -> {active_connections } == 0) {
706+
707+ warn " Graceful shutdown: req=$self ->{active_requests} / cnn=$self ->{active_connections} / wss=@{[ 0+keys %{ $self ->{wss} } ]}\n " ;# if DEBUG or $self->{debug};
708+
709+ if (
710+ $self -> {active_requests } == 0
711+ # and $self->{active_connections} == 0
712+ and 0+keys %{ $self -> {wss } } == 0
713+ ) {
693714 $cb -> ();
694- } else {
715+ }
716+ else {
695717 $self -> {graceful } = $cb ;
696718 $self -> ws_close();
697719 }
0 commit comments