public void Client() { string home = testHome + "/Client"; Configuration.ClearDir(home); clientStartSignal.WaitOne(); Console.WriteLine("Client: Join the replication"); // Open a environment. DatabaseEnvironmentConfig cfg = new DatabaseEnvironmentConfig(); cfg.UseReplication = true; cfg.MPoolSystemCfg = new MPoolConfig(); cfg.MPoolSystemCfg.CacheSize = new CacheInfo(0, 20485760, 1); cfg.UseLocking = true; cfg.UseTxns = true; cfg.UseMPool = true; cfg.Create = true; cfg.UseLogging = true; cfg.RunRecovery = true; cfg.TxnNoSync = true; cfg.FreeThreaded = true; cfg.LockTimeout = 50000; cfg.RepSystemCfg = new ReplicationConfig(); cfg.RepSystemCfg.RepmgrSitesConfig.Add(new DbSiteConfig()); cfg.RepSystemCfg.RepmgrSitesConfig[0].Host = "127.0.0.1"; cfg.RepSystemCfg.RepmgrSitesConfig[0].Port = ports[1]; cfg.RepSystemCfg.RepmgrSitesConfig[0].LocalSite = true; cfg.RepSystemCfg.Priority = 10; cfg.RepSystemCfg.RepmgrSitesConfig.Add(new DbSiteConfig()); cfg.RepSystemCfg.RepmgrSitesConfig[1].Host = "127.0.0.1"; cfg.RepSystemCfg.RepmgrSitesConfig[1].Port = ports[0]; cfg.RepSystemCfg.RepmgrSitesConfig[1].Helper = true; cfg.EventNotify = new EventNotifyDelegate(stuffHappened); DatabaseEnvironment env = DatabaseEnvironment.Open( home, cfg); // Start a client site with replication manager. env.RepMgrStartClient(3, false); // Leave enough time to sync. Thread.Sleep(20000); // Open database. BTreeDatabaseConfig dbConfig = new BTreeDatabaseConfig(); dbConfig.Creation = CreatePolicy.NEVER; dbConfig.AutoCommit = true; dbConfig.Env = env; dbConfig.PageSize = 512; BTreeDatabase db = BTreeDatabase.Open("rep.db", dbConfig); // Write data into database. Console.WriteLine("Client: Start reading data #1."); for (int i = 0; i < 5; i++) { db.GetBoth(new DatabaseEntry( BitConverter.GetBytes(i)), new DatabaseEntry( BitConverter.GetBytes(i))); } // Leave sometime for client to read new data from master. Thread.Sleep(20000); /* * Read the data. All data exists in master site should * appear in the client site. */ Console.WriteLine("Client: Start reading data #2."); for (int i = 10; i < 15; i++) { db.GetBoth(new DatabaseEntry( BitConverter.GetBytes(i)), new DatabaseEntry( BitConverter.GetBytes(i))); } // Get the latest replication subsystem statistics. ReplicationStats repStats = env.ReplicationSystemStats(); Assert.IsTrue(repStats.ClientStartupComplete); Assert.LessOrEqual(0, repStats.DuplicateLogRecords); Assert.LessOrEqual(0, repStats.EnvID); Assert.LessOrEqual(0, repStats.NextPage); Assert.LessOrEqual(0, repStats.ReceivedPages); Assert.AreEqual(1, repStats.Status); // Close all. db.Close(false); env.LogFlush(); env.Close(); Console.WriteLine( "Client: All data is read. Leaving the replication"); // The master is closed after client's close. masterCloseSignal.Set(); }