summaryrefslogtreecommitdiff
path: root/test/csharp/ReplicationTest.cs
diff options
context:
space:
mode:
Diffstat (limited to 'test/csharp/ReplicationTest.cs')
-rw-r--r--test/csharp/ReplicationTest.cs228
1 files changed, 226 insertions, 2 deletions
diff --git a/test/csharp/ReplicationTest.cs b/test/csharp/ReplicationTest.cs
index 6e9fd995..a57455a6 100644
--- a/test/csharp/ReplicationTest.cs
+++ b/test/csharp/ReplicationTest.cs
@@ -1,7 +1,7 @@
/*-
* See the file LICENSE for redistribution information.
*
- * Copyright (c) 2009, 2012 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2015 Oracle and/or its affiliates. All rights reserved.
*
*/
using System;
@@ -44,6 +44,196 @@ namespace CsharpAPITest
}
[Test]
+ public void TestReplicationView()
+ {
+ testName = "TestReplicationView";
+ SetUpTest(true);
+
+ string masterHome = testHome + "\\Master";
+ Configuration.ClearDir(masterHome);
+
+ string clientHome1 = testHome + "\\Client1";
+ Configuration.ClearDir(clientHome1);
+
+ string clientHome2 = testHome + "\\Client2";
+ Configuration.ClearDir(clientHome2);
+
+ ports.Clear();
+ AvailablePorts portGen = new AvailablePorts();
+ uint mPort = portGen.Current;
+ portGen.MoveNext();
+ uint cPort1 = portGen.Current;
+ portGen.MoveNext();
+ uint cPort2 = portGen.Current;
+
+ /* Open environment with replication configuration. */
+ DatabaseEnvironmentConfig cfg =
+ new DatabaseEnvironmentConfig();
+ cfg.Create = true;
+ cfg.RunRecovery = true;
+ cfg.UseLocking = true;
+ cfg.UseLogging = true;
+ cfg.UseMPool = true;
+ cfg.UseReplication = true;
+ cfg.FreeThreaded = true;
+ cfg.UseTxns = true;
+ cfg.EventNotify = new EventNotifyDelegate(stuffHappened);
+
+ cfg.RepSystemCfg = new ReplicationConfig();
+ cfg.RepSystemCfg.RepmgrSitesConfig.Add(new DbSiteConfig());
+ cfg.RepSystemCfg.RepmgrSitesConfig[0].Host = "127.0.0.1";
+ cfg.RepSystemCfg.RepmgrSitesConfig[0].Port = mPort;
+ cfg.RepSystemCfg.RepmgrSitesConfig[0].LocalSite = true;
+ cfg.RepSystemCfg.RepmgrSitesConfig[0].GroupCreator = true;
+ cfg.RepSystemCfg.Priority = 100;
+
+ /* Start up the master site. */
+ DatabaseEnvironment mEnv = DatabaseEnvironment.Open(
+ masterHome, cfg);
+ mEnv.DeadlockResolution = DeadlockPolicy.DEFAULT;
+ mEnv.RepMgrStartMaster(2);
+
+ /* Open the environment of the client 1 site. */
+ cfg.RepSystemCfg.RepmgrSitesConfig[0].Port = cPort1;
+ cfg.RepSystemCfg.RepmgrSitesConfig[0].GroupCreator = false;
+ cfg.RepSystemCfg.Priority = 10;
+ cfg.RepSystemCfg.RepmgrSitesConfig.Add(new DbSiteConfig());
+ cfg.RepSystemCfg.RepmgrSitesConfig[1].Host = "127.0.0.1";
+ cfg.RepSystemCfg.RepmgrSitesConfig[1].Port = mPort;
+ cfg.RepSystemCfg.RepmgrSitesConfig[1].Helper = true;
+ /* Set the site as a partial view. */
+ cfg.RepSystemCfg.ReplicationView = repView;
+ DatabaseEnvironment cEnv1 = DatabaseEnvironment.Open(
+ clientHome1, cfg);
+
+ /* Open the environment of the client 2 site. */
+ cfg.RepSystemCfg.RepmgrSitesConfig[0].Port = cPort2;
+ cfg.RepSystemCfg.RepmgrSitesConfig[0].GroupCreator = false;
+ cfg.RepSystemCfg.Priority = 10;
+ /* Set the site as a full view. */
+ cfg.RepSystemCfg.ReplicationView = null;
+ DatabaseEnvironment cEnv2 = DatabaseEnvironment.Open(
+ clientHome2, cfg);
+
+ /*
+ * Create two database files db1.db and db2.db
+ * on the master.
+ */
+ BTreeDatabaseConfig btreeDBConfig =
+ new BTreeDatabaseConfig();
+ btreeDBConfig.Env = mEnv;
+ btreeDBConfig.Creation = CreatePolicy.ALWAYS;
+ btreeDBConfig.AutoCommit = true;
+ BTreeDatabase db1 =
+ BTreeDatabase.Open("db1.db", btreeDBConfig);
+ BTreeDatabase db2 =
+ BTreeDatabase.Open("db2.db", btreeDBConfig);
+ db1.Close();
+ db2.Close();
+
+ /* Start up the client sites. */
+ cEnv1.RepMgrStartClient(2, false);
+ cEnv2.RepMgrStartClient(2, false);
+
+ /* Wait for clients to start up */
+ int i = 0;
+ while (!cEnv1.ReplicationSystemStats().ClientStartupComplete)
+ {
+ if (i < 20)
+ {
+ Thread.Sleep(1000);
+ i++;
+ }
+ else
+ throw new TestException();
+ }
+ i = 0;
+ while (!cEnv2.ReplicationSystemStats().ClientStartupComplete)
+ {
+ if (i < 20)
+ {
+ Thread.Sleep(1000);
+ i++;
+ }
+ else
+ throw new TestException();
+ }
+
+ /*
+ * Verify that the file db2.db is replicated to the
+ * client 2 (full view), but not to the client 1
+ * (partial view), and the file db1.db is
+ * replicated to both sites.
+ */
+ btreeDBConfig.Env = cEnv1;
+ btreeDBConfig.Creation = CreatePolicy.NEVER;
+ db1 = BTreeDatabase.Open("db1.db", btreeDBConfig);
+ try
+ {
+ db2 = BTreeDatabase.Open("db2.db", btreeDBConfig);
+ throw new TestException();
+ }
+ catch (DatabaseException e){
+ Assert.AreEqual(0, String.Compare(
+ "No such file or directory", e.Message));
+ }
+ db1.Close();
+ btreeDBConfig.Env = cEnv2;
+ db1 = BTreeDatabase.Open("db1.db", btreeDBConfig);
+ db2 = BTreeDatabase.Open("db2.db", btreeDBConfig);
+ db1.Close();
+ db2.Close();
+
+ /* Get the replication manager statistic. */
+ RepMgrStats repMgrStats = mEnv.RepMgrSystemStats();
+ Assert.AreEqual(1, repMgrStats.ParticipantSites);
+ Assert.AreEqual(3, repMgrStats.TotalSites);
+ Assert.AreEqual(2, repMgrStats.ViewSites);
+
+ /*
+ * Verify the master is not a view locally
+ * or from remote site.
+ */
+ ReplicationStats repstats =
+ mEnv.ReplicationSystemStats();
+ Assert.AreEqual(false, repstats.View);
+ RepMgrSite[] rsite = cEnv1.RepMgrRemoteSites;
+ Assert.AreEqual(2, rsite.Length);
+ for (i = 0; i < rsite.Length; i++) {
+ if (rsite[i].Address.Port == mPort)
+ break;
+ }
+ Assert.Greater(rsite.Length, i);
+ Assert.AreEqual(false, rsite[i].isView);
+
+ /*
+ * Verify the clients are views locally
+ * and from remote site.
+ */
+ rsite = mEnv.RepMgrRemoteSites;
+ Assert.AreEqual(2, rsite.Length);
+ Assert.AreEqual(true, rsite[0].isView);
+ Assert.AreEqual(true, rsite[1].isView);
+ repstats = cEnv1.ReplicationSystemStats();
+ Assert.AreEqual(true, repstats.View);
+ repstats = cEnv2.ReplicationSystemStats();
+ Assert.AreEqual(true, repstats.View);
+
+ cEnv2.Close();
+ cEnv1.Close();
+ mEnv.Close();
+ }
+
+ int repView(string name, ref int result, uint flags)
+ {
+ if (name == "db1.db")
+ result = 1;
+ else
+ result = 0;
+ return (0);
+ }
+
+ [Test]
public void TestRepMgrSite()
{
testName = "TestRepMgrSite";
@@ -194,6 +384,7 @@ namespace CsharpAPITest
{
string home = testHome + "/Master";
string dbName = "rep.db";
+ uint metabyte = 1048576;
Configuration.ClearDir(home);
/*
@@ -246,6 +437,7 @@ namespace CsharpAPITest
// Get initial replication stats.
ReplicationStats repStats = env.ReplicationSystemStats();
+ env.Msgfile = home + "/master.log";
env.PrintReplicationSystemStats();
Assert.AreEqual(100, repStats.EnvPriority);
Assert.AreEqual(1,
@@ -254,9 +446,18 @@ namespace CsharpAPITest
Assert.AreEqual(0, repStats.AppliedTransactions);
Assert.AreEqual(0, repStats.ElectionDataGeneration);
+ // Get repmgr incoming queue max setting.
+ Assert.AreEqual(0, env.RepmgrIncomingQueueMaxGBytes);
+ Assert.AreEqual(100 * metabyte, env.RepmgrIncomingQueueMaxBytes);
+
// Start a master site with replication manager.
env.RepMgrStartMaster(3);
+ // Change repmgr incoming queue setting and verify it.
+ env.RepmgrSetIncomingQueueMax(123, 321);
+ Assert.AreEqual(123, env.RepmgrIncomingQueueMaxGBytes);
+ Assert.AreEqual(321, env.RepmgrIncomingQueueMaxBytes);
+
// Open a btree database and write some data.
Transaction txn = env.BeginTransaction();
BTreeDatabaseConfig dbConfig =
@@ -363,11 +564,18 @@ namespace CsharpAPITest
// Get replication manager statistics.
RepMgrStats repMgrStats = env.RepMgrSystemStats(true);
+ Assert.AreEqual(0, repMgrStats.AutoTakeovers);
Assert.LessOrEqual(0, repMgrStats.DroppedConnections);
Assert.LessOrEqual(0, repMgrStats.DroppedMessages);
+ Assert.LessOrEqual(0, repMgrStats.ElectionThreads);
Assert.LessOrEqual(0, repMgrStats.FailedConnections);
Assert.LessOrEqual(0, repMgrStats.FailedMessages);
+ Assert.Less(0, repMgrStats.MaxElectionThreads);
Assert.LessOrEqual(0, repMgrStats.QueuedMessages);
+ // There should be no messages dropped and in the queue now.
+ Assert.AreEqual(0, repMgrStats.IncomingDroppedMessages);
+ Assert.AreEqual(0, repMgrStats.IncomingQueueGBytes);
+ Assert.AreEqual(0, repMgrStats.IncomingQueueBytes);
// Print them out.
env.PrintRepMgrSystemStats();
@@ -416,6 +624,8 @@ namespace CsharpAPITest
cfg.RepSystemCfg.RepmgrSitesConfig[1].Host = "127.0.0.1";
cfg.RepSystemCfg.RepmgrSitesConfig[1].Port = ports[0];
cfg.RepSystemCfg.RepmgrSitesConfig[1].Helper = true;
+ // Set the incoming queue max.
+ cfg.RepSystemCfg.RepmgrIncomingQueueMax(2, 123456);
cfg.EventNotify = new EventNotifyDelegate(stuffHappened);
DatabaseEnvironment env = DatabaseEnvironment.Open(
home, cfg);
@@ -423,6 +633,10 @@ namespace CsharpAPITest
// Start a client site with replication manager.
env.RepMgrStartClient(3, false);
+ // Get repmgr incoming queue max setting.
+ Assert.AreEqual(2, env.RepmgrIncomingQueueMaxGBytes);
+ Assert.AreEqual(123456, env.RepmgrIncomingQueueMaxBytes);
+
// Leave enough time to sync.
Thread.Sleep(20000);
@@ -464,6 +678,11 @@ namespace CsharpAPITest
Assert.LessOrEqual(0, repStats.NextPage);
Assert.LessOrEqual(0, repStats.ReceivedPages);
Assert.AreEqual(1, repStats.Status);
+ // There should be no messages dropped and in the queue now.
+ RepMgrStats repMgrStats = env.RepMgrSystemStats();
+ Assert.AreEqual(0, repMgrStats.IncomingDroppedMessages);
+ Assert.AreEqual(0, repMgrStats.IncomingQueueGBytes);
+ Assert.AreEqual(0, repMgrStats.IncomingQueueBytes);
// Close all.
db.Close(false);
@@ -480,6 +699,9 @@ namespace CsharpAPITest
{
switch (eventCode)
{
+ case NotificationEvent.REP_AUTOTAKEOVER_FAILED:
+ Console.WriteLine("Event: REP_AUTOTAKEOVER_FAILED");
+ break;
case NotificationEvent.REP_CLIENT:
Console.WriteLine("Event: CLIENT");
break;
@@ -677,7 +899,6 @@ namespace CsharpAPITest
} catch(Exception e) {
Console.WriteLine(e.Message);
} finally {
- env.Close();
/*
* Clean up electionDone and startUpDone to
* check election for new master and start-up
@@ -685,6 +906,9 @@ namespace CsharpAPITest
*/
electionDone = false;
startUpDone = 0;
+
+ env.Close();
+
/*
* Need to set signals for three times, each
* site would wait for one.