improve dbg tagging and dbgdump, Add call to conns
[spider.git] / perl / Msg.pm
index e2092a90eeb941b06ce35a2c32f01382370a46ae..3e30372ff1111bbac4923b6837c5a01618d8d620 100644 (file)
@@ -28,7 +28,7 @@ $now = time;
 
 $cnum = 0;
 $connect_timeout = 5;
-$disc_waittime = 3;
+$disc_waittime = 1.5;
 
 our %delqueue;
 
@@ -146,7 +146,7 @@ sub _on_connect
        $sock->timeout(0);
        $sock->start;
        $conn->{peerhost} = eval { $handle->peerhost; };
-       dbg((ref $conn) . " connected $conn->{cnum} to $conn->{peerhost}:$conn->{peerport}") if isdbg('connll');
+       dbg((ref $conn) . " connected $conn->{cnum} to $conn->{peerhost}:$conn->{peerport}") if isdbg('conn') || isdbg ('connect');
        if ($conn->{on_connect}) {
                &{$conn->{on_connect}}($conn, $handle);
        }
@@ -253,17 +253,15 @@ sub disconnect
 {
        my $conn = shift;
        my $count = $conn->{disconnecting}++;
-       if ($count > 2) {
-               if (isdbg('connll')) {
-                       my ($pkg, $fn, $line) = caller;
-                       dbg((ref $conn) . "::disconnect on call $conn->{call} attempt $conn->{disconnecting} called from ${pkg}::${fn} line $line FORCING CLOSE ");
-               }
+       my $dbg = isdbg('connll');
+       my ($pkg, $fn, $line) = caller if $dbg;
+
+       if ($count >= 2) {
+               dbgtrace((ref $conn) . "::disconnect on call $conn->{call} attempt $conn->{disconnecting} called from ${pkg}::${fn} line $line FORCING CLOSE ") if $dbg;
                _close_it($conn);
+               return;
        }
-       if (isdbg('connll')) {
-               my ($pkg, $fn, $line) = caller;
-               dbg((ref $conn) . "::disconnect on call $conn->{call} attempt $conn->{disconnecting} called from ${pkg}::${fn} line $line ");
-       }
+       dbg((ref $conn) . "::disconnect on call $conn->{call} attempt $conn->{disconnecting} called from ${pkg}::${fn} line $line ") if $dbg;
        return if $count;
 
        # remove this conn from the active queue
@@ -278,32 +276,18 @@ sub disconnect
        $delqueue{$conn} = $conn; # save this connection until everything is finished
        my $sock = $conn->{sock};
        if ($sock) {
-
-               # remove me from the active list
-               my $call;
-               if ($call = $conn->{call}) {
-                       my $ref = $conns{$call};
-                       delete $conns{$call} if $ref && $ref == $conn;
+               if ($sock->{buffer}) {
+                       my $lth = length $sock->{buffer};
+                       Mojo::IOLoop->timer($disc_waittime, sub {
+                                                                       dbg("Buffer contained $lth characters, coordinated for $disc_waittime secs, now disconnecting $call") if $dbg;
+                                                                       _close_it($conn);
+                                                               });
+               } else {
+                       dbg("Buffer empty, just close $call") if $dbg;
+                       _close_it($conn);
                }
-
-               $conn->{delay} = Mojo::IOLoop->delay (
-#                               Mojo::IOLoop->delay (
-                                                                                         sub {
-                                                                                                 my $delay = shift;
-                                                                                                 dbg("before drain $call");
-                                                                                                 $sock->on(drain => $delay->begin);
-                                                                                                 1;
-                                                                                         },
-                                                                                         sub {
-                                                                                                 my $delay = shift;
-                                                                                                 _close_it($conn);
-                                                                                                 1;
-                                                                                         }
-                                                                                        );
-               $conn->{delay}->wait;
-               
        } else {
-               dbg((ref $conn) . " socket missing on $conn->{call}") if isdbg('connll');
+               dbg((ref $conn) . " socket missing on $conn->{call}") if $dbg;
                _close_it($conn);
        }
 }
@@ -361,9 +345,7 @@ sub _send_stuff
                my $lth = length $data;
                my $call = $conn->{call} || 'none';
                if (isdbg('raw')) {
-                       if (isdbg('raw')) {
-                               dbgdump('raw', "$call send $lth: ", $lth);
-                       }
+                       dbgdump('raw', "$call send $lth:", $data);
                }
                if (defined $sock) {
                        $sock->write($data);
@@ -498,9 +480,10 @@ sub new_client {
        $sock->on(read => sub {$conn->_rcv($_[1])});
        $sock->timeout(0);
        $sock->start;
-       $conn->{peerhost} = $handle->peerhost;
-       $conn->{peerport} = $handle->peerport;
-       dbg((ref $conn) . " accept $conn->{cnum} from $conn->{peerhost}:$conn->{peerport}") if isdbg('connll');
+       $conn->{peerhost} = $handle->peerhost || 'unknown';
+       $conn->{peerhost} =~ s|^::ffff:||; # chop off leading pseudo IPV6 stuff on dual stack listeners
+       $conn->{peerport} = $handle->peerport || 0;
+       dbg((ref $conn) . " accept $conn->{cnum} from $conn->{peerhost}:$conn->{peerport}") if isdbg('conn') || isdbg('connect');
        my ($rproc, $eproc) = &{$server_conn->{rproc}} ($conn, $conn->{peerhost}, $conn->{peerport});
        $conn->{sort} = 'Incoming';
        if ($eproc) {
@@ -568,8 +551,7 @@ sub DESTROY
 
        if (isdbg('connll')) {
                my ($pkg, $fn, $line) = caller;
-               dbg((ref $conn) . "::DESTROY on call $call called from ${pkg}::${fn} line $line ");
-               
+               dbgtrace((ref $conn) . "::DESTROY on call $call called from ${pkg}::${fn} line $line ");
        }
 
        my $call = $conn->{call} || 'unallocated';