r1861 - trunk/varnish-tools/regress/lib/Varnish/Test

des at projects.linpro.no des at projects.linpro.no
Mon Aug 20 08:57:03 CEST 2007


Author: des
Date: 2007-08-20 08:57:03 +0200 (Mon, 20 Aug 2007)
New Revision: 1861

Modified:
   trunk/varnish-tools/regress/lib/Varnish/Test/Engine.pm
   trunk/varnish-tools/regress/lib/Varnish/Test/Varnish.pm
Log:
Use a TCP connection for management commands, rather than std{in,out,err},
as the latter is polluted with "Child said" and similar messages.


Modified: trunk/varnish-tools/regress/lib/Varnish/Test/Engine.pm
===================================================================
--- trunk/varnish-tools/regress/lib/Varnish/Test/Engine.pm	2007-08-19 21:22:57 UTC (rev 1860)
+++ trunk/varnish-tools/regress/lib/Varnish/Test/Engine.pm	2007-08-20 06:57:03 UTC (rev 1861)
@@ -57,8 +57,9 @@
     my ($this, $controller, %config) =  @_;
     my $class = ref($this) || $this;
 
-    %config = ('server_address' => 'localhost:8081',
-	       'varnish_address' => 'localhost:8080',
+    %config = ('varnish_address' => 'localhost:8080',
+	       'server_address' => 'localhost:8081',
+	       'telnet_address' => 'localhost:8082',
 	       'varnish_name' => 'regress',
 	       'storage_spec' => 'file,regress.bin,512k',
 	       %config);

Modified: trunk/varnish-tools/regress/lib/Varnish/Test/Varnish.pm
===================================================================
--- trunk/varnish-tools/regress/lib/Varnish/Test/Varnish.pm	2007-08-19 21:22:57 UTC (rev 1860)
+++ trunk/varnish-tools/regress/lib/Varnish/Test/Varnish.pm	2007-08-20 06:57:03 UTC (rev 1861)
@@ -47,6 +47,7 @@
 
 use strict;
 
+use IO::Socket::INET;
 use Socket;
 
 sub new($$;$) {
@@ -98,7 +99,8 @@
 		    '-s', $engine->{'config'}->{'storage_spec'},
 		    '-n', $engine->{'config'}->{'varnish_name'},
 		    '-a', $engine->{'config'}->{'varnish_address'},
-		    '-b', $engine->{'config'}->{'server_address'});
+		    '-b', $engine->{'config'}->{'server_address'},
+		    '-T', $engine->{'config'}->{'telnet_address'});
 
 	print STDERR sprintf("Starting Varnish with options: %s\n", join(' ', @opts));
 
@@ -133,6 +135,21 @@
 	$self->{'mux'}->set_callback_object($self, $self->{'stdout'});
 	$self->{'mux'}->add($self->{'stderr'});
 	$self->{'mux'}->set_callback_object($self, $self->{'stderr'});
+
+	# Wait up to 0.5 seconds for Varnish to accept our connection
+	# on the management port
+	for (my $i = 0; $i < 5; ++$i) {
+	    last if $self->{'socket'} = IO::Socket::INET->
+		new(Type => SOCK_STREAM,
+		    PeerAddr => $engine->{'config'}->{'telnet_address'});
+	    select(undef, undef, undef, 0.1);
+	}
+	if (!defined($self->{'socket'})) {
+	    kill(15, delete $self->{'pid'});
+	    die "Varnish did not start\n";
+	}
+	$self->{'mux'}->add($self->{'socket'});
+	$self->{'mux'}->set_callback_object($self, $self->{'socket'});
     }
 
     return $self;
@@ -166,7 +183,8 @@
 	}
     }
     my $command = join(' ', @args);
-    $self->{'mux'}->write($self->{'stdin'}, $command . "\n");
+    $self->{'mux'}->write($self->{'socket'}, $command . "\n");
+    $self->{'mux'}->set_timeout($self->{'socket'}, 2);
     $self->{'pending'} = $command;
 }
 
@@ -211,7 +229,16 @@
 sub shutdown($) {
     my ($self) = @_;
 
-    $self->{'mux'}->shutdown(delete $self->{'stdin'}, 1);
+    $self->{'mux'}->close(delete $self->{'stdin'})
+	if $self->{'stdin'};
+    $self->{'mux'}->close(delete $self->{'stdout'})
+	if $self->{'stdout'};
+    $self->{'mux'}->close(delete $self->{'stderr'})
+	if $self->{'stderr'};
+    $self->{'mux'}->close(delete $self->{'socket'})
+	if $self->{'socket'};
+    kill(15, delete $self->{'pid'})
+	if $self->{'pid'};
 }
 
 sub kill($;$) {
@@ -229,26 +256,49 @@
 
     $self->log($$data);
 
-    if ($$data =~ /^rolling\(2\)\.\.\./m) {
-	$self->{'state'} = 'stopped';
-	$self->{'engine'}->ev_varnish_started;
+    $self->{'mux'}->set_timeout($fh, undef);
+    if ($fh == $self->{'socket'}) {
+	die "syntax error\n"
+	    unless ($$data =~ m/^([1-5][0-9][0-9]) (\d+) *$/m);
+	my ($line, $code, $len) = ($&, $1, $2);
+	if (length($$data) < length($line) + $len) {
+	    # we don't have the full response yet.
+	    $self->{'mux'}->set_timeout($fh, 2);
+	    return;
+	}
+	# extract the response text (if any), then remove from $$data
+	my $text = substr($$data, length($line), $len);
+	substr($$data, 0, length($line) + $len + 1, '');
+
+	$self->{'engine'}->ev_varnish_command_ok(delete $self->{'pending'})
+	    if ($code eq 200 and $self->{'pending'});
+
+	$self->{'engine'}->ev_varnish_command_unknown(delete $self->{'pending'})
+	    if ($code eq 300 and $self->{'pending'});
+    } else {
+	if ($$data =~ /^rolling\(2\)\.\.\./m) {
+	    $self->{'state'} = 'stopped';
+	    $self->{'engine'}->ev_varnish_started;
+	}
+	if ($$data =~ /Child starts/) {
+	    $self->{'state'} = 'started';
+	    $self->{'engine'}->ev_varnish_child_started;
+	}
+	if ($$data =~ /Child dies/) {
+	    $self->{'state'} = 'stopped';
+	    $self->{'engine'}->ev_varnish_child_stopped;
+	}
+	# XXX there might be more!
+	$$data = '';
     }
-    if ($$data =~ /Child starts/) {
-	$self->{'state'} = 'started';
-	$self->{'engine'}->ev_varnish_child_started;
-    }
-    if ($$data =~ /Child dies/) {
-	$self->{'state'} = 'stopped';
-	$self->{'engine'}->ev_varnish_child_stopped;
-    }
+}
 
-    $self->{'engine'}->ev_varnish_command_ok(delete $self->{'pending'})
-	if ($$data =~ /^200 \d+/m and $self->{'pending'});
+sub mux_timeout($$$) {
+    my ($self, $mux, $fh) = @_;
 
-    $self->{'engine'}->ev_varnish_command_unknown(delete $self->{'pending'})
-	if ($$data =~ /^300 \d+/m and $self->{'pending'});
-
-    $$data = '';
+    $self->{'mux'}->set_timeout($fh, undef);
+    $self->shutdown();
+    $self->{'engine'}->ev_varnish_timeout($self);
 }
 
 1;




More information about the varnish-commit mailing list