Implements a vbucket based node locator.
Inheritance: IMemcachedNodeLocator
        public SyncOperation(VBucketNodeLocator locator, IList<KeyValuePair<string, ulong>> keys, SyncMode mode, int replicationCount)
        {
            if (keys == null) throw new ArgumentNullException("keys");
            if (keys.Count > 0xffff) throw new ArgumentException("Maximum 0xFFFF items are supported.");

            this.flags = GetFlags(mode, replicationCount);

            this.locator = locator;
            this.keys = keys;
        }
        public SyncOperation(VBucketNodeLocator locator, KeyValuePair<string, ulong>[] keys, SyncMode mode, int replicationCount)
        {
            if (keys == null) throw new ArgumentNullException("keys");
            if (keys.Length > 0xffff) throw new ArgumentException("Only 0xffff items are supported");

            this.flags = GetFlags(mode, replicationCount);

            this.locator = locator;
            this.keys = keys;
        }
Example #3
0
        public void TestBuckets()
        {
            var vb = new VBucketNodeLocator("crc", buckets);

            var servers = new[] { "127.0.0.1", "127.0.0.2", "127.0.0.3" };
            var nodes = from s in servers
                        let ip = IPAddress.Parse(s)
                        select (IMemcachedNode)new MockNode(new IPEndPoint(ip, 11211));

            ((IMemcachedNodeLocator)vb).Initialize(nodes.ToList());

            foreach (var kvp in keyToVBucket)
            {
                var b = vb.GetVBucket(kvp.Key);
                var index = Array.IndexOf(buckets, b);

                Assert.IsTrue(index == kvp.Value, "Key '" + kvp.Key + "': expected " + kvp.Value + " but found " + index);
            }
        }
 public TouchOperation(VBucketNodeLocator locator, string key, uint expires)
     : base(key)
 {
     this.locator = locator;
     this.expires = expires;
 }
 public VBucketAwareOperationFactory(VBucketNodeLocator locator)
 {
     this.locator = locator;
 }
 public VBStore(VBucketNodeLocator locator, StoreMode mode, string key, CacheItem value, uint expires)
     : base(mode, key, value, expires)
 {
     this.locator = locator;
 }
 public VBMutator(VBucketNodeLocator locator, MutationMode mode, string key, ulong defaultValue, ulong delta, uint expires)
     : base(mode, key, defaultValue, delta, expires)
 {
     this.locator = locator;
 }
 public VBMget(VBucketNodeLocator locator, IList<string> keys)
     : base(keys)
 {
     this.locator = locator;
 }
 public VBGet(VBucketNodeLocator locator, string key)
     : base(key)
 {
     this.locator = locator;
     this.state = OperationState.Unspecified;
 }
 public VBDelete(VBucketNodeLocator locator, string key)
     : base(key)
 {
     this.locator = locator;
 }
 public VBConcat(VBucketNodeLocator locator, ConcatenationMode mode, string key, ArraySegment<byte> data)
     : base(mode, key, data)
 {
     this.locator = locator;
 }
		private InternalState InitVBucket(ClusterConfig config, ISaslAuthenticationProvider auth)
		{
			// we have a vbucket config, which has its own server list
			// it's supposed to be the same as the cluster config's list,
			// but the order is significicant (because of the bucket indexes),
			// so we we'll use this for initializing the locator
			var vbsm = config.vBucketServerMap;

			if (log.IsInfoEnabled) log.Info("Has vbucket. Server count: " + (vbsm.serverList == null ? 0 : vbsm.serverList.Length));

			var epa = (from server in vbsm.serverList
					   select ConfigurationHelper.ResolveToEndPoint(server)).ToArray();

			var epaLength = epa.Length;

			for (var i = 0; i < vbsm.vBucketMap.Length; i++)
			{
				var vb = vbsm.vBucketMap[i];
				if (vb == null || vb.Length == 0)
					throw new InvalidOperationException("Server sent an empty vbucket definition at index " + i);
				if (vb[0] >= epaLength || vb[0] < 0)
					throw new InvalidOperationException(String.Format("VBucket line {0} has a master index {1} out of range of the server list ({2})", i, vb[0], epaLength));
			}

			var buckets = vbsm.vBucketMap.Select(a => new VBucket(a[0], a.Skip(1).ToArray())).ToArray();
			var bucketNodeMap = buckets.ToLookup(vb =>
			{
				try
				{
					return epa[vb.Master];
				}
				catch (Exception e)
				{
					log.Error(e);

					throw;
				}
			}
			);
			var vbnl = new VBucketNodeLocator(vbsm.hashAlgorithm, buckets);

			return new InternalState
			{
				CurrentNodes = epa.Select(ip => (IMemcachedNode)new BinaryNode(ip, this.configuration.SocketPool, auth)).ToArray(),
				Locator = vbnl,
				OpFactory = new VBucketAwareOperationFactory(vbnl)
			};
		}
        private InternalState InitVBucket(ClusterConfig config, ISaslAuthenticationProvider auth)
        {
            // we have a vbucket config, which has its own server list
            // it's supposed to be the same as the cluster config's list,
            // but the order is significicant (because of the bucket indexes),
            // so we we'll use this for initializing the locator
            var vbsm = config.vBucketServerMap;

            if (log.IsInfoEnabled) log.Info("Has vbucket. Server count: " + (vbsm.serverList == null ? 0 : vbsm.serverList.Length));

            // parse the ip addresses of the servers in the vbucket map
            // make sure we have a propert vbucket map
            ValidateVBucketMap(vbsm, vbsm.serverList.Length);

            // create vbuckets from the int[][] arrays
            var buckets = vbsm.vBucketMap.Select(a => new VBucket(a[0], a.Skip(1).ToArray())).ToArray();

            var locator = new VBucketNodeLocator(vbsm.hashAlgorithm, buckets);

            // create a (host=>node) lookup from the node info objects,
            // so we can pass the extra config data to the factory method
            // (the vbucket map only contains 'host:port' strings)
            // this expects that all nodes listed in the vbucket map are listed in the config.nodes member as well
            var realNodes = config.nodes.ToDictionary(node => node.HostName + ":" + node.Port);
            var nodes = new List<IMemcachedNode>();

            foreach (var hostSpec in vbsm.serverList)
            {
                ClusterNode node;

                if (!realNodes.TryGetValue(hostSpec, out node))
                    throw new InvalidOperationException(String.Format("VBucket map contains a node {0} whihc was not found in the cluster info's node list.", hostSpec));

                var ip = GetFirstAddress(node.HostName);
                var endpoint = new IPEndPoint(ip, node.Port);

                nodes.Add(this.CreateNode(endpoint, auth, node.ConfigurationData));
            }

            return new InternalState
            {
                CurrentNodes = nodes.ToArray(),
                Locator = locator,
                OpFactory = new VBucketAwareOperationFactory(locator),
                IsVbucket = true
            };
        }
 public GetWithLockOperation(VBucketNodeLocator locator, string key, uint lockExpiration)
     : base(key)
 {
     this.locator = locator;
     this.lockExpiration = lockExpiration;
 }
 public GetAndTouchOperation(VBucketNodeLocator locator, string key, uint newExpiration)
     : base(key)
 {
     this.locator = locator;
     this.newExpiration = newExpiration;
 }
 public UnlockOperation(VBucketNodeLocator locator, string key, ulong cas)
     : base(key)
 {
     this.locator = locator;
     this.Cas = cas;
 }