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