To implement a cluster with C#, first an array of Cluster nodes is initialized and passed to the
ClusterDatabase.Open()
method, then a ClusterConnection is instantiated for this database and a Listener thread is created. Finally theClusterConnection.Stop()
method is called to terminate the Cluster session. The following code snippet demonstrates how a simple Cluster C# application performs these steps:public class Cluster { Database db; // listen thread public void ClusterListen() { ClusterConnection con = new ClusterConnection(db); con.Listen(); con.Disconnect(); } public static long msec() { return DateTime.Now.Ticks / 10000; } private bool checkQuorum(int[] neighbourIds) { Console.Write("Checking quorum. Neighbours are:"); foreach (int nid in neighbourIds) { Console.Write("{0} ", nid); } Console.WriteLine("Return {0}", true); return true; } public bool CheckFunc(int[] neighbourIds) // for delegate call { bool result = true; // logic to determine if nodes can access my_data return result; } public static void Main(String[] args) { new Cluster(Int32.Parse(args[0]), Int32.Parse(args[1])); } Cluster(int n_nodes, int node_id) { Database.Parameters parameters = new Database.Parameters(); parameters.MemPageSize = PAGE_SIZE; parameters.Classes = new Type[]{typeof(Record)}; Database.ClusterNodeParams[] node_params = new Database.ClusterNodeParams[n_nodes]; for (int i = 0; i < n_nodes; ++i) { //use different ports on the localhost node_params[i].Addr = "127.0.0.1:200" + (10 + i * 10); node_params[i].QRank = 1; } // set cluster parameters - nodes and window length parameters.ClusterParameters = new Database.ClusterParams( node_params, node_id ); parameters.ClusterParameters.Window.Length = WINDOW_LENGTH; // create delegate and assign the member function CheckQuorum checkQ = new CheckQuorum(); checkQ.my_data = 119; // set user context parameters.ClusterParameters.QuorumDelegate = new Database.ClusterQuorumDelegate(checkQ.CheckFunc); db = new Database(new ExtremedbWrapper(), Database.Mode.ClusterSupport); db.Open("cluster-db", parameters, DATABASE_SIZE); //start cluster listener thread Thread listenThread = new Thread(new ThreadStart(ClusterListen)); listenThread.Start(); // connect to the database using ClusterConnection ClusterConnection con = new ClusterConnection(db); // do operations on the database con.Stop(); // stop cluster runtime. Returns after ALL nodes call Stop() listenThread.Join(); // wait for listener thread con.Disconnect(); db.Close(); } }Note that the Cluster runtime is started in the Database constructor. Note also the use of
CheckQuorum
delegate that allows the application to validate the collection of nodes online to determine if the cluster can begin processing.