Fetch cluster slots from node upon first -MOVED response.

This is a more sane default as it allows users to indicate only a few
servers of the whole cluster composition, while it previously required
a more complex configuration of the client using client options.

This feature can be disabled using the "enableAutoSlotsMap()" method.
This commit is contained in:
Daniele Alessandri
2014-07-21 12:42:26 +02:00
parent a32eaf627b
commit bd00b8cfe2
2 changed files with 50 additions and 1 deletions
+1 -1
View File
@@ -49,7 +49,7 @@ use Predis\Response\ErrorInterface as ErrorResponseInterface;
*/
class RedisCluster implements ClusterInterface, IteratorAggregate, Countable
{
private $askSlotsMap = false;
private $askSlotsMap = true;
private $defaultParameters = array();
private $pool = array();
private $slots = array();
@@ -422,6 +422,7 @@ class RedisClusterTest extends PredisTestCase
$connection2->expects($this->never())->method('writeRequest');
$cluster = new RedisCluster();
$cluster->enableAutoSlotsMap(false);
$cluster->add($connection1);
$cluster->add($connection2);
@@ -442,6 +443,7 @@ class RedisClusterTest extends PredisTestCase
$connection2->expects($this->once())->method('readResponse')->with($command);
$cluster = new RedisCluster();
$cluster->enableAutoSlotsMap(false);
$cluster->add($connection1);
$cluster->add($connection2);
@@ -501,6 +503,7 @@ class RedisClusterTest extends PredisTestCase
$factory->expects($this->never())->method('create');
$cluster = new RedisCluster($factory);
$cluster->enableAutoSlotsMap(false);
$cluster->add($connection1);
$cluster->add($connection2);
@@ -544,6 +547,7 @@ class RedisClusterTest extends PredisTestCase
->will($this->returnValue($connection3));
$cluster = new RedisCluster($factory);
$cluster->enableAutoSlotsMap(false);
$cluster->add($connection1);
$cluster->add($connection2);
@@ -577,6 +581,7 @@ class RedisClusterTest extends PredisTestCase
$factory->expects($this->never())->method('create');
$cluster = new RedisCluster($factory);
$cluster->enableAutoSlotsMap(false);
$cluster->add($connection1);
$cluster->add($connection2);
@@ -617,6 +622,7 @@ class RedisClusterTest extends PredisTestCase
->will($this->returnValue($connection3));
$cluster = new RedisCluster($factory);
$cluster->enableAutoSlotsMap(false);
$cluster->add($connection1);
$cluster->add($connection2);
@@ -667,6 +673,49 @@ class RedisClusterTest extends PredisTestCase
$this->assertSame($cluster->getConnectionBySlot('6144'), $connection1);
}
/**
* @group disconnected
*/
public function testAskSlotsMapToRedisClusterOnMovedResponseByDefault()
{
$cmdGET = Command\RawCommand::create('GET', 'node:1001');
$rspMOVED = new Response\Error('MOVED 1970 127.0.0.1:6380');
$cmdCLUSTER = Command\RawCommand::create('CLUSTER', 'SLOTS');
$rspSlotsArray = array(
array(0 , 8191, array('127.0.0.1', 6379)),
array(8192, 16383, array('127.0.0.1', 6380)),
);
$connection1 = $this->getMockConnection('tcp://127.0.0.1:6379');
$connection1->expects($this->at(2))
->method('executeCommand')
->with($cmdGET)
->will($this->returnValue($rspMOVED));
$connection1->expects($this->at(3))
->method('executeCommand')
->with($cmdCLUSTER)
->will($this->returnValue($rspSlotsArray));
$connection2 = $this->getMockConnection('tcp://127.0.0.1:6380');
$connection2->expects($this->once())
->method('executeCommand')
->with($cmdGET)
->will($this->returnValue('foobar'));
$factory = $this->getMock('Predis\Connection\Factory');
$factory->expects($this->once())
->method('create')
->with(array('host' => '127.0.0.1', 'port' => '6380'))
->will($this->returnValue($connection2));
$cluster = new RedisCluster($factory);
$cluster->add($connection1);
$this->assertSame('foobar', $cluster->executeCommand($cmdGET));
$this->assertSame(2, count($cluster));
}
/**
* @group disconnected
* @expectedException Predis\NotSupportedException