From: Jonathan H. <j_...@us...> - 2007-02-27 16:44:15
|
Update of /cvsroot/stack/stack-dev/server In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv30576/server Modified Files: clientSocket.php maximaSocket.php proxy.php shutdownProxy.sh startProxy.sh Added Files: restartProxy.php Log Message: Fixed timeouts. Maxima restarted on timeout to prevent DOS problems. Index: clientSocket.php =================================================================== RCS file: /cvsroot/stack/stack-dev/server/clientSocket.php,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** clientSocket.php 8 Feb 2007 09:16:20 -0000 1.1 --- clientSocket.php 27 Feb 2007 16:43:59 -0000 1.2 *************** *** 91,94 **** --- 91,95 ---- { $timeLeft = false; + echo 'Client timed out'; } --- NEW FILE: restartProxy.php --- #!/usr/bin/php <?php // maximaSocket test harness require_once('maximaSocket.php'); require_once('clientSocket.php'); require_once('../stackConfig.php'); $ip = '127.0.0.1'; //address to bind to, by default the local machine. /** * Get the ports to use from the command line * If non use the default ports */ if ($argc != 3) { echo "Ports not specified, going with defaults\n"; $port = 15000; //internal port for maxima interface $clientPort = 15001; //external port for stack-user interface } else { $port = $argv[1]; //internal port for maxima interface $clientPort = $argv[2]; //external port for stack-user interface } /** * Handles interupts, Ctrl-C etc. */ $server_run = true; $CASProcess = 0; $run = true; function sig_handler($signo) { switch ($signo) { case SIGINT: case SIGTERM: echo 'Shutting down'; // handle shutdown tasks global $CASProcess; global $server_run, $run; //Attempt clean shutdown $server_run = false; $run = false; $status = proc_get_status($CASProcess); //if clean shutdown fails, kill maxima if ($status['running']) { proc_terminate($CASProcess); } exit(0); break; case SIGHUP: // handle restart tasks global $server_run; $server_run = false; proc_terminate($CASProcess); exit(0); break; default: // handle all other signals, do nothing in our case. } } // setup signal handlers pcntl_signal(SIGTERM, "sig_handler"); pcntl_signal(SIGHUP, "sig_handler"); pcntl_signal(SIGINT, "sig_handler"); //fork off, & run maxima declare(ticks=1); $pid = pcntl_fork(); if ($pid == -1) { die("could not fork"); } else if ($pid) { //we are the parent, launch the maxima server //echo "-------Parent (PID: " .posix_getpid(). ")\n"; global $run; while($run) { global $run; $maximaConn = new maximaSocket(); global $stack_cas; global $CASProcess; //launch CAS //sleep(1); //wait 1 sec for maxima socket to be created echo 'Launching CAS'; $cmd = $stack_cas['command'].' -s '.$port; echo "cmd: $cmd"; $descriptors = array( 0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w')); $CASProcess = proc_open($cmd, $descriptors, $pipes); echo 'Running cas..'; if($CASProcess == false) { echo 'Could not start CAS process'; } else { echo 'CAS Running'; } $connected = $maximaConn->connect($ip, $port); if ($connected == false) { echo $maximaConn->getErrors(); echo 'Failed to connect to Maxima Socket'; } else { //reset maxima variables $maximaConn->initialise(); global $server_run; while($server_run) { //attempt client connection $clientConn = new clientSocket(); $connected = $clientConn->connect($ip, $clientPort); if ($connected == false) { echo $clientConn->getErrors(); echo 'Failed to connect to Client Socket'; } else { //wait for connection from client $clientConn->listen(); echo "Client Connected \n"; //read client command $clientCmd = $clientConn->read(); echo "Read client: $clientCmd \n"; //forward to Maxima $maximaConn->write($clientCmd); //read response for maxima $response = $maximaConn->read(); echo "Maxima Response: $response \n"; if ($maximaConn->timedOut()) { echo '****Maxima timed out****'; $server_run = false; } //testing $msg = 'kill(all); '.$stack_cas['initCommand']; $maximaConn->write($msg); //end test //return to client $clientConn->write($response); //close client $clientConn->close(); //reset maxima variables //$maximaConn->write('stack_reset(true); kill(trigsimp);'); } }//end main loop $maximaConn->write(chr(3).':q'); $maximaConn->quit(); $maximaConn->close(); echo 'Errors: '.$maximaConn->getErrors(); //proc_terminate($CASProcess); $status = proc_get_status($CASProcess); $kill = 'kill -9 '.$status['pid']; echo $kill; shell_exec($kill); //kill maxima, if still not shutdown echo 'Maxima shutdown. Restarting maxima:'; $server_run = true; }//maxima connection } exit(0); } else { //Interupts not working correctly without a fork. Ideally not needed. exit(0); //nothing for child to do, so end. } ?> Index: shutdownProxy.sh =================================================================== RCS file: /cvsroot/stack/stack-dev/server/shutdownProxy.sh,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** shutdownProxy.sh 8 Feb 2007 09:16:21 -0000 1.1 --- shutdownProxy.sh 27 Feb 2007 16:43:59 -0000 1.2 *************** *** 1,5 **** #!/bin/sh ! ps aux | grep proxy.php | grep -v grep | awk '{print $2}' | xargs kill echo "Maxima Servers Shutdown" --- 1,5 ---- #!/bin/sh ! ps aux | grep restartProxy.php | grep -v grep | awk '{print $2}' | xargs kill echo "Maxima Servers Shutdown" Index: maximaSocket.php =================================================================== RCS file: /cvsroot/stack/stack-dev/server/maximaSocket.php,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** maximaSocket.php 22 Feb 2007 14:07:01 -0000 1.2 --- maximaSocket.php 27 Feb 2007 16:43:59 -0000 1.3 *************** *** 18,21 **** --- 18,22 ---- private $endFound = false; //whether read completed successfully private $timeout; + private $timedOut = false; /** *************** *** 34,37 **** --- 35,39 ---- $this->timeout = $stack_cas['timeout']; + } *************** *** 109,113 **** function read() { ! $timeout = $this->timeout; $startTime = microtime(true); $time = $startTime; --- 111,116 ---- function read() { ! ! $timeout = $this->timeout; $startTime = microtime(true); $time = $startTime; *************** *** 116,128 **** $timeLeft = true; $quit = 0; - stream_set_blocking($this->conn, FALSE); stream_set_timeout($this->conn, '2'); $info = stream_get_meta_data($this->conn); ! ! ! while($endNotFound && $timeLeft && (!$info['timed_out'])) //while data to read and time taken is less than timeout { //Pause, to top CPU usage from getting too high (let maxima do some work!) --- 119,129 ---- $timeLeft = true; $quit = 0; + //set stream to no blocking, this means the fgets will not wait for character input on slow responses. This stops it from waiting potentially infinite periods of time if a ending \r\n is not sent by maxima. stream_set_blocking($this->conn, FALSE); stream_set_timeout($this->conn, '2'); $info = stream_get_meta_data($this->conn); ! while($endNotFound && $timeLeft && (!$info['timed_out']))//while data to read and time taken is less than timeout { //Pause, to top CPU usage from getting too high (let maxima do some work!) *************** *** 131,134 **** --- 132,136 ---- $toReturn .= $got; + //do need to we carry on? Timed out? $time = microtime(true); *************** *** 141,157 **** $endNotFound = false; $this->endFound = true; - } - if (($time - $startTime) > $timeout) { $timeLeft = false; } - $info = stream_get_meta_data($this->conn); } - //switch back to blocking for writes - stream_set_blocking($this->conn, TRUE); - return $toReturn; } --- 143,158 ---- $endNotFound = false; $this->endFound = true; } if (($time - $startTime) > $timeout) { $timeLeft = false; + echo 'Maxima timeout'; + $this->timedOut = true; } + + //switch back to blocking for writes + stream_set_blocking($this->conn, TRUE); } return $toReturn; } *************** *** 164,167 **** --- 165,169 ---- function write($command) { + echo "****Sending to maxima: $command **** \n"; $sent = fputs($this->conn, $command); *************** *** 187,198 **** } ! /** ! * Sends a ctrl-c interupt to maxima ! */ ! function kick() ! { ! return $this->write(chr(3)); ! } ! /** * Closes the connection and socket to maxima --- 189,193 ---- } ! /** * Closes the connection and socket to maxima *************** *** 221,224 **** --- 216,224 ---- return $this->endfound; } + + function timedOut() + { + return $this->timedOut; + } } ?> Index: startProxy.sh =================================================================== RCS file: /cvsroot/stack/stack-dev/server/startProxy.sh,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** startProxy.sh 8 Feb 2007 09:16:21 -0000 1.1 --- startProxy.sh 27 Feb 2007 16:44:00 -0000 1.2 *************** *** 6,22 **** echo "Creating Maxima Server Instances" ! nohup ./proxy.php 10000 10005 > out & sleep 2 echo "[1/5]" ! nohup ./proxy.php 10001 10006 > out & sleep 3 echo "[2/5]" ! nohup ./proxy.php 10002 10007 > out & sleep 4 echo "[3/5]" ! nohup ./proxy.php 10003 10008 > out & sleep 5 echo "[4/5]" ! nohup ./proxy.php 10004 10009 > out & sleep 3 echo "[5/5]" --- 6,22 ---- echo "Creating Maxima Server Instances" ! nohup ./restartProxy.php 10000 10005 > out & sleep 2 echo "[1/5]" ! nohup ./restartProxy.php 10001 10006 > out & sleep 3 echo "[2/5]" ! nohup ./restartProxy.php 10002 10007 > out & sleep 4 echo "[3/5]" ! nohup ./restartProxy.php 10003 10008 > out & sleep 5 echo "[4/5]" ! nohup ./restartProxy.php 10004 10009 > out & sleep 3 echo "[5/5]" Index: proxy.php =================================================================== RCS file: /cvsroot/stack/stack-dev/server/proxy.php,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** proxy.php 8 Feb 2007 09:16:20 -0000 1.1 --- proxy.php 27 Feb 2007 16:43:59 -0000 1.2 *************** *** 138,142 **** $response = $maximaConn->read(); echo "Maxima Response: $response \n"; ! //return to client $clientConn->write($response); --- 138,146 ---- $response = $maximaConn->read(); echo "Maxima Response: $response \n"; ! ! //testing ! $msg = 'kill(all); '.$stack_cas['initCommand']; ! $maximaConn->write($msg); ! //end test //return to client $clientConn->write($response); *************** *** 146,150 **** //reset maxima variables ! $maximaConn->write('stack_reset(true);'); } --- 150,156 ---- //reset maxima variables ! //$maximaConn->write('stack_reset(true); kill(trigsimp);'); ! ! } |