コード例 #1
0
        public RaftServiceNode(NodeSettings nodeSettings, string dbreezePath, IBusinessHandler handler, int port = 4250, string nodeName = "default", IWarningLog log = null)
        {
            if (nodeSettings == null)
            {
                nodeSettings = new NodeSettings();
            }
            this.NodeSettings = nodeSettings;
            this.NodeName     = nodeName;
            this.log          = log;
            this.port         = port;

            peerNetwork = new TcpPeerNetwork(this);
            //bool firstNode = true;
            if (this.NodeSettings.RaftEntitiesSettings == null)
            {
                this.NodeSettings.RaftEntitiesSettings = new RaftEntitySettings();
            }
            var re_settings = this.NodeSettings.RaftEntitiesSettings;

            if (String.IsNullOrEmpty(re_settings.EntityName))
            {
                throw new Exception("Raft.Net: entities must have unique names. Change RaftNodeSettings.EntityName.");
            }

            var rn = new RaftStateMachine(re_settings ?? new RaftEntitySettings(), dbreezePath, this.peerNetwork, this.log, handler);

            rn.SetNodesQuantityInTheCluster((uint)this.NodeSettings.TcpClusterEndPoints.Count);
            rn.NodeAddress.NodeAddressId = port; //for debug/emulation purposes

            rn.NodeAddress.NodeUId = Guid.NewGuid().ToByteArray().Substring(8, 8).To_Int64_BigEndian();
            rn.NodeName            = this.NodeName;
            this.raftNode          = rn;
            rn.NodeStart();
        }
コード例 #2
0
 public LockSeriveControlNode(string nodeName, NodeSettings setting, int Port, string localPath, IWarningLog logger)
 {
     this.nodeName = nodeName;
     this.logger   = logger;
     trn           = new RaftServiceNode(setting,
                                         localPath,
                                         new LockClusterManagerHandler(this),
                                         Port,
                                         nodeName + "_Control",
                                         logger);
 }
コード例 #3
0
ファイル: TcpRaftNode.cs プロジェクト: axzxs2001/Raft.Net
        internal List <TcpClusterEndPoint> clusterEndPoints = new List <TcpClusterEndPoint>();  //init clusterEndPoints creating 1-N connection


        public TcpRaftNode(List <TcpClusterEndPoint> clusterEndPoints, List <RaftNodeSettings> raftNodes, string dbreezePath, Func <string, ulong, byte[], bool> OnCommit, int port = 4250, IWarningLog log = null)
        {
            //this.rn_settings = rn_settings ?? new RaftNodeSettings();

            this.log  = log;
            this.port = port;
            if (clusterEndPoints != null)
            {
                var bt      = clusterEndPoints.SerializeBiser();
                var decoder = new Biser.Decoder(bt);
                this.clusterEndPoints = new List <TcpClusterEndPoint>();
                decoder.GetCollection(() => { return(TcpClusterEndPoint.BiserDecode(extDecoder: decoder)); }, this.clusterEndPoints, false);

                //this.clusterEndPoints.AddRange(clusterEndPoints.SerializeProtobuf().DeserializeProtobuf<List<TcpClusterEndPoint>>());
            }
            spider = new TcpSpider(this);

            bool firstNode = true;

            foreach (var rn_settings in raftNodes)
            {
                if (firstNode)
                {
                    rn_settings.EntityName = "default";
                    firstNode = false;
                }

                if (String.IsNullOrEmpty(rn_settings.EntityName))
                {
                    throw new Exception("Raft.Net: entities must have unique names. Change RaftNodeSettings.EntityName.");
                }

                if (this.raftNodes.ContainsKey(rn_settings.EntityName))
                {
                    throw new Exception("Raft.Net: entities must have unique names. Change RaftNodeSettings.EntityName.");
                }

                var rn = new RaftNode(rn_settings ?? new RaftNodeSettings(), dbreezePath, this.spider, this.log, OnCommit);

#if DEBUG
                rn.Verbose = rn_settings.VerboseRaft;                               //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!   DEBUG PURPOSES
#endif
                rn.SetNodesQuantityInTheCluster((uint)this.clusterEndPoints.Count); //!!!!!!!!!!!!  ENABLE 1 for debug, make it dynamic (but not less then 3 if not DEBUG)
                rn.NodeAddress.NodeAddressId = port;                                //for debug/emulation purposes

                rn.NodeAddress.NodeUId = Guid.NewGuid().ToByteArray().Substring(8, 8).To_Int64_BigEndian();

                this.raftNodes[rn_settings.EntityName] = rn;

                rn.NodeStart();
            }
        }
コード例 #4
0
        public TimeMaster(IWarningLog log)
        {
            if (log == null)
            {
                throw new Exception("ILog is not supplied");
            }

            Log = log;

            tmr.Elapsed += tmr_Elapsed;
            tmr.Interval = DefaultTimerInterval;   //Default interval
            tmr.Start();
        }
コード例 #5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="settings"></param>
        /// <param name="dbreezePath"></param>
        /// <param name="raftSender"></param>
        /// <param name="log"></param>
        /// <param name="OnCommit"></param>
        public RaftNode(RaftNodeSettings settings, string dbreezePath, IRaftComSender raftSender, IWarningLog log, Func <string, ulong, byte[], bool> OnCommit)
        {
            this.Log      = log ?? throw new Exception("Raft.Net: ILog is not supplied");
            this.OnCommit = OnCommit ?? throw new Exception("Raft.Net: OnCommit can'T be null");

            Sender       = raftSender;
            nodeSettings = settings;

            //Starting time master
            this.TM = new TimeMaster(log);
            //Starting state logger
            NodeStateLog = new StateLog(dbreezePath, this);
        }
コード例 #6
0
 public HttpRaftServiceNode(NodeSettings nodeSettings,
                            string dbreezePath,
                            IBusinessHandler handler,
                            int port        = 4250,
                            string nodeName = "default",
                            int httpPort    = 10000,
                            ServiceChannelAdapter adapter = null,
                            IWarningLog log = null)
     : base(nodeSettings, dbreezePath, handler, port, nodeName, log)
 {
     this.httpPort = httpPort;
     this.adapter  = adapter;
     handler.SetNode(this);
     this.adapter.SetNode(this);
 }
コード例 #7
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="settings"></param>
        /// <param name="dbEngine"></param>
        /// <param name="raftSender"></param>
        /// <param name="log"></param>
        /// <param name="OnCommit"></param>
        public RaftStateMachine(RaftEntitySettings settings, string workPath, IPeerConnector raftSender, IWarningLog log, IBusinessHandler handler)
        {
            this.Log       = log ?? throw new Exception("Raft.Net: ILog is not supplied");
            network        = raftSender;
            entitySettings = settings;

            //Starting time master
            var TM = new TimeMaster(log);

            this.timerLoop = new StateMachineTimerLoop(TM, settings, this);

            //Starting state logger
            NodeStateLog    = StateLogFactory.GetLog(this, workPath);
            this.logHandler = new StateMachineLogHandler(this, NodeStateLog, handler);
            //Adding AddLogEntryAsync cleanup
            this.timerLoop.StartClearup();
        }
コード例 #8
0
        static void Main(string[] args)
        {
            var port = int.Parse(ConfigurationManager.AppSettings["port"]);
            var name = ConfigurationManager.AppSettings["name"];

            Console.Title = name + "port:" + port;
            log           = new Logger();
            var config = System.IO.File.ReadAllText(System.IO.Directory.GetCurrentDirectory() + @"\config.txt");
            var node   = TcpRaftNode.GetFromConfig(1, config,
                                                   System.IO.Directory.GetCurrentDirectory() + $@"\DBreeze\{name}", port, log,
                                                   (entityName, index, data) =>
            {
                Console.WriteLine($"{entityName}/{index} { System.Text.Encoding.UTF8.GetString(data)}");
                return(true);
            });

            node.Start();

            while (true)
            {
                Console.WriteLine("输入发送的内容并回车:");
                node.AddLogEntry(System.Text.Encoding.UTF8.GetBytes(Console.ReadLine()));
            }
        }
コード例 #9
0
        static void Main(string[] args)
        {
            log = new Logger();
            //tm = new TimeMaster(log);

            if (args.Length > 0)
            {
                switch (args[0])
                {
                case "1":
                    Scenario1(args);
                    return;
                }
            }


            //UdpTester t = new UdpTester(tm, log);
            //t.Start(40000);

            dd = new Raft.RaftEmulator.Emulator();
            //dd.StartEmulateNodes(5);
            dd.StartEmulateTcpNodes(5);



            Console.WriteLine("--------");
            while (true)
            {
                string cmd = Console.ReadLine();
                switch (cmd)
                {
                case "quit":
                    return;

                default:
                    try
                    {
                        string[] spl = cmd.Split(' ');
                        if (spl.Count() > 1)
                        {
                            switch (spl[0])
                            {
                            case "start":         //start 2
                                dd.Start(Convert.ToInt32(spl[1]));
                                break;

                            case "stop":         //stop 1
                                dd.Stop(Convert.ToInt32(spl[1]));
                                break;

                            case "test":         //sendtestall 4254 - means node 4254 must send to all TcpMsg "Test"
                                dd.SendTestAll(Convert.ToInt32(spl[1]));
                                break;

                            case "set":         //set 1 - will create an entity
                                val++;
                                dd.SetValue(new byte[] { (byte)val });
                                break;

                            case "set10":         //set10 1 - will create an entity
                                for (int qi = 0; qi < 10; qi++)
                                {
                                    dd.SetValue(new byte[] { 12 });
                                }
                                break;
                            }
                        }
                        //else if(spl.Count() == 1)
                        //{
                        //    switch (spl[0])
                        //    {
                        //        case "testall": //sendtestall 4254 - means node 4254 must send to all TcpMsg "Test"
                        //            Console.WriteLine("test 4250");
                        //            dd.SendTestAll(4250);

                        //            Console.WriteLine("test 4251");
                        //            dd.SendTestAll(4251);

                        //            Console.WriteLine("test 4252");
                        //            dd.SendTestAll(4252);

                        //            Console.WriteLine("test 4253");
                        //            dd.SendTestAll(4253);

                        //            Console.WriteLine("test 4254");
                        //            dd.SendTestAll(4254);
                        //            break;
                        //    }
                        //}
                        else
                        {
                            Console.WriteLine("Unknown command");
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Error: " + ex.ToString());
                    }

                    break;
                }
            }
        }
コード例 #10
0
        static void Main(string[] args)
        {
            log = new Logger();

            cluster = new Raft.RaftEmulator.ClusterManagerEmulator();
            //dd.StartEmulateNodes(5);
            cluster.StartEmulateTcpNodes(5);



            Console.WriteLine("--------");
            while (true)
            {
                string cmd = Console.ReadLine();
                switch (cmd)
                {
                case "quit":
                    return;

                default:
                    try
                    {
                        string[] spl = cmd.Split(' ');
                        if (spl.Length > 1)
                        {
                            switch (spl[0])
                            {
                            case "start":         //start 2
                                cluster.Start(Convert.ToInt32(spl[1]));
                                break;

                            case "stop":         //stop 1
                                cluster.Stop(Convert.ToInt32(spl[1]));
                                break;

                            case "test":         //sendtestall 4254 - means node 4254 must send to all TcpMsg "Test"
                                cluster.SendTestAll(Convert.ToInt32(spl[1]));
                                break;

                            case "set":         //set 1 - will create an entity
                                val++;
                                cluster.SetValue(new byte[] { (byte)val });
                                break;

                            case "send":         //set 1 - will create an entity
                                val++;
                                cluster.SendData(Convert.ToInt32(spl[1]), "shards:entity1");
                                break;

                            case "set10":         //set10 1 - will create an entity
                                for (int qi = 0; qi < 10; qi++)
                                {
                                    cluster.SetValue(new byte[] { 12 });
                                }
                                break;

                            case "lock":
                                var shard = cluster.Shards.Count > 0 ? cluster.Shards[0]:null;
                                shard.SendData(1, "lock 1234");
                                break;
                            }
                        }

                        else
                        {
                            Console.WriteLine("Unknown command");
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Error: " + ex.ToString());
                    }

                    break;
                }
            }
        }
コード例 #11
0
ファイル: TcpRaftNode.cs プロジェクト: ww-it/Raft.Net
        //public TcpRaftNode(List<TcpClusterEndPoint> clusterEndPoints, List<RaftNodeSettings> raftNodes, string dbreezePath, Func<string, ulong, byte[], bool> OnCommit, int port = 4250,  IWarningLog log = null)
        //public TcpRaftNode(List<TcpClusterEndPoint> clusterEndPoints, List<RaftEntitySettings> raftNodes, string dbreezePath, Func<string, ulong, byte[], bool> OnCommit, int port = 4250, IWarningLog log = null)
        public TcpRaftNode(NodeSettings nodeSettings, string dbreezePath, Func <string, ulong, byte[], bool> OnCommit, int port = 4250, IWarningLog log = null)
        {
            if (nodeSettings == null)
            {
                nodeSettings = new NodeSettings();
            }
            this.NodeSettings = nodeSettings;

            this.log  = log;
            this.port = port;

            DBreezeConfiguration conf = new DBreezeConfiguration()
            {
                DBreezeDataFolderName = dbreezePath,
                Storage = DBreezeConfiguration.eStorage.DISK,
            };

            conf.AlternativeTablesLocations.Add("mem_*", String.Empty);

            dbEngine = new DBreezeEngine(conf);


            //if (clusterEndPoints != null)
            //{
            //    var bt = clusterEndPoints.SerializeBiser();
            //    var decoder = new Biser.Decoder(bt);
            //    this.clusterEndPoints = new List<TcpClusterEndPoint>();
            //    decoder.GetCollection(() => { return TcpClusterEndPoint.BiserDecode(extDecoder: decoder); }, this.clusterEndPoints, false);

            //    //this.clusterEndPoints.AddRange(clusterEndPoints.SerializeProtobuf().DeserializeProtobuf<List<TcpClusterEndPoint>>());
            //}
            spider = new TcpSpider(this);

            //bool firstNode = true;
            if (this.NodeSettings.RaftEntitiesSettings == null)
            {
                this.NodeSettings.RaftEntitiesSettings = new List <RaftEntitySettings>();
            }

            if (this.NodeSettings.RaftEntitiesSettings.Where(r => r.EntityName.ToLower() == "default").Count() < 1)
            {
                this.NodeSettings.RaftEntitiesSettings.Add(new RaftEntitySettings());
            }


            foreach (var re_settings in this.NodeSettings.RaftEntitiesSettings)
            {
                //if (firstNode)
                //{
                //    re_settings.EntityName = "default";
                //    firstNode = false;
                //}

                if (String.IsNullOrEmpty(re_settings.EntityName))
                {
                    throw new Exception("Raft.Net: entities must have unique names. Change RaftNodeSettings.EntityName.");
                }

                if (this.raftNodes.ContainsKey(re_settings.EntityName))
                {
                    throw new Exception("Raft.Net: entities must have unique names. Change RaftNodeSettings.EntityName.");
                }

                var rn = new RaftNode(re_settings ?? new RaftEntitySettings(), this.dbEngine, this.spider, this.log, OnCommit);

#if DEBUG
                rn.Verbose = re_settings.VerboseRaft;                                               //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!   DEBUG PURPOSES
#endif
                rn.SetNodesQuantityInTheCluster((uint)this.NodeSettings.TcpClusterEndPoints.Count); //!!!!!!!!!!!!  ENABLE 1 for debug, make it dynamic (but not less then 3 if not DEBUG)
                rn.NodeAddress.NodeAddressId = port;                                                //for debug/emulation purposes

                rn.NodeAddress.NodeUId = Guid.NewGuid().ToByteArray().Substring(8, 8).To_Int64_BigEndian();

                this.raftNodes[re_settings.EntityName] = rn;

                rn.NodeStart();
            }
        }
コード例 #12
0
ファイル: TcpRaftNode.cs プロジェクト: ww-it/Raft.Net
        public static TcpRaftNode GetFromConfig(int configVersion, string configuration, string dbreezePath, int port, IWarningLog log, Func <string, ulong, byte[], bool> OnCommit)
        {
            //Setip for configVersion=1
            try
            {
                TcpRaftNode rn = null;


                var re_settings = new RaftEntitySettings()
                {
                    EntityName       = "default",
                    VerboseRaft      = false,
                    VerboseTransport = false
                };

                string[] sev;
                List <TcpClusterEndPoint> eps = new List <TcpClusterEndPoint>();

                List <RaftEntitySettings> reSettings = new List <RaftEntitySettings>();
                string entityName = "";

                StringReader strReader = new StringReader(configuration);

                while (true)
                {
                    var el = strReader.ReadLine();
                    if (el == null)
                    {
                        break;
                    }

                    var se = el.Split(new char[] { ':' });
                    if (se.Length < 2)
                    {
                        continue;
                    }
                    switch (se[0].Trim().ToLower())
                    {
                    case "endpoint":
                        sev = se[1].Split(new char[] { ',' });
                        eps.Add(new TcpClusterEndPoint()
                        {
                            Host = sev[0].Trim(), Port = Convert.ToInt32(sev[1].Trim())
                        });
                        break;

                    //case "dbreeze":
                    //    dbreeze = String.Join(":",se.Skip(1));
                    //    break;
                    case "entity":
                        entityName = se[1].Trim();
                        if (entityName.ToLower().Equals("default"))
                        {
                            continue;
                        }
                        //flushing default entity and starting new one
                        if (String.IsNullOrEmpty(entityName))
                        {
                            throw new Exception("Raft.Net: configuration entity name must not be empty and must be unique among other entities");
                        }
                        reSettings.Add(re_settings);
                        re_settings = new RaftEntitySettings {
                            EntityName = entityName
                        };
                        break;

                    case "verboseraft":
                        if (se[1].Trim().ToLower().Equals("true"))
                        {
                            re_settings.VerboseRaft = true;
                        }
                        break;

                    case "verbosetransport":
                        if (se[1].Trim().ToLower().Equals("true"))
                        {
                            re_settings.VerboseTransport = true;
                        }
                        break;

                    case "delayedpersistenceisactive":
                        if (se[1].Trim().ToLower().Equals("true"))
                        {
                            re_settings.DelayedPersistenceIsActive = true;
                        }
                        break;

                    case "delayedpersistencems":
                        re_settings.DelayedPersistenceMs = Convert.ToUInt32(se[1].Trim());
                        break;

                    case "inmemoryentity":
                        if (se[1].Trim().ToLower().Equals("true"))
                        {
                            re_settings.InMemoryEntity = true;
                        }
                        break;

                    case "inmemoryentitystartsyncfromlatestentity":
                        if (se[1].Trim().ToLower().Equals("true"))
                        {
                            re_settings.InMemoryEntityStartSyncFromLatestEntity = true;
                        }
                        break;
                    }//DelayedPersistenceMs
                }

                reSettings.Add(re_settings);


                rn = new TcpRaftNode(new NodeSettings()
                {
                    TcpClusterEndPoints = eps, RaftEntitiesSettings = reSettings
                }, dbreezePath,
                                     OnCommit,
                                     port, log);

                return(rn);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
コード例 #13
0
ファイル: TcpRaftNode.cs プロジェクト: ww-it/Raft.Net
        /// <summary>
        ///
        /// </summary>
        /// <param name="jsonConfiguration">json representation of Raft.NodeSettings</param>
        /// <param name="dbreezePath"></param>
        /// <param name="port"></param>
        /// <param name="log"></param>
        /// <param name="OnCommit"></param>
        /// <returns></returns>
        public static TcpRaftNode GetFromConfig(string jsonConfiguration, string dbreezePath, int port, IWarningLog log, Func <string, ulong, byte[], bool> OnCommit)
        {
            try
            {
                TcpRaftNode  rn = null;
                NodeSettings ns = NodeSettings.BiserJsonDecode(jsonConfiguration);

                //Biser.JsonEncoder encc = new Biser.JsonEncoder(new NodeSettings() { TcpClusterEndPoints = eps, RaftEntitiesSettings = reSettings });
                //var str = encc.GetJSON(Biser.JsonSettings.JsonStringStyle.Prettify);

                //NodeSettings nhz = NodeSettings.BiserJsonDecode(str);

                //encc = new Biser.JsonEncoder(nhz);
                //str = encc.GetJSON(Biser.JsonSettings.JsonStringStyle.Prettify);

                rn = new TcpRaftNode(ns, dbreezePath, OnCommit, port, log);
                return(rn);
            }
            catch (Exception ex)
            {
                if (log != null)
                {
                    log.Log(new WarningLogEntry {
                        LogType = WarningLogEntry.eLogType.ERROR, Exception = ex, Method = "TcpRaftNode.GetFromConfig JSON"
                    });
                }
            }
            return(null);
        }
コード例 #14
0
        static void Main(string[] args)
        {
            log = new Logger();

            var         config = System.IO.File.ReadAllText(System.IO.Directory.GetCurrentDirectory() + @"\config.txt");
            TcpRaftNode rn1    = TcpRaftNode.GetFromConfig(1, config,
                                                           System.IO.Directory.GetCurrentDirectory() + @"\DBreeze\Node1", 4250, log,
                                                           (entityName, index, data) =>
            {
                Console.WriteLine($"Committed {entityName}/{index}");
                Console.WriteLine("0000000000000      4250数据:" + System.Text.Encoding.UTF8.GetString(data));
                return(true);
            });

            TcpRaftNode rn2 = TcpRaftNode.GetFromConfig(1, config,
                                                        System.IO.Directory.GetCurrentDirectory() + @"\DBreeze\Node2", 4251, log,
                                                        (entityName, index, data) =>
            {
                Console.WriteLine($"Committed {entityName}/{index}");
                Console.WriteLine("111111111111      4251数据:" + System.Text.Encoding.UTF8.GetString(data));
                var random = new Random();
                var num    = random.Next(1, 3) % 2;
                Console.WriteLine(num);

                if (num == 1)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            });

            TcpRaftNode rn3 = TcpRaftNode.GetFromConfig(1, config,
                                                        System.IO.Directory.GetCurrentDirectory() + @"\DBreeze\Node3", 4252, log,
                                                        (entityName, index, data) =>
            {
                Console.WriteLine($"Committed {entityName}/{index}");
                Console.WriteLine("222222222222       4252数据:" + System.Text.Encoding.UTF8.GetString(data));
                return(true);
            });

            rn1.Start();
            rn2.Start();
            rn3.Start();


            while (true)
            {
                Console.Clear();
                Console.WriteLine("选择要发送的:1、4250     2、4251     3、4252");
                switch (Console.ReadLine())
                {
                case "1":
                    rn1.AddLogEntry(System.Text.Encoding.UTF8.GetBytes(DateTime.Now.ToString()), "inMemory1");
                    break;

                case "2":
                    rn2.AddLogEntry(System.Text.Encoding.UTF8.GetBytes(DateTime.Now.ToString()), "inMemory1");
                    break;

                case "3":
                    rn3.AddLogEntry(System.Text.Encoding.UTF8.GetBytes(DateTime.Now.ToString()), "inMemory1");
                    break;
                }
            }
        }