Exemple #1
0
        public void TestElection()
        {
            testName = "TestElection";
            SetUpTest(true);

            // Initialize ports for one master, and three clients.
            ports.Clear();
            AvailablePorts portGen = new AvailablePorts();

            ports.Insert(0, portGen.Current);
            portGen.MoveNext();
            ports.Insert(1, portGen.Current);
            portGen.MoveNext();
            ports.Insert(2, portGen.Current);
            portGen.MoveNext();
            ports.Insert(3, portGen.Current);

            client1StartSignal = new AutoResetEvent(false);
            client2StartSignal = new AutoResetEvent(false);
            client1ReadySignal = new AutoResetEvent(false);
            client2ReadySignal = new AutoResetEvent(false);
            client3StartSignal = new AutoResetEvent(false);
            client3ReadySignal = new AutoResetEvent(false);
            masterLeaveSignal  = new AutoResetEvent(false);

            Thread thread1 = new Thread(
                new ThreadStart(UnstableMaster));
            Thread thread2 = new Thread(
                new ThreadStart(StableClient1));
            Thread thread3 = new Thread(
                new ThreadStart(StableClient2));
            Thread thread4 = new Thread(
                new ThreadStart(StableClient3));

            thread1.Start();
            Thread.Sleep(1000);
            thread2.Start();
            thread3.Start();
            thread4.Start();

            thread4.Join();
            thread3.Join();
            thread2.Join();
            thread1.Join();

            client1StartSignal.Close();
            client2StartSignal.Close();
            client1ReadySignal.Close();
            client2ReadySignal.Close();
            client3ReadySignal.Close();
            client3StartSignal.Close();
            masterLeaveSignal.Close();
        }
Exemple #2
0
        public void TestRepMgr()
        {
            testName = "TestRepMgr";
            SetUpTest(true);

            // Initialize ports for master and client.
            ports.Clear();
            AvailablePorts portGen = new AvailablePorts();

            ports.Insert(0, portGen.Current);
            portGen.MoveNext();
            ports.Insert(1, portGen.Current);

            clientStartSignal = new AutoResetEvent(false);
            masterCloseSignal = new AutoResetEvent(false);

            Thread thread1 = new Thread(new ThreadStart(Master));
            Thread thread2 = new Thread(new ThreadStart(Client));

            // Start master thread before client thread.
            thread1.Start();
            Thread.Sleep(1000);
            thread2.Start();
            thread2.Join();
            thread1.Join();

            clientStartSignal.Close();
            masterCloseSignal.Close();
        }
Exemple #3
0
        public void TestElection()
        {
            testName = "TestElection";
            SetUpTest(true);

            // Initialize ports for one master, and three clients.
            ports.Clear();
            AvailablePorts portGen = new AvailablePorts();

            ports.Insert(0, portGen.Current);
            portGen.MoveNext();
            ports.Insert(1, portGen.Current);
            portGen.MoveNext();
            ports.Insert(2, portGen.Current);
            portGen.MoveNext();
            ports.Insert(3, portGen.Current);

            /*
             * The *Signals are used as triggers to control the test
             * work flow.  The client1StartSignal would be set once
             * the master is ready and notify the client1 to start.
             * The client2StartSignal would be set once the client1
             * is ready and notify the client2 to start.  The
             * client3StartSignal is similar.  The masterLeaveSignal
             * would be set once the last client client3 is ready
             * and notify the master to leave.  The
             * clientsElectionSignal would be set when the master
             * has already left and new master would be elected.
             */
            client1StartSignal    = new AutoResetEvent(false);
            client2StartSignal    = new AutoResetEvent(false);
            client3StartSignal    = new AutoResetEvent(false);
            clientsElectionSignal = new AutoResetEvent(false);
            masterLeaveSignal     = new AutoResetEvent(false);
            // Count startup done event.
            startUpDone = 0;
            // Whether finish election.
            electionDone = false;

            Thread thread1 = new Thread(
                new ThreadStart(UnstableMaster));
            Thread thread2 = new Thread(
                new ThreadStart(StableClient1));
            Thread thread3 = new Thread(
                new ThreadStart(StableClient2));
            Thread thread4 = new Thread(
                new ThreadStart(StableClient3));

            try {
                thread1.Start();

                /*
                 * After start up is done at master, start
                 * client1.  Wait for the signal for 50000 ms.
                 */
                if (!client1StartSignal.WaitOne(50000))
                {
                    throw new TestException();
                }
                thread2.Start();

                // Ready to start client2.
                if (!client2StartSignal.WaitOne(50000))
                {
                    throw new TestException();
                }
                thread3.Start();

                // Ready to start client3.
                if (!client3StartSignal.WaitOne(50000))
                {
                    throw new TestException();
                }
                thread4.Start();

                thread4.Join();
                thread3.Join();
                thread2.Join();
                thread1.Join();

                Assert.IsTrue(electionDone);
            } catch (TestException e) {
                if (thread1.IsAlive)
                {
                    thread1.Abort();
                }
                if (thread2.IsAlive)
                {
                    thread2.Abort();
                }
                if (thread3.IsAlive)
                {
                    thread3.Abort();
                }
                if (thread4.IsAlive)
                {
                    thread4.Abort();
                }
                throw e;
            } finally {
                client1StartSignal.Close();
                client2StartSignal.Close();
                client3StartSignal.Close();
                clientsElectionSignal.Close();
                masterLeaveSignal.Close();
            }
        }
Exemple #4
0
        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();
        }
Exemple #5
0
        public void TestRepMgrSite()
        {
            testName = "TestRepMgrSite";
            SetUpTest(true);

            string masterHome = testHome + "\\Master";

            Configuration.ClearDir(masterHome);

            string clientHome = testHome + "\\Client";

            Configuration.ClearDir(clientHome);

            ports.Clear();
            AvailablePorts portGen = new AvailablePorts();
            uint           mPort   = portGen.Current;

            portGen.MoveNext();
            uint cPort = 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;

            DatabaseEnvironment mEnv = DatabaseEnvironment.Open(
                masterHome, cfg);

            mEnv.DeadlockResolution = DeadlockPolicy.DEFAULT;
            mEnv.RepMgrStartMaster(2);

            cfg.RepSystemCfg.RepmgrSitesConfig[0].Port         = cPort;
            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;
            DatabaseEnvironment cEnv = DatabaseEnvironment.Open(
                clientHome, cfg);

            cEnv.RepMgrStartClient(2, false);

            /* Wait for client to start up */
            int i = 0;

            while (!cEnv.ReplicationSystemStats().ClientStartupComplete)
            {
                if (i < 20)
                {
                    Thread.Sleep(1000);
                    i++;
                }
                else
                {
                    throw new TestException();
                }
            }

            /*
             * Verify the client info could be observed by master's
             * remote site.
             */
            Assert.AreEqual(1, mEnv.RepMgrRemoteSites.Length);
            RepMgrSite rsite = mEnv.RepMgrRemoteSites[0];

            Assert.AreEqual("127.0.0.1", rsite.Address.Host);
            Assert.AreEqual(cPort, rsite.Address.Port);
            Assert.AreEqual(true, rsite.isConnected);
            Assert.AreEqual(false, rsite.isPeer);

            DbSite site = mEnv.RepMgrSite("127.0.0.1", mPort);

            Assert.AreEqual("127.0.0.1", site.Address.Host);
            Assert.AreEqual(mPort, site.Address.Port);
            Assert.LessOrEqual(0, site.EId);
            Assert.AreEqual(true, site.GroupCreator);
            Assert.AreEqual(true, site.LocalSite);
            Assert.AreEqual(false, site.Helper);
            Assert.AreEqual(false, site.Legacy);
            Assert.AreEqual(false, site.Peer);
            site.Close();

            site = mEnv.RepMgrSite("127.0.0.1", cPort);
            Assert.AreEqual("127.0.0.1", site.Address.Host);
            Assert.AreEqual(cPort, site.Address.Port);
            Assert.AreEqual(rsite.EId, site.EId);
            Assert.AreEqual(false, site.GroupCreator);
            Assert.AreEqual(false, site.LocalSite);
            Assert.AreEqual(false, site.Helper);
            Assert.AreEqual(false, site.Legacy);
            Assert.AreEqual(false, site.Peer);
            site.Remove();

            cEnv.Close();
            mEnv.Close();

            /*
             * Update the repmgr site, and verify it is updated in
             * unmanaged memory.
             */
            rsite.Address = new ReplicationHostAddress(
                "192.168.1.1", 1000);
            rsite.EId         = 1024;
            rsite.isConnected = false;
            rsite.isPeer      = true;
            Assert.AreEqual("192.168.1.1", rsite.Address.Host);
            Assert.AreEqual(1000, rsite.Address.Port);
            Assert.AreEqual(1024, rsite.EId);
            Assert.AreEqual(false, rsite.isConnected);
            Assert.AreEqual(true, rsite.isPeer);
        }
Exemple #6
0
        public void TestRepMgrSite()
        {
            testName = "TestRepMgrSite";
            SetUpTest(true);

            string masterHome = testHome + "\\Master";

            Configuration.ClearDir(masterHome);

            string clientHome = testHome + "\\Client";

            Configuration.ClearDir(clientHome);

            ports.Clear();
            AvailablePorts portGen = new AvailablePorts();
            uint           mPort   = portGen.Current;

            portGen.MoveNext();
            uint cPort = 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.RepMgrLocalSite =
                new ReplicationHostAddress("127.0.0.1", mPort);
            cfg.RepSystemCfg.Priority = 100;
            cfg.RepSystemCfg.NSites   = 2;

            DatabaseEnvironment mEnv = DatabaseEnvironment.Open(
                masterHome, cfg);

            mEnv.DeadlockResolution = DeadlockPolicy.DEFAULT;
            mEnv.RepMgrStartMaster(2);

            cfg.RepSystemCfg.RepMgrLocalSite =
                new ReplicationHostAddress("127.0.0.1", cPort);
            cfg.RepSystemCfg.Priority = 10;
            cfg.RepSystemCfg.AddRemoteSite(
                new ReplicationHostAddress("127.0.0.1", mPort),
                false);
            DatabaseEnvironment cEnv = DatabaseEnvironment.Open(
                clientHome, cfg);

            cEnv.RepMgrStartClient(2, false);

            /*
             * Verify the client info could be achived by master's
             * remote site.
             */
            Assert.AreEqual(1, mEnv.RepMgrRemoteSites.Length);
            RepMgrSite site = mEnv.RepMgrRemoteSites[0];

            Assert.AreEqual("127.0.0.1", site.Address.Host);
            Assert.AreEqual(cPort, site.Address.Port);
            Assert.AreEqual(0, site.EId);
            Assert.AreEqual(true, site.isConnected);
            Assert.AreEqual(false, site.isPeer);

            cEnv.Close();
            mEnv.Close();

            /*
             * Update the repmgr site, and verify it is updated in
             * unmanged memory.
             */
            site.Address = new ReplicationHostAddress(
                "192.168.1.1", 1000);
            site.EId         = 1024;
            site.isConnected = false;
            site.isPeer      = true;
            Assert.AreEqual("192.168.1.1", site.Address.Host);
            Assert.AreEqual(1000, site.Address.Port);
            Assert.AreEqual(1024, site.EId);
            Assert.AreEqual(false, site.isConnected);
            Assert.AreEqual(true, site.isPeer);
        }