public void Test_Hash_Ring()
        {
            var servers = new Dictionary <string, int>
            {
                { "192.168.1.101", 11210 },
                { "192.168.1.102", 11210 },
                { "192.168.1.103", 11210 },
                { "192.168.1.104", 11210 }
            }
            .Select(x =>
            {
                var ipAddress = new IPEndPoint(IPAddress.Parse(x.Key), x.Value);
                var server    = new Mock <IServer>();
                server.Setup(y => y.EndPoint).Returns(ipAddress);
                server.Setup(y => y.IsDataNode).Returns(true);

                return(new { ipAddress, server });
            }).ToDictionary(x => x.ipAddress, y => y.server.Object);

            var keyMapper = new KetamaKeyMapper(servers);

            var json           = ResourceHelper.ReadResource(@"Data\ketama-ring-hashes.json");
            var expectedHashes = JsonConvert.DeserializeObject <List <dynamic> >(json);

            var generatedHashes = keyMapper.Hashes.ToDictionary(x => x.Key, x => x.Value.EndPoint.ToString());

            foreach (var expectedhash in expectedHashes)
            {
                string hostname;
                Assert.IsTrue(generatedHashes.TryGetValue((long)expectedhash.hash, out hostname));
                Assert.AreEqual((string)expectedhash.hostname, hostname);
            }
        }
        internal override async Task Bootstrap(params ClusterNode[] bootstrapNodes)
        {
            //should never happen
            if (bootstrapNodes == null)
            {
                throw new ArgumentNullException(nameof(bootstrapNodes));
            }

            var bootstrapNode = bootstrapNodes.FirstOrDefault();

            //fetch the cluster map to avoid race condition with streaming http
            BucketConfig = await _httClusterMap.GetClusterMapAsync(
                Name, bootstrapNode.BootstrapUri, CancellationToken.None).ConfigureAwait(false);

            KeyMapper = new KetamaKeyMapper(BucketConfig, Configuration);

            //reuse the bootstrapNode
            BucketNodes.AddOrUpdate(bootstrapNode.EndPoint, bootstrapNode, (key, node) => bootstrapNode);
            bootstrapNode.Configuration = Configuration;

            //the initial bootstrapping endpoint;
            await bootstrapNode.SelectBucket(Name).ConfigureAwait(false);

            Manifest = await bootstrapNode.GetManifest().ConfigureAwait(false);

            LoadManifest();
            LoadClusterMap(BucketConfig.GetNodes()).ConfigureAwait(false).GetAwaiter().GetResult();
            bootstrapNode.Owner = this;
        }
Example #3
0
        public void SetUp()
        {
            var bucketConfig = ConfigUtil.ServerConfig.Buckets.Find(x => x.BucketType == "memcached");

            _servers = bucketConfig.Nodes.
                       Select(node => new Server(ObjectFactory.CreateIOStrategy(node), node, new ClientConfiguration(), bucketConfig)).
                       Cast <IServer>().
                       ToList();

            _keyMapper = new KetamaKeyMapper(_servers);
        }
Example #4
0
        internal override void ConfigUpdated(object sender, BucketConfigEventArgs e)
        {
            if (e.Config.Name == Name && (BucketConfig == null || e.Config.Rev > BucketConfig.Rev))
            {
                BucketConfig = e.Config;
                KeyMapper    = new KetamaKeyMapper(BucketConfig, Context.ClusterOptions);

                if (BucketConfig.ClusterNodesChanged)
                {
                    Task.Run(async() => await Context.ProcessClusterMapAsync(this, BucketConfig));
                }
            }
        }
Example #5
0
        internal override void ConfigUpdated(object sender, BucketConfigEventArgs e)
        {
            if (e.Config.Name == Name && e.Config.Rev > BucketConfig.Rev)
            {
                BucketConfig = e.Config;
                KeyMapper    = new KetamaKeyMapper(BucketConfig, ClusterOptions);

                if (BucketConfig.ClusterNodesChanged)
                {
                    LoadClusterMap(BucketConfig.GetNodes()).ConfigureAwait(false).GetAwaiter().GetResult();
                    Prune(BucketConfig);
                }
            }
        }
Example #6
0
        internal override async Task BootstrapAsync(IClusterNode node)
        {
            node.Owner = this;
            //fetch the cluster map to avoid race condition with streaming http
            BucketConfig = await _httpClusterMap.GetClusterMapAsync(
                Name, node.BootstrapUri, CancellationToken.None).ConfigureAwait(false);

            KeyMapper = new KetamaKeyMapper(BucketConfig, Context.ClusterOptions);

            //the initial bootstrapping endpoint;
            await node.SelectBucket(Name).ConfigureAwait(false);

            LoadManifest();
            await Task.Run(async() => await Context.ProcessClusterMapAsync(this, BucketConfig));
        }
Example #7
0
        public void SetUp()
        {
            var json         = File.ReadAllText(@"Data\\Configuration\\cb4-config-4-nodes.json");
            var bucketConfig = JsonConvert.DeserializeObject <BucketConfig>(json);

            _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()));
            }

            _keyMapper = new KetamaKeyMapper(_servers);
        }
Example #8
0
        public void SetUp()
        {
            var json         = ResourceHelper.ReadResource(@"Data\Configuration\cb4-config-4-nodes.json");
            var bucketConfig = JsonConvert.DeserializeObject <BucketConfig>(json);

            _servers = new Dictionary <IPEndPoint, IServer>();
            foreach (var node in bucketConfig.GetNodes())
            {
                _servers.Add(new IPEndPoint(node.GetIPAddress(), 8091),
                             new Server(new FakeIOService(node.GetIPEndPoint(), new FakeConnectionPool(), false),
                                        node,
                                        new FakeTranscoder(),
                                        ContextFactory.GetMemcachedContext(bucketConfig)));
            }

            _keyMapper = new KetamaKeyMapper(_servers);
        }
Example #9
0
        internal override async Task Bootstrap(params IClusterNode[] bootstrapNodes)
        {
            var bootstrapNode = bootstrapNodes.FirstOrDefault();

            //fetch the cluster map to avoid race condition with streaming http
            BucketConfig = await _httpClusterMap.GetClusterMapAsync(
                Name, bootstrapNode.BootstrapUri, CancellationToken.None).ConfigureAwait(false);

            KeyMapper = new KetamaKeyMapper(BucketConfig, ClusterOptions);

            //reuse the bootstrapNode
            BucketNodes.AddOrUpdate(bootstrapNode.EndPoint, bootstrapNode, (key, node) => bootstrapNode);
            bootstrapNode.ClusterOptions = ClusterOptions;

            //the initial bootstrapping endpoint;
            await bootstrapNode.SelectBucket(Name).ConfigureAwait(false);

            LoadManifest();
            LoadClusterMap(BucketConfig.GetNodes()).ConfigureAwait(false).GetAwaiter().GetResult();
            bootstrapNode.Owner = this;
        }
        /// <summary>
        /// Loads the current configuration setting the internal state of this configuration context.
        /// </summary>
        /// <param name="bucketConfig"></param>
        public override void LoadConfig(IBucketConfig bucketConfig)
        {
            if (bucketConfig == null)
            {
                throw new ArgumentNullException("bucketConfig");
            }
            if (BucketConfig == null || !BucketConfig.Nodes.AreEqual <Node>(bucketConfig.Nodes))
            {
                foreach (var node in bucketConfig.Nodes)
                {
                    var endpoint       = GetEndPoint(node, bucketConfig);
                    var connectionPool = ConnectionPoolFactory(ClientConfig.BucketConfigs[bucketConfig.Name].PoolConfiguration, endpoint);
                    var ioStrategy     = IOStrategyFactory(connectionPool);
                    var server         = new Core.Server(ioStrategy, node, ClientConfig);
                    var saslMechanism  = SaslFactory(bucketConfig.Name, bucketConfig.Password, ioStrategy, Converter);
                    saslMechanism.IOStrategy = ioStrategy;

                    Servers.Add(server);                         //todo make atomic
                    KeyMapper    = new KetamaKeyMapper(Servers); //todo make atomic
                    BucketConfig = bucketConfig;
                }
            }
        }