Skip to content

Commit 97ad353

Browse files
committed
Fixed counting of active requests/connections/websockets
1 parent 3a0c2dc commit 97ad353

File tree

3 files changed

+39
-13
lines changed

3 files changed

+39
-13
lines changed

lib/AnyEvent/HTTP/Server.pm

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

234246
sub 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

687701
sub 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
}

lib/AnyEvent/HTTP/Server/Req.pm

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,6 @@ BEGIN {
288288
}
289289
$self->{writer}->( \undef ) if $h->{connection} eq 'close' or $self->server->{graceful};
290290
delete $self->{writer};
291-
${ $self->{reqcount} }--;
292291
}
293292
}
294293

@@ -398,7 +397,6 @@ BEGIN {
398397
$self->{writer}->( \$reply );
399398
$self->{writer}->( \undef ) if $h->{connection} eq 'close' or $self->server->{graceful};
400399
delete $self->{writer};
401-
${ $self->{reqcount} }--;
402400
}
403401
if( $self->server && $self->server->{on_reply} ) {
404402
$h->{ResponseTime} = AE::now() - $self->reqtime;
@@ -448,14 +446,18 @@ BEGIN {
448446
} );
449447

450448
${ $self->{reqcount} }--;
449+
$self->{reqcount} = undef;
451450

452451
my $create_ws = sub {
453452
my $h = shift;
454453
my $ws = AnyEvent::HTTP::Server::WS->new(
455-
%args, h => $h,
454+
%args,
455+
h => $h,
456+
server => $self->server,
456457
);
457458
weaken( $self->server->{wss}{ 0+$ws } = $ws );
458-
@$self = ();
459+
460+
%$self = ();
459461
$cb->($ws);
460462
};
461463

@@ -539,7 +541,6 @@ BEGIN {
539541
undef $self->{chunked};
540542
}
541543
elsif(defined $self->{chunked}) {
542-
${ $self->{reqcount} }--;
543544
# warn "sent body with non-chunked (wr=$self->{writer}) (".$self->connection.")\n";
544545
if( $self->{writer} ) {
545546
$self->{writer}->(\undef) if $self->connection eq 'close' or $self->server->{graceful};
@@ -572,7 +573,6 @@ BEGIN {
572573
}
573574
}
574575
elsif (defined $self->{chunked}) {
575-
${ $self->{reqcount} }--;
576576
undef $self->{chunked};
577577
}
578578
else {
@@ -624,6 +624,9 @@ BEGIN {
624624
warn "[E] finish or abort was not called for ".( $self->{chunked} ? "chunked" : "partial" )." response";
625625
$self->abort;
626626
}
627+
if ($self->{reqcount}) {
628+
${ $self->{reqcount} }--;
629+
}
627630
%$self = ();
628631
}
629632

lib/AnyEvent/HTTP/Server/WS.pm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,7 @@ sub DESTROY {
392392
});
393393
}
394394
#warn "Destroy ws $self by $caller";
395+
delete $self->{server}{wss}{ 0+$self };
395396
%$self = ();
396397
}
397398

0 commit comments

Comments
 (0)