Parcourir la source

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.
Daniele Alessandri il y a 10 ans
Parent
commit
bd00b8cfe2

+ 1 - 1
src/Connection/Aggregate/RedisCluster.php

@@ -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();

+ 49 - 0
tests/Predis/Connection/Aggregate/RedisClusterTest.php

@@ -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