Example #1
0
        /// <summary>
        /// Processes a <see cref="ChunkListRequest"/> message.
        /// </summary>
        /// <param name="message">The message to response to.</param>
        /// <param name="request">The <see cref="ChunkListRequest"/> data.</param>
        public void ProcessChunkListRequest(Message message, ChunkListRequest request)
        {
            List <ChunkDefinition> defs = new List <ChunkDefinition>();

            _lock.EnterReadLock();
            defs.AddRange(_chunks.Select(e => new ChunkDefinition(e.Start, e.End, _node.Self)));
            _lock.ExitReadLock();
            ChunkListResponse response = new ChunkListResponse(defs);

            _node.SendDatabaseMessage(new Message(message, response, false));
        }
Example #2
0
        /// <summary>
        /// Called when this node is to become the primary.
        /// </summary>
        private void BecomePrimary()
        {
            lock (_balancingLockObject)
            {
                _balancing = BalancingState.ChunkManagement;
            }

            Primary = Self;
            foreach (var def in GetConnectedNodes().Select(e => e.Item1))
            {
                if (Equals(def, Self))
                {
                    continue;
                }

                SendMessage(new Message(def, new PrimaryAnnouncement(), false));
            }

            SendQueryNodeConnectionMessage();
            SendStorageNodeConnectionMessage();

            foreach (var def in GetConnectedNodes().Where(e => e.Item2 == NodeType.Storage).Select(e => e.Item1))
            {
                Message message = new Message(def, new ChunkListRequest(), true);
                SendMessage(message);
                message.BlockUntilDone();
                if (message.Success)
                {
                    ChunkListResponse response = (ChunkListResponse)message.Response.Data;
                    foreach (var item in response.Chunks)
                    {
                        if (!_chunkList.Any(e => e.Start.Equals(item.Start)))
                        {
                            _chunkList.Add(item);
                        }
                    }
                }
            }

            TryCreateDatabase();

            lock (_balancingLockObject)
            {
                _balancing = BalancingState.None;
            }
        }