فهرست منبع

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 11 سال پیش
والد
کامیت
bd00b8cfe2
2فایلهای تغییر یافته به همراه50 افزوده شده و 1 حذف شده
  1. 1 1
      src/Connection/Aggregate/RedisCluster.php
  2. 49 0
      tests/Predis/Connection/Aggregate/RedisClusterTest.php

+ 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