Merge pull request #229 from chrisboulton/exceptions

Surface Redis exceptions instead of silently returning false
This commit is contained in:
Chris Boulton 2016-10-14 16:36:10 -07:00 committed by GitHub
commit 6b560798c4
5 changed files with 61 additions and 27 deletions

View File

@ -111,34 +111,38 @@ class Resque_Redis
*/ */
public function __construct($server, $database = null) public function __construct($server, $database = null)
{ {
if (is_array($server)) { try {
$this->driver = new Credis_Cluster($server); if (is_array($server)) {
} $this->driver = new Credis_Cluster($server);
else { }
else {
list($host, $port, $dsnDatabase, $user, $password, $options) = self::parseDsn($server);
// $user is not used, only $password
list($host, $port, $dsnDatabase, $user, $password, $options) = self::parseDsn($server); // Look for known Credis_Client options
// $user is not used, only $password $timeout = isset($options['timeout']) ? intval($options['timeout']) : null;
$persistent = isset($options['persistent']) ? $options['persistent'] : '';
$maxRetries = isset($options['max_connect_retries']) ? $options['max_connect_retries'] : 0;
// Look for known Credis_Client options $this->driver = new Credis_Client($host, $port, $timeout, $persistent);
$timeout = isset($options['timeout']) ? intval($options['timeout']) : null; $this->driver->setMaxConnectRetries($maxRetries);
$persistent = isset($options['persistent']) ? $options['persistent'] : ''; if ($password){
$maxRetries = isset($options['max_connect_retries']) ? $options['max_connect_retries'] : 0; $this->driver->auth($password);
}
$this->driver = new Credis_Client($host, $port, $timeout, $persistent); // If we have found a database in our DSN, use it instead of the `$database`
$this->driver->setMaxConnectRetries($maxRetries); // value passed into the constructor.
if ($password){ if ($dsnDatabase !== false) {
$this->driver->auth($password); $database = $dsnDatabase;
}
} }
// If we have found a database in our DSN, use it instead of the `$database` if ($database !== null) {
// value passed into the constructor. $this->driver->select($database);
if ($dsnDatabase !== false) {
$database = $dsnDatabase;
} }
} }
catch(CredisException $e) {
if ($database !== null) { throw new Resque_RedisException('Error communicating with Redis: ' . $e->getMessage(), 0, $e);
$this->driver->select($database);
} }
} }
@ -241,7 +245,7 @@ class Resque_Redis
return $this->driver->__call($name, $args); return $this->driver->__call($name, $args);
} }
catch (CredisException $e) { catch (CredisException $e) {
return false; throw new Resque_RedisException('Error communicating with Redis: ' . $e->getMessage(), 0, $e);
} }
} }

View File

@ -0,0 +1,12 @@
<?php
/**
* Redis related exceptions
*
* @package Resque
* @author Chris Boulton <chris@bigcommerce.com>
* @license http://www.opensource.org/licenses/mit-license.php
*/
class Resque_RedisException extends Resque_Exception
{
}
?>

View File

@ -26,6 +26,15 @@ class Resque_Tests_JobTest extends Resque_Tests_TestCase
$this->assertTrue((bool)Resque::enqueue('jobs', 'Test_Job')); $this->assertTrue((bool)Resque::enqueue('jobs', 'Test_Job'));
} }
/**
* @expectedException Resque_RedisException
*/
public function testRedisErrorThrowsExceptionOnJobCreation()
{
Resque::setBackend('redis://255.255.255.255:1234');
Resque::enqueue('jobs', 'This is a test');
}
public function testQeueuedJobCanBeReserved() public function testQeueuedJobCanBeReserved()
{ {
Resque::enqueue('jobs', 'Test_Job'); Resque::enqueue('jobs', 'Test_Job');

View File

@ -1,13 +1,21 @@
<?php <?php
/** /**
* Resque_Redis DSN tests. * Resque_Event tests.
* *
* @package Resque/Tests * @package Resque/Tests
* @author Iskandar Najmuddin <github@iskandar.co.uk> * @author Chris Boulton <chris@bigcommerce.com>
* @license http://www.opensource.org/licenses/mit-license.php * @license http://www.opensource.org/licenses/mit-license.php
*/ */
class Resque_Tests_DsnTest extends Resque_Tests_TestCase class Resque_Tests_RedisTest extends Resque_Tests_TestCase
{ {
/**
* @expectedException Resque_RedisException
*/
public function testRedisExceptionsAreSurfaced()
{
$redis = new Resque_Redis('redis://255.255.255.255:1234');
$redis->ping();
}
/** /**
* These DNS strings are considered valid. * These DNS strings are considered valid.
@ -178,5 +186,4 @@ class Resque_Tests_DsnTest extends Resque_Tests_TestCase
// The next line should throw an InvalidArgumentException // The next line should throw an InvalidArgumentException
$result = Resque_Redis::parseDsn($dsn); $result = Resque_Redis::parseDsn($dsn);
} }
} }

View File

@ -22,6 +22,8 @@ class Resque_Tests_TestCase extends PHPUnit_Framework_TestCase
preg_match('#^\s*port\s+([0-9]+)#m', $config, $matches); preg_match('#^\s*port\s+([0-9]+)#m', $config, $matches);
$this->redis = new Credis_Client('localhost', $matches[1]); $this->redis = new Credis_Client('localhost', $matches[1]);
Resque::setBackend('redis://localhost:' . $matches[1]);
// Flush redis // Flush redis
$this->redis->flushAll(); $this->redis->flushAll();
} }