[Jifty-commit] r6951 - in jifty/trunk/lib/Jifty: .

Jifty commits jifty-commit at lists.jifty.org
Thu May 7 02:46:30 EDT 2009


Author: sunnavy
Date: Thu May  7 02:46:29 2009
New Revision: 6951

Modified:
   jifty/trunk/lib/Jifty/Script/Server.pm
   jifty/trunk/lib/Jifty/Server.pm

Log:
forked server script so we can have real restart from now on

Modified: jifty/trunk/lib/Jifty/Script/Server.pm
==============================================================================
--- jifty/trunk/lib/Jifty/Script/Server.pm	(original)
+++ jifty/trunk/lib/Jifty/Script/Server.pm	Thu May  7 02:46:29 2009
@@ -17,10 +17,10 @@
 BEGIN { $SIG{__DIE__} = $x;}
 
 
-
 use File::Path ();
 
 use constant PIDFILE => 'var/jifty-server.pid';
+use constant PARENTPIDFILE => 'var/jifty-server-parent.pid';
 
 =head1 NAME
 
@@ -67,6 +67,11 @@
 Stops the server, if it is running.  This is accomplished by reading
 the PID from C<var/jifty-server.pid>
 
+=item --restart
+
+restart the server, if it is running. This is accomplished by 
+killing the child pid, and let parent pid create a new one
+
 =item --sigready SIGNAL
 
 Sets the signal number that shouldbe sent to the server's parent
@@ -98,6 +103,7 @@
         $self->SUPER::options,
         'p|port=s'   => 'port',
         'stop'       => 'stop',
+        'restart'    => 'restart',
         'sigready=s' => 'sigready',
         'quiet'      => 'quiet',
         'dbiprof'    => 'dbiprof',
@@ -123,30 +129,57 @@
 
 sub run {
     my $self = shift;
-    $self->print_help;
-    Jifty->new();
+    if ( $self->{stop} ) {
+        $self->_stop;
+    }
+    elsif ( $self->{restart} ) {
+        $self->_stop_child;
+    }
+    else {
+        $self->_fork;
+    }
+}
 
-    if ($self->{stop}) {
-        open my $fh, '<', PIDFILE;
-        my $pid = <$fh>;
-        kill 'TERM' => $pid;
-        return;
+sub _fork {
+    my $self = shift;
+    my $pid = fork;
+
+    die 'fork failed' unless defined $pid;
+    if ($pid) {
+        open my $fh, '>', PARENTPIDFILE or die $!;
+        print $fh $$;
+        close $fh;
+
+        wait;
+        sleep 1;    # to make cpu happy
+        $self->_fork;
+    }
+    else {
+        $self->_run_server;
     }
+}
+
+sub _run_server {
+    my $self = shift;
+    $self->print_help;
+    Jifty->new();
 
     # Purge stale mason cache data
-    my $data_dir = Jifty->config->framework('Web')->{'DataDir'};
-    my $server_class = Jifty->config->framework('Web')->{'ServerClass'} || 'Jifty::Server';
+    my $data_dir     = Jifty->config->framework('Web')->{'DataDir'};
+    my $server_class = Jifty->config->framework('Web')->{'ServerClass'}
+      || 'Jifty::Server';
     die "--user option only available with Net::Server subclasses\n"
-        if $self->{user} and $server_class eq "Jifty::Server";
+      if $self->{user} and $server_class eq "Jifty::Server";
     die "--group option only available with Net::Server subclasses\n"
-        if $self->{group} and $server_class eq "Jifty::Server";
+      if $self->{group} and $server_class eq "Jifty::Server";
     die "--host option only available with Net::Server subclasses\n"
-        if $self->{host} and $server_class eq "Jifty::Server";
+      if $self->{host} and $server_class eq "Jifty::Server";
 
     Jifty::Util->require($server_class);
 
-    File::Path::rmtree(["$data_dir/cache", "$data_dir/obj"])
-          if Jifty->handler->view('Jifty::View::Mason::Handler') and -d $data_dir;
+    File::Path::rmtree( [ "$data_dir/cache", "$data_dir/obj" ] )
+      if Jifty->handler->view('Jifty::View::Mason::Handler')
+          and -d $data_dir;
 
     $SIG{TERM} = sub { exit };
     open my $fh, '>', PIDFILE or die $!;
@@ -154,16 +187,33 @@
     close $fh;
 
     Jifty->handle->dbh->{Profile} = '6/DBI::ProfileDumper'
-        if $self->{dbiprof};
+      if $self->{dbiprof};
 
     $ENV{JIFTY_SERVER_SIGREADY} ||= $self->{sigready}
-        if $self->{sigready};
+      if $self->{sigready};
     Log::Log4perl->get_logger($server_class)->less_logging(3)
-        if $self->{quiet};
-    $Jifty::SERVER = $server_class->new(port => $self->{port});
+      if $self->{quiet};
+    $Jifty::SERVER = $server_class->new( port => $self->{port} );
     my @args;
-    push @args, $_ => $self->{$_} for grep {exists $self->{$_}} qw/user group host/;
-    $Jifty::SERVER->run( @args );
+    push @args, $_ => $self->{$_}
+      for grep { exists $self->{$_} } qw/user group host/;
+    $Jifty::SERVER->run(@args);
+}
+
+sub _stop {
+    my $self = shift;
+    open my $fh, '<', PARENTPIDFILE or die $!;
+    my $pid = <$fh>;
+    kill 'TERM' => $pid;
+
+    $self->_stop_child;
+    return;
+}
+
+sub _stop_child {
+    open my $fh, '<', PIDFILE or die $!;
+    my $pid = <$fh>;
+    kill 'TERM' => $pid;
 }
 
 1;

Modified: jifty/trunk/lib/Jifty/Server.pm
==============================================================================
--- jifty/trunk/lib/Jifty/Server.pm	(original)
+++ jifty/trunk/lib/Jifty/Server.pm	Thu May  7 02:46:29 2009
@@ -145,7 +145,7 @@
 
 sub restart {
     my $self = shift;
-    local @ARGV = ( 'server' );
+    local @ARGV = ( 'server', '--restart' );
     $self->SUPER::restart;
 }
 


More information about the Jifty-commit mailing list