public void When_Primary_Is_Negative_Random_Server_Returned()
        {
            var json         = File.ReadAllText(@"Data\\Configuration\\config-with-negative-one-primary.json");
            var bucketConfig = JsonConvert.DeserializeObject <BucketConfig>(json);

            var servers = new Dictionary <IPAddress, IServer>();

            foreach (var node in bucketConfig.GetNodes())
            {
                servers.Add(node.GetIPAddress(),
                            new Server(new FakeIOStrategy(node.GetIPEndPoint(), new FakeConnectionPool(), false),
                                       node,
                                       new ClientConfiguration(), bucketConfig,
                                       new FakeTranscoder()));
            }

            var mapper = new VBucketKeyMapper(servers, bucketConfig.VBucketServerMap, bucketConfig.Rev);

            //maps to -1 primary
            const string key     = "somekey0";
            var          vBucket = (IVBucket)mapper.MapKey(key);

            Assert.AreEqual(-1, vBucket.Primary);

            var primary = vBucket.LocatePrimary();

            Assert.IsNotNull(primary);
        }
Ejemplo n.º 2
0
        public void When_Primary_Index_Is_Greater_Than_Cluster_Count_Random_Server_Returned()
        {
            var json         = File.ReadAllText(@"Data\\Configuration\\config-with-negative-one-primary.json");
            var bucketConfig = JsonConvert.DeserializeObject <BucketConfig>(json);

            var servers = new Dictionary <IPAddress, IServer>();

            foreach (var node in bucketConfig.GetNodes())
            {
                servers.Add(node.GetIPAddress(),
                            new Server(new FakeIOService(node.GetIPEndPoint(), new FakeConnectionPool(), false),
                                       node,
                                       new ClientConfiguration(), bucketConfig,
                                       new FakeTranscoder()));
            }

            //remove one server
            servers.Remove(_vBucketServerMap.IPEndPoints.Skip(1).First().Address);

            var mapper = new VBucketKeyMapper(servers, bucketConfig.VBucketServerMap, bucketConfig.Rev);

            //maps to -1 primary
            const string key     = "somekey23";
            var          vBucket = (IVBucket)mapper.MapKey(key);

            var primary = vBucket.LocatePrimary();

            Assert.IsNotNull(primary);
        }
        public void TestMapKey()
        {
            IKeyMapper mapper  = new VBucketKeyMapper(_servers, _vBucketServerMap, _bucketConfig.Rev, _bucketConfig.Name);
            var        vBucket = mapper.MapKey(Key);

            Assert.IsNotNull(vBucket);
        }
Ejemplo n.º 4
0
        internal override async Task BootstrapAsync(IClusterNode node)
        {
            try
            {
                node.Owner = this;
                await node.SelectBucket(this.Name);

                if (Context.SupportsCollections)
                {
                    Manifest = await node.GetManifest().ConfigureAwait(false);
                }

                //we still need to add a default collection
                LoadManifest();

                BucketConfig = await node.GetClusterMap().ConfigureAwait(false);

                KeyMapper = new VBucketKeyMapper(BucketConfig);

                await Context.ProcessClusterMapAsync(this, BucketConfig);
            }
            catch (Exception e)
            {
                CaptureException(e);
            }
        }
        public void LoadConfig(IOStrategy ioStrategy)
        {
            try
            {
                Lock.EnterWriteLock();
                Log.Info(m => m("o2-Creating the Servers list using rev#{0}", BucketConfig.Rev));

                var clientBucketConfig = ClientConfig.BucketConfigs[BucketConfig.Name];
                var servers            = new Dictionary <IPAddress, IServer>();
                var nodes = BucketConfig.GetNodes();
                foreach (var adapter in nodes)
                {
                    var endpoint = adapter.GetIPEndPoint(clientBucketConfig.UseSsl);
                    try
                    {
                        IServer server = null;
                        if (Equals(ioStrategy.EndPoint, endpoint) || nodes.Count() == 1)
                        {
                            server = new Core.Server(ioStrategy, adapter, ClientConfig, BucketConfig, Transcoder);
                        }
                        else
                        {
                            var poolConfig     = ClientConfig.BucketConfigs[BucketConfig.Name].PoolConfiguration;
                            var connectionPool = ConnectionPoolFactory(poolConfig, endpoint);
                            var newIoStrategy  = IOStrategyFactory(connectionPool);

                            server = new Core.Server(newIoStrategy, adapter, ClientConfig, BucketConfig, Transcoder)
                            {
                                SaslFactory = SaslFactory
                            };
                            server.CreateSaslMechanismIfNotExists();
                        }
                        servers.Add(endpoint.Address, server);
                    }
                    catch (Exception e)
                    {
                        Log.ErrorFormat("Could not add server {0}. Exception: {1}", endpoint, e);
                    }
                }

                UpdateServices(servers);

                Log.Info(m => m("Creating the KeyMapper list using rev#{0}", BucketConfig.Rev));
                var old = Interlocked.Exchange(ref Servers, servers);
                var vBucketKeyMapper = new VBucketKeyMapper(Servers, BucketConfig.VBucketServerMap, BucketConfig.Rev);
                Interlocked.Exchange(ref KeyMapper, vBucketKeyMapper);
                if (old != null)
                {
                    foreach (var server in old.Values)
                    {
                        server.Dispose();
                    }
                    old.Clear();
                }
            }
            finally
            {
                Lock.ExitWriteLock();
            }
        }
Ejemplo n.º 6
0
        public void When_BucketConfig_Has_Replicas_VBucketKeyMapper_Replicas_Are_Equal()
        {
            var json         = File.ReadAllText(@"Data\\Configuration\\config-with-replicas-complete.json");
            var bucketConfig = JsonConvert.DeserializeObject <BucketConfig>(json);

            var servers = new Dictionary <IPAddress, IServer>();

            foreach (var node in bucketConfig.GetNodes())
            {
                servers.Add(node.GetIPAddress(),
                            new Server(new FakeIOService(node.GetIPEndPoint(), new FakeConnectionPool(), false),
                                       node,
                                       new ClientConfiguration(), bucketConfig,
                                       new FakeTranscoder()));
            }

            var mapper  = new VBucketKeyMapper(servers, bucketConfig.VBucketServerMap, bucketConfig.Rev);
            var vBucket = (IVBucket)mapper.MapKey("somekey");

            var index    = mapper.GetIndex("somekey");
            var expected = bucketConfig.VBucketServerMap.VBucketMap[index];

            for (var i = 0; i < vBucket.Replicas.Length; i++)
            {
                Assert.AreEqual(vBucket.Replicas[i], expected[i + 1]);
            }
        }
Ejemplo n.º 7
0
 /// <summary>
 /// Loads the most updated configuration creating any resources as needed.
 /// </summary>
 /// <param name="bucketConfig">The latest <see cref="IBucketConfig"/>
 /// that will drive the recreation if the configuration context.</param>
 public override void LoadConfig(IBucketConfig bucketConfig)
 {
     if (bucketConfig == null)
     {
         throw new ArgumentNullException("bucketConfig");
     }
     if (BucketConfig == null || !BucketConfig.Nodes.AreEqual <Node>(bucketConfig.Nodes))
     {
         Log.Info(m => m("Creating the Servers list using rev#{0}", bucketConfig.Rev));
         var nodes = bucketConfig.Nodes;
         for (var i = 0; i < nodes.Length; i++)
         {
             var ip             = bucketConfig.VBucketServerMap.ServerList[i];
             var endpoint       = GetEndPoint(ip, bucketConfig);
             var connectionPool = ConnectionPoolFactory(ClientConfig.BucketConfigs[bucketConfig.Name].PoolConfiguration, endpoint);
             var ioStrategy     = IOStrategyFactory(connectionPool);
             var saslMechanism  = SaslFactory(bucketConfig.Name, bucketConfig.Password, ioStrategy, Converter);
             saslMechanism.IOStrategy = ioStrategy;
             var server = new Core.Server(ioStrategy, nodes[i], ClientConfig);//this should be a Func factory...a functory
             Servers.Add(server);
         }
     }
     if (BucketConfig == null || !BucketConfig.VBucketServerMap.Equals(bucketConfig.VBucketServerMap))
     {
         Log.Info(m => m("Creating the KeyMapper list using rev#{0}", bucketConfig.Rev));
         KeyMapper = new VBucketKeyMapper(Servers, bucketConfig.VBucketServerMap);
     }
     BucketConfig = bucketConfig;
 }
Ejemplo n.º 8
0
        public void When_BucketConfig_Has_Replicas_VBucketKeyMapper_LocateReplica_Returns_Correct_Server()
        {
            var json         = File.ReadAllText(@"Data\\Configuration\\config-with-replicas-complete.json");
            var bucketConfig = JsonConvert.DeserializeObject <BucketConfig>(json);

            var servers = new Dictionary <IPAddress, IServer>();

            foreach (var node in bucketConfig.GetNodes())
            {
                servers.Add(node.GetIPAddress(),
                            new Server(new FakeIOService(node.GetIPEndPoint(), new FakeConnectionPool(), false),
                                       node,
                                       new ClientConfiguration(), bucketConfig,
                                       new FakeTranscoder()));
            }

            var mapper  = new VBucketKeyMapper(servers, bucketConfig.VBucketServerMap, bucketConfig.Rev);
            var vBucket = (IVBucket)mapper.MapKey("somekey");

            foreach (var index in vBucket.Replicas)
            {
                var server = vBucket.LocateReplica(index);
                Assert.IsNotNull(server);

                var expected = bucketConfig.VBucketServerMap.ServerList[index];
                Assert.AreEqual(server.EndPoint.Address.ToString(), expected.Split(':').First());
            }
        }
        public void VBucket_HasCorrectBucketname()
        {
            var        expected = "travel-sample";
            IKeyMapper mapper   = new VBucketKeyMapper(_servers, _vBucketServerMap, _bucketConfig.Rev, expected);
            var        vBucket  = (IVBucket)mapper.MapKey(Key);

            Assert.AreEqual(expected, vBucket.BucketName);
        }
Ejemplo n.º 10
0
 public void Setup()
 {
     _key       = new string('0', KeySize);
     _keyMapper = new VBucketKeyMapper(
         new BucketConfig(),
         new VBucketServerMap(new VBucketServerMapDto(), new List <IPEndPoint>()),
         new VBucketFactory(new NullLogger <VBucket>()));
 }
        public void Test_That_Key_XXXXX_Maps_To_VBucket_389()
        {
            const int  actual  = 389;
            IKeyMapper mapper  = new VBucketKeyMapper(_servers, _vBucketServerMap, _bucketConfig.Rev, _bucketConfig.Name);
            var        vBucket = (IVBucket)mapper.MapKey(Key);

            Assert.AreEqual(vBucket.Index, actual);
        }
Ejemplo n.º 12
0
        public void TestMapKey(int index, string key)
        {
            var config = ResourceHelper.ReadResource <BucketConfig>(@"Documents\config.json");

            IKeyMapper mapper  = new VBucketKeyMapper(config, new VBucketFactory(new Mock <ILogger <VBucket> >().Object));
            var        vBucket = (VBucket)mapper.MapKey(key);

            Assert.Equal(index, vBucket.Index);
        }
Ejemplo n.º 13
0
        public void Test_That_Key_XXXXX_Maps_To_VBucket_389()
        {
            const int  actual  = 389;
            var        config  = ResourceHelper.ReadResource <BucketConfig>(@"Documents\config.json");
            IKeyMapper mapper  = new VBucketKeyMapper(config, new VBucketFactory(new Mock <ILogger <VBucket> >().Object));
            var        vBucket = (IVBucket)mapper.MapKey(Key);

            Assert.Equal(vBucket.Index, actual);
        }
        public void TestMapKey(int index, string key)
        {
            var config = ResourceHelper.ReadResource <BucketConfig>(@"Documents\config.json");

            IKeyMapper mapper  = new VBucketKeyMapper(config);
            var        vBucket = (VBucket)mapper.MapKey(key);

            Assert.Equal(index, vBucket.Index);
        }
Ejemplo n.º 15
0
        public void VBucket_HasCorrectBucketname()
        {
            var expected = "default";

            var        config  = ResourceHelper.ReadResource <BucketConfig>(@"Documents\config.json");
            IKeyMapper mapper  = new VBucketKeyMapper(config, new VBucketFactory(new Mock <ILogger <VBucket> >().Object));
            var        vBucket = (IVBucket)mapper.MapKey(Key);

            Assert.Equal(expected, vBucket.BucketName);
        }
Ejemplo n.º 16
0
        public void VBucket_Supports_LocalHost()
        {
            var expected = "default";

            var config = ResourceHelper.ReadResource <BucketConfig>(@"Documents\configs\config-localhost.json");

            config.ReplacePlaceholderWithBootstrapHost(new Uri("http://127.0.0.1"));
            IKeyMapper mapper  = new VBucketKeyMapper(config, new VBucketFactory(new Mock <ILogger <VBucket> >().Object));
            var        vBucket = (IVBucket)mapper.MapKey(Key);

            Assert.Equal(expected, vBucket.BucketName);
        }
Ejemplo n.º 17
0
        public void When_BucketConfig_Has_Replicas_VBucketKeyMapper_Replica_Count_Is_Equal()
        {
            var json         = ResourceHelper.ReadResource(@"Data\Configuration\config-with-replicas-complete.json");
            var bucketConfig = JsonConvert.DeserializeObject <BucketConfig>(json);

            var mapper  = new VBucketKeyMapper(bucketConfig, new VBucketFactory(new Mock <ILogger <VBucket> >().Object));
            var vBucket = (IVBucket)mapper.MapKey("somekey");

            const int expected = 3;

            Assert.Equal(expected, vBucket.Replicas.Count());
        }
        public void TestMapKey(int index, string key)
        {
            var config = ResourceHelper.ReadResource(@"Documents\config.json",
                                                     InternalSerializationContext.Default.BucketConfig);

            var vBucketServerMap = new VBucketServerMap(config.VBucketServerMap);

            IKeyMapper mapper = new VBucketKeyMapper(config, vBucketServerMap,
                                                     new VBucketFactory(new Mock <ILogger <VBucket> >().Object));
            var vBucket = (VBucket)mapper.MapKey(key);

            Assert.Equal(index, vBucket.Index);
        }
        public void Test_That_Key_XXXXX_Maps_To_VBucket_389()
        {
            const int actual = 389;
            var       config = ResourceHelper.ReadResource(@"Documents\config.json",
                                                           InternalSerializationContext.Default.BucketConfig);

            var vBucketServerMap = new VBucketServerMap(config.VBucketServerMap);

            IKeyMapper mapper = new VBucketKeyMapper(config, vBucketServerMap,
                                                     new VBucketFactory(new Mock <ILogger <VBucket> >().Object));
            var vBucket = (IVBucket)mapper.MapKey(Key);

            Assert.Equal(vBucket.Index, actual);
        }
        public void ReadFromReplica_WhenKeyNotFound_ReturnsKeyNotFound()
        {
            var controller = new Mock <IClusterController>();

            controller.Setup(x => x.Configuration).Returns(new ClientConfiguration());

            var server1 = new Mock <IServer>();

            server1.Setup(x => x.Send(It.IsAny <IOperation <dynamic> >())).Returns(new OperationResult <dynamic> {
                Status = ResponseStatus.KeyNotFound
            });
            server1.Setup(x => x.EndPoint).Returns(new IPEndPoint(IPAddress.Loopback, 8091));

            var server2 = new Mock <IServer>();

            server2.Setup(x => x.Send(It.IsAny <IOperation <dynamic> >())).Returns(new OperationResult <dynamic> {
                Status = ResponseStatus.KeyNotFound
            });
            server2.Setup(x => x.EndPoint).Returns(new IPEndPoint(IPAddress.Parse("255.255.0.0"), 8091));

            var vBucketServerMap = new VBucketServerMap
            {
                ServerList = new[]
                {
                    "localhost:8901",
                    "255.255.0.0:8091"
                },
                VBucketMap        = new[] { new[] { 0, 1 } },
                VBucketMapForward = new[] { new[] { 1 } }
            };
            var keyMapper = new VBucketKeyMapper(new Dictionary <IPAddress, IServer>
            {
                { IPAddress.Loopback, server1.Object },
                { IPAddress.Parse("255.255.0.0"), server2.Object }
            }, vBucketServerMap, 3, "default");

            var configInfo = new Mock <IConfigInfo>();

            configInfo.Setup(x => x.IsDataCapable).Returns(true);
            configInfo.Setup(x => x.GetKeyMapper()).Returns(keyMapper);
            configInfo.Setup(x => x.ClientConfig).Returns(new ClientConfiguration());
            var pending  = new ConcurrentDictionary <uint, IOperation>();
            var executor = new CouchbaseRequestExecuter(controller.Object, configInfo.Object, "default", pending);

            var op     = new ReplicaRead <dynamic>("thekey", null, new DefaultTranscoder(), 100);
            var result = executor.ReadFromReplica(op);

            Assert.AreEqual(ResponseStatus.KeyNotFound, result.Status);
        }
Ejemplo n.º 21
0
 internal override void ConfigUpdated(object sender, BucketConfigEventArgs e)
 {
     if (e.Config.Name == Name && (BucketConfig == null || e.Config.Rev > BucketConfig.Rev))
     {
         BucketConfig = e.Config;
         if (BucketConfig.VBucketMapChanged)
         {
             KeyMapper = new VBucketKeyMapper(BucketConfig);
         }
         if (BucketConfig.ClusterNodesChanged)
         {
             Task.Run(async() => await Context.ProcessClusterMapAsync(this, BucketConfig)).GetAwaiter().GetResult();
         }
     }
 }
        public void VBucket_HasCorrectBucketname()
        {
            var expected = "default";

            var config = ResourceHelper.ReadResource(@"Documents\config.json",
                                                     InternalSerializationContext.Default.BucketConfig);

            var vBucketServerMap = new VBucketServerMap(config.VBucketServerMap);

            IKeyMapper mapper = new VBucketKeyMapper(config, vBucketServerMap,
                                                     new VBucketFactory(new Mock <ILogger <VBucket> >().Object));
            var vBucket = (IVBucket)mapper.MapKey(Key);

            Assert.Equal(expected, vBucket.BucketName);
        }
Ejemplo n.º 23
0
        public void When_BucketConfig_Has_Replicas_VBucketKeyMapper_Replica_Count_Is_Equal()
        {
            var bucketConfig = ResourceHelper.ReadResource(@"Data\Configuration\config-with-replicas-complete.json",
                                                           InternalSerializationContext.Default.BucketConfig);

            var vBucketServerMap = GetServerMap(bucketConfig.VBucketServerMap);

            var mapper = new VBucketKeyMapper(bucketConfig, vBucketServerMap,
                                              new VBucketFactory(new Mock <ILogger <VBucket> >().Object));
            var vBucket = (IVBucket)mapper.MapKey("somekey");

            const int expected = 3;

            Assert.Equal(expected, vBucket.Replicas.Count());
        }
 internal override void ConfigUpdated(object sender, BucketConfigEventArgs e)
 {
     if (e.Config.Name == Name && e.Config.Rev > BucketConfig.Rev)
     {
         BucketConfig = e.Config;
         if (BucketConfig.VBucketMapChanged)
         {
             KeyMapper = new VBucketKeyMapper(BucketConfig);
         }
         if (BucketConfig.ClusterNodesChanged)
         {
             LoadClusterMap(BucketConfig.GetNodes()).ConfigureAwait(false).GetAwaiter().GetResult();
             Prune(BucketConfig);
         }
     }
 }
Ejemplo n.º 25
0
        public void When_BucketConfig_Has_Replicas_VBucketKeyMapper_Replicas_Are_Equal()
        {
            var json         = ResourceHelper.ReadResource(@"Data\Configuration\config-with-replicas-complete.json");
            var bucketConfig = JsonConvert.DeserializeObject <BucketConfig>(json);

            var mapper  = new VBucketKeyMapper(bucketConfig, new VBucketFactory(new Mock <ILogger <VBucket> >().Object));
            var vBucket = (IVBucket)mapper.MapKey("somekey");

            var index    = mapper.GetIndex("somekey");
            var expected = bucketConfig.VBucketServerMap.VBucketMap[index];

            for (var i = 0; i < vBucket.Replicas.Length; i++)
            {
                Assert.Equal(vBucket.Replicas[i], expected[i + 1]);
            }
        }
        public void WhenForwardMapIsAvailable_AndRevisionIsZero_OperationUsesVBucket()
        {
            var controller = new Mock <IClusterController>();

            controller.Setup(x => x.Configuration).Returns(new ClientConfiguration());

            var server1 = new Mock <IServer>();

            server1.Setup(x => x.Send(It.IsAny <IOperation <dynamic> >())).Returns(new OperationResult <dynamic>());
            server1.Setup(x => x.EndPoint).Returns(new IPEndPoint(IPAddress.Loopback, 8091));

            var server2 = new Mock <IServer>();

            server2.Setup(x => x.Send(It.IsAny <IOperation <dynamic> >())).Returns(new OperationResult <dynamic>());
            server2.Setup(x => x.EndPoint).Returns(new IPEndPoint(IPAddress.Parse("255.255.0.0"), 8091));

            var vBucketServerMap = new VBucketServerMap
            {
                ServerList = new[]
                {
                    "localhost:8901",
                    "255.255.0.0:8091"
                },
                VBucketMap        = new[] { new[] { 0 } },
                VBucketMapForward = new[] { new[] { 1 } }
            };
            var keyMapper = new VBucketKeyMapper(new Dictionary <IPAddress, IServer>
            {
                { IPAddress.Loopback, server1.Object },
                { IPAddress.Parse("255.255.0.0"), server2.Object }
            }, vBucketServerMap, 1, "default");

            var configInfo = new Mock <IConfigInfo>();

            configInfo.Setup(x => x.IsDataCapable).Returns(true);
            configInfo.Setup(x => x.GetKeyMapper()).Returns(keyMapper);
            configInfo.Setup(x => x.ClientConfig).Returns(new ClientConfiguration());
            var pending  = new ConcurrentDictionary <uint, IOperation>();
            var executor = new CouchbaseRequestExecuter(controller.Object, configInfo.Object, "default", pending);

            var op = new Get <dynamic>("thekey", null, new DefaultTranscoder(), 100);

            op.LastConfigRevisionTried = 0;
            var result = executor.SendWithRetry(op);

            Assert.AreEqual(op.VBucket.LocatePrimary().EndPoint, keyMapper.GetVBuckets().First().Value.LocatePrimary().EndPoint);
        }
Ejemplo n.º 27
0
        public void When_BucketConfig_Has_Replicas_VBucketKeyMapper_Replica_Count_Is_Equal()
        {
            var json         = File.ReadAllText(@"Data\\Configuration\\config-with-replicas-complete.json");
            var bucketConfig = JsonConvert.DeserializeObject <BucketConfig>(json);
            var servers      = bucketConfig.VBucketServerMap.
                               ServerList.
                               Select(server => new Server(ObjectFactory.CreateIOStrategy(server), new Node(), new ClientConfiguration())).
                               Cast <IServer>().
                               ToList();

            var mapper  = new VBucketKeyMapper(servers, bucketConfig.VBucketServerMap);
            var vBucket = (IVBucket)mapper.MapKey("somekey");

            const int expected = 3;

            Assert.AreEqual(expected, vBucket.Replicas.Count());
        }
        public void VBucket_Supports_LocalHost()
        {
            var expected = "default";

            var config = ResourceHelper.ReadResource(@"Documents\configs\config-localhost.json",
                                                     InternalSerializationContext.Default.BucketConfig);

            config.ReplacePlaceholderWithBootstrapHost("127.0.0.1");

            var vBucketServerMap = new VBucketServerMap(config.VBucketServerMap);

            IKeyMapper mapper = new VBucketKeyMapper(config, vBucketServerMap,
                                                     new VBucketFactory(new Mock <ILogger <VBucket> >().Object));
            var vBucket = (IVBucket)mapper.MapKey(Key);

            Assert.Equal(expected, vBucket.BucketName);
        }
Ejemplo n.º 29
0
        public void When_BucketConfig_Has_Replicas_VBucketKeyMapper_LocateReplica_Returns_Correct_Server()
        {
            var json         = ResourceHelper.ReadResource(@"Data\Configuration\config-with-replicas-complete.json");
            var bucketConfig = JsonConvert.DeserializeObject <BucketConfig>(json);

            var mapper  = new VBucketKeyMapper(bucketConfig, new VBucketFactory(new Mock <ILogger <VBucket> >().Object));
            var vBucket = (IVBucket)mapper.MapKey("somekey");

            foreach (var index in vBucket.Replicas)
            {
                var server = vBucket.LocateReplica(index);
                Assert.NotNull(server);

                var expected = bucketConfig.VBucketServerMap.ServerList[index];
                Assert.Equal(server.Address.ToString(), expected.Split(':').First());
            }
        }
Ejemplo n.º 30
0
        public void When_Primary_Is_Negative_Random_Server_Returned()
        {
            var json         = ResourceHelper.ReadResource(@"Data\Configuration\config-with-negative-one-primary.json");
            var bucketConfig = JsonConvert.DeserializeObject <BucketConfig>(json);

            var mapper = new VBucketKeyMapper(bucketConfig, new VBucketFactory(new Mock <ILogger <VBucket> >().Object));

            //maps to -1 primary
            const string key     = "somekey0";
            var          vBucket = (IVBucket)mapper.MapKey(key);

            Assert.Equal(-1, vBucket.Primary);

            var primary = vBucket.LocatePrimary();

            Assert.NotNull(primary);
        }