From 72e90545454c0e014318fa3c81658e035aac58c1 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Wed, 10 Jun 2009 13:00:47 +0200 Subject: applying patch to version 1.15.0 --- maintenance/gearman/gearman.inc | 104 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 maintenance/gearman/gearman.inc (limited to 'maintenance/gearman/gearman.inc') diff --git a/maintenance/gearman/gearman.inc b/maintenance/gearman/gearman.inc new file mode 100644 index 00000000..a2a4018a --- /dev/null +++ b/maintenance/gearman/gearman.inc @@ -0,0 +1,104 @@ +complete( array( 'result' => true ) ); + socket_close( $this->conn ); + + # Close some more sockets + wfGetLBFactory()->shutdown(); + global $wgMemc; + $wgMemc->disconnect_all(); + + # Find PHP + $php = readlink( '/proc/' . posix_getpid() . '/exe' ); + + # Run the worker script + $args = array( $_SERVER['PHP_SELF'], + '--wiki', $wiki, + '--fake-job', serialize( $params ) ); + $args = array_merge( $args, $GLOBALS['args'] ); + pcntl_exec( $php, $args, $_ENV ); + echo "Error running exec\n"; + } + + function run( $params ) { + if ( wfWikiID() !== $params['wiki'] ) { + $this->switchWiki( $params['wiki'], $params ); + } + return self::runNoSwitch( $params ); + } + + static function runNoSwitch( $params ) { + echo implode( ' ', $params ) . "\n"; + $title = Title::newFromText( $params['title'] ); + $mwJob = Job::factory( $params['command'], $title, $params['params'] ); + return $mwJob->run(); + } +} + +class NonScaryGearmanWorker extends Net_Gearman_Worker { + + /** + * Copied from Net_Gearman_Worker but with the scary "run any PHP file in + * the filesystem" feature removed. + */ + protected function doWork($socket) { + Net_Gearman_Connection::send($socket, 'grab_job'); + + $resp = array('function' => 'noop'); + while (count($resp) && $resp['function'] == 'noop') { + $resp = Net_Gearman_Connection::blockingRead($socket); + } + + if (in_array($resp['function'], array('noop', 'no_job'))) { + return false; + } + + if ($resp['function'] != 'job_assign') { + throw new Net_Gearman_Exception('Holy Cow! What are you doing?!'); + } + + $name = $resp['data']['func']; + $handle = $resp['data']['handle']; + $arg = array(); + + if (isset($resp['data']['arg']) && + Net_Gearman_Connection::stringLength($resp['data']['arg'])) { + $arg = json_decode($resp['data']['arg'], true); + } + + ### START MW DIFFERENT BIT + if ( $name != 'mw_job' ) { + throw new Net_Gearman_Job_Exception('Invalid function'); + } + $job = new MWGearmanJob($socket, $handle); + ### END MW DIFFERENT BIT + + try { + $this->start($handle, $name, $arg); + $res = $job->run($arg); + if (!is_array($res)) { + $res = array('result' => $res); + } + + $job->complete($res); + $this->complete($handle, $name, $res); + } catch (Net_Gearman_Job_Exception $e) { + $job->fail(); + $this->fail($handle, $name, $e); + } + + // Force the job's destructor to run + $job = null; + + return true; + } +} + -- cgit v1.2.2