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