public string VoteAction(ChooserLbMessage message)
        {
            var      _storage = NodeStorage.GetInstance();
            NodeData worker;
            var      selected_Nodes = Distributor.FormateNodeList(3, out worker);
            var      neighbors      = Mapping.Mapper.Map <List <NodeNeighbor> >(selected_Nodes);

            var request_data = new NodeVoteMessage()
            {
                Message    = message,
                Neighbours = neighbors
            };

            var serialized = JsonConvert.SerializeObject(request_data);
            var content    = new StringContent(serialized, Encoding.UTF8, "application/json");

            try
            {
                var response = worker.Sender.PostAsync(new Uri(new Uri(worker.IpAddress), "api/Vote"), content).Result;
                return(response.Content.ReadAsStringAsync().Result);
            }
            catch (Exception e)
            {
                return("Error connection to Node" + e.Message);
            }
        }
Ejemplo n.º 2
0
        public async Task <bool> SaveNodeDataAsync(NodeStorage <CindiClusterState> storage)
        {
            try
            {
                if (!DoesStateExist)
                {
                    DoesStateExist = (await LoadNodeDataAsync() != null);
                }

                if (!DoesStateExist)
                {
                    await _clusterState.InsertOneAsync(storage);

                    return(true);
                }
                else
                {
                    //var filter = Builders<NodeStorage>.Filter.Eq("Id", storage.Id.ToString());
                    return((await _clusterState.ReplaceOneAsync(f => true, storage)).IsAcknowledged);
                }
            }
            catch (Exception e)
            {
                if (e.Message.Contains("Collection was modified"))
                {
                }
                else
                {
                    Console.WriteLine("Failed to save state with error message " + e.Message + " with stack trace " + Environment.NewLine + e.StackTrace);
                }
                return(false);
            }
        }
Ejemplo n.º 3
0
        public static NodeData GetExecutor()
        {
            var _storage      = NodeStorage.GetInstance();
            var totalNodeList = _storage.GetNodes();
            var random        = new Random();
            var choosedIndex  = random.Next(totalNodeList.Count());
            var choosedNode   = totalNodeList.ElementAt(choosedIndex);

            return(choosedNode);
        }
Ejemplo n.º 4
0
            /// <summary>
            /// Checks if a new entry set is being started. If so, sets the end offset of the previous
            /// entry set and writes it to the output storage.
            /// </summary>
            /// <param name="endOffset">The end offset of the previous entry.</param>
            /// <returns>The <see cref="Result"/> of the operation.</returns>
            private Result FinalizePreviousEntrySet(long endOffset)
            {
                int prevEntrySetIndex = CurrentEntryIndex / EntriesPerEntrySet - 1;
                int indexInEntrySet   = CurrentEntryIndex % EntriesPerEntrySet;

                // If the previous Add finished an entry set
                if (CurrentEntryIndex > 0 && indexInEntrySet == 0)
                {
                    // Set the end offset of that entry set
                    ref NodeHeader entrySetHeader = ref _entrySet.GetHeader();

                    entrySetHeader.Index  = prevEntrySetIndex;
                    entrySetHeader.Count  = EntriesPerEntrySet;
                    entrySetHeader.Offset = endOffset;

                    // Write the entry set to the entry storage
                    long   storageOffset = (long)NodeSize * prevEntrySetIndex;
                    Result rc            = EntryStorage.Write(storageOffset, _entrySet.GetBuffer());
                    if (rc.IsFailure())
                    {
                        return(rc);
                    }

                    // Clear the entry set buffer to begin the new entry set
                    _entrySet.FillZero();

                    // Check if we're writing in L2 nodes
                    if (CurrentL2OffsetIndex > OffsetsPerNode)
                    {
                        int prevL2NodeIndex = CurrentL2OffsetIndex / OffsetsPerNode - 2;
                        int indexInL2Node   = CurrentL2OffsetIndex % OffsetsPerNode;

                        // If the previous Add finished an L2 node
                        if (indexInL2Node == 0)
                        {
                            // Set the end offset of that node
                            ref NodeHeader l2NodeHeader = ref _l2Node.GetHeader();

                            l2NodeHeader.Index  = prevL2NodeIndex;
                            l2NodeHeader.Count  = OffsetsPerNode;
                            l2NodeHeader.Offset = endOffset;

                            // Write the L2 node to the node storage
                            long nodeOffset = (long)NodeSize * (prevL2NodeIndex + 1);
                            rc = NodeStorage.Write(nodeOffset, _l2Node.GetBuffer());
                            if (rc.IsFailure())
                            {
                                return(rc);
                            }

                            // Clear the L2 node buffer to begin the new node
                            _l2Node.FillZero();
                        }
                    }
Ejemplo n.º 5
0
        public void FormateNodeListTest()
        {
            List <NodeData> node_list = new List <NodeData>
            {
                new NodeData()
                {
                    NodeId = "N00-1", Name = "Node1"
                },
                new NodeData()
                {
                    NodeId = "N00-2", Name = "Node2"
                },
                new NodeData()
                {
                    NodeId = "N00-3", Name = "Node3"
                },
                new NodeData()
                {
                    NodeId = "N00-4", Name = "Node4"
                },
                new NodeData()
                {
                    NodeId = "N00-5", Name = "Node5"
                },
                new NodeData()
                {
                    NodeId = "N00-6", Name = "Node6"
                },
                new NodeData()
                {
                    NodeId = "N00-7", Name = "Node7"
                },
            };

            var _storage = NodeStorage.GetInstance();


            foreach (var item in node_list)
            {
                _storage.AddNode(item);
            }

            NodeData selectedNode;
            var      selected_nodes = Distributor.FormateNodeList(3, out selectedNode);

            var outputList = Mapper.Mapping.Mapper.Map <List <NodeNeighbor> >(selected_nodes);

            Assert.IsNotNull(outputList);
        }
        public void RegisterNode(NodeData node)
        {
            var storage = NodeStorage.GetInstance();

            var registered_nodes = storage.GetNodes();

            if (registered_nodes.FirstOrDefault(m => m.NodeId == node.NodeId) == null)
            {
                storage.AddNode(node);
            }
            else
            {
                storage.ExcludeNode(node.NodeId);
                storage.AddNode(node);
            }
        }
Ejemplo n.º 7
0
        public static List <NodeNeighbor> FormateNodeList(int i, out NodeData Executor)
        {
            var _storage      = NodeStorage.GetInstance();
            var totalNodeList = _storage.GetNodes();
            var random        = new Random();

            if (totalNodeList.Count() <= i)
            {
                throw new ArgumentOutOfRangeException("Number of registered Nodes is smaller than counter i");
            }
            else
            {
                var choosedIndex = 0; //random.Next(totalNodeList.Count());
                var choosedNode  = totalNodeList.ElementAt(choosedIndex);
                Executor = choosedNode;
                var choosedNodes = totalNodeList.OrderBy(x => random.Next()).Where(m => m.NodeId != choosedNode.NodeId).Take(i).Distinct();
                var neighbours   = Mapping.Mapper.Map <List <NodeNeighbor> >(choosedNodes);
                return(neighbours);
            }
        }
Ejemplo n.º 8
0
 public Task <bool> SaveNodeDataAsync(NodeStorage <Z> storage)
 {
     return(Task.FromResult(true));
 }
Ejemplo n.º 9
0
        /* public static RaftService<TestState> GetTestConsensusCoreNode()
         * {
         *   var moqClusterOptions = new Mock<IOptions<ClusterOptions>>();
         *   moqClusterOptions.Setup(mqo => mqo.Value).Returns(new ClusterOptions()
         *   {
         *       NodeUrls = "localhost:5022",
         *       TestMode = true,
         *       NumberOfShards = 1,
         *       DataTransferTimeoutMs = 1000,
         *       ElectionTimeoutMs = 1000,
         *       LatencyToleranceMs = 1000,
         *       MinimumNodes = 1
         *   });
         *
         *   var moqNodeOptions = new Mock<IOptions<NodeOptions>>();
         *   moqNodeOptions.Setup(mqo => mqo.Value).Returns(new NodeOptions() { });
         *
         *   var serviceProvider = new ServiceCollection()
         *   .AddLogging()
         *   .BuildServiceProvider();
         *
         *   var factory = serviceProvider.GetService<ILoggerFactory>();
         *
         *   var logger = factory.CreateLogger<RaftService<TestState>>();
         *
         *   NodeInMemoryRepository<TestState> inMemoryRepository = new NodeInMemoryRepository<TestState>();
         *   var NodeStorage = new NodeStorage<TestState>(inMemoryRepository) { };
         *   var _dataRouter = new TestDataRouter();
         *   var _stateMachine = new StateMachine<TestState>();
         *   var _connector = new ClusterClient(TimeSpan.FromMilliseconds(1000), TimeSpan.FromMilliseconds(1000));
         *
         *   return new ConsensusCoreNode<TestState>(moqClusterOptions.Object,
         *   moqNodeOptions.Object,
         *   logger,
         *   _stateMachine,
         *   inMemoryRepository,
         *  _connector,
         *   _dataRouter,
         *   new ShardManager<TestState, IShardRepository>(_stateMachine,
         *       factory.CreateLogger<ShardManager<TestState, IShardRepository>>(),
         *   _connector,
         *   _dataRouter,
         *   moqClusterOptions.Object,
         *       inMemoryRepository),
         *   NodeStorage
         *   );
         * }*/

        public static DataService <TestState> GetTestShardManager()
        {
            var serviceProvider = new ServiceCollection()
                                  .AddLogging()
                                  .BuildServiceProvider();
            var _stateMachine = new StateMachine <TestState>()
            {
            };
            var factory = serviceProvider.GetService <ILoggerFactory>();
            NodeInMemoryRepository <TestState> inMemoryRepository = new NodeInMemoryRepository <TestState>();
            var _dataRouter       = new TestDataRouter();
            var moqClusterOptions = new Mock <IOptions <ClusterOptions> >();

            var moqNodeOptions = new Mock <IOptions <NodeOptions> >();

            moqNodeOptions.Setup(mqo => mqo.Value).Returns(new NodeOptions()
            {
            });
            Guid nodeStorageId = Guid.NewGuid();
            var  NodeStorage   = new NodeStorage <TestState>(factory.CreateLogger <NodeStorage <TestState> >(), inMemoryRepository)
            {
                Id = nodeStorageId
            };
            var nodeStateService = new NodeStateService()
            {
                Id = nodeStorageId
            };
            var services   = new ServiceCollection();
            var provider   = services.BuildServiceProvider();
            var _connector = new ClusterClient(new ClusterConnectionPool <TestState>(_stateMachine, TimeSpan.FromMilliseconds(10000), TimeSpan.FromMilliseconds(1000)), provider, nodeStateService);

            _stateMachine.ApplyLogsToStateMachine(new List <ConsensusCore.Domain.Models.LogEntry>()
            {
                new ConsensusCore.Domain.Models.LogEntry()
                {
                    Commands = new List <BaseCommand>()
                    {
                        new CreateIndex()
                        {
                            Type   = "number",
                            Shards = new List <ShardAllocationMetadata>()
                            {
                                new ShardAllocationMetadata()
                                {
                                    Id = DefaultShardId,
                                    InsyncAllocations = new HashSet <Guid>()
                                    {
                                        nodeStorageId
                                    },
                                    PrimaryAllocation = nodeStorageId,
                                    Type             = "number",
                                    StaleAllocations = new HashSet <Guid>()
                                }
                            }
                        }
                    }
                }
            });

            moqClusterOptions.Setup(mqo => mqo.Value).Returns(new ClusterOptions()
            {
                NodeUrls              = "localhost:5022",
                TestMode              = true,
                NumberOfShards        = 1,
                DataTransferTimeoutMs = 1000,
                ElectionTimeoutMs     = 1000,
                LatencyToleranceMs    = 1000,
                MinimumNodes          = 1
            });


            var manager = new DataService <TestState>(
                factory,
                inMemoryRepository,
                _dataRouter,
                _stateMachine,
                nodeStateService,
                _connector,
                moqClusterOptions.Object,
                inMemoryRepository,
                moqNodeOptions.Object
                );

            return(manager);
        }