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