Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        public void UnstableMaster()
        {
            string home = testHome + "/UnstableMaster";

            Configuration.ClearDir(home);

            // Open environment with replication configuration.
            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.RepSystemCfg = new ReplicationConfig();
            cfg.RepSystemCfg.RepmgrSitesConfig.Add(
                new DbSiteConfig());
            cfg.RepSystemCfg.RepmgrSitesConfig[0].Host      = "127.0.0.1";
            cfg.RepSystemCfg.RepmgrSitesConfig[0].Port      = ports[0];
            cfg.RepSystemCfg.RepmgrSitesConfig[0].LocalSite = true;
            cfg.RepSystemCfg.Priority        = 200;
            cfg.RepSystemCfg.ElectionRetry   = 10;
            cfg.RepSystemCfg.RepMgrAckPolicy = AckPolicy.ALL;
            cfg.EventNotify = new EventNotifyDelegate(stuffHappened);
            DatabaseEnvironment env = DatabaseEnvironment.Open(
                home, cfg);

            env.DeadlockResolution = DeadlockPolicy.DEFAULT;

            try {
                // Start as master site.
                env.RepMgrStartMaster(3);
                Console.WriteLine(
                    "Master: Create a new repmgr group");

                // Client1 could start now.
                client1StartSignal.Set();

                // Wait for initialization of all clients.
                if (!masterLeaveSignal.WaitOne(50000))
                {
                    throw new TestException();
                }

                // Check remote sites are valid.
                foreach (RepMgrSite site in
                         env.RepMgrRemoteSites)
                {
                    Assert.AreEqual("127.0.0.1",
                                    site.Address.Host);
                    Assert.IsTrue(ports.Contains(
                                      site.Address.Port));
                }

                // Close the current master.
                Console.WriteLine("Master: Unexpected leave.");
                env.LogFlush();
            } catch (Exception e) {
                Console.WriteLine(e.Message);
            } finally {
                env.Close();

                /*
                 * Clean up electionDone and startUpDone to
                 * check election for new master and start-up
                 * done on clients.
                 */
                electionDone = false;
                startUpDone  = 0;

                /*
                 * Need to set signals for three times, each
                 * site would wait for one.
                 */
                for (int i = 0; i < 3; i++)
                {
                    clientsElectionSignal.Set();
                }
            }
        }
Exemplo n.º 3
0
        public void StableClient(string home, int clientIdx,
                                 uint localPort, uint priority,
                                 uint helperPort, uint peerPort,
                                 EventWaitHandle notifyHandle)
        {
            int timeout = 0;

            Configuration.ClearDir(home);

            Console.WriteLine(
                "Client{0}: Join the replication", clientIdx);

            DatabaseEnvironmentConfig cfg =
                new DatabaseEnvironmentConfig();

            cfg.Create                   = true;
            cfg.FreeThreaded             = true;
            cfg.MPoolSystemCfg           = new MPoolConfig();
            cfg.MPoolSystemCfg.CacheSize =
                new CacheInfo(0, 20485760, 1);
            cfg.RunRecovery    = true;
            cfg.TxnNoSync      = true;
            cfg.UseLocking     = true;
            cfg.UseMPool       = true;
            cfg.UseTxns        = true;
            cfg.UseReplication = true;
            cfg.UseLogging     = true;
            cfg.RepSystemCfg   = new ReplicationConfig();
            cfg.RepSystemCfg.RepmgrSitesConfig.Add(
                new DbSiteConfig());
            cfg.RepSystemCfg.RepmgrSitesConfig[0].Host      = "127.0.0.1";
            cfg.RepSystemCfg.RepmgrSitesConfig[0].Port      = localPort;
            cfg.RepSystemCfg.RepmgrSitesConfig[0].LocalSite = true;
            cfg.RepSystemCfg.Priority = priority;
            cfg.RepSystemCfg.RepmgrSitesConfig.Add(
                new DbSiteConfig());
            cfg.RepSystemCfg.RepmgrSitesConfig[1].Host   = "127.0.0.1";
            cfg.RepSystemCfg.RepmgrSitesConfig[1].Port   = helperPort;
            cfg.RepSystemCfg.RepmgrSitesConfig[1].Helper = true;
            cfg.RepSystemCfg.ElectionRetry   = 100;
            cfg.RepSystemCfg.RepMgrAckPolicy = AckPolicy.NONE;
            cfg.EventNotify = new EventNotifyDelegate(stuffHappened);
            DatabaseEnvironment env = DatabaseEnvironment.Open(
                home, cfg);

            env.DeadlockResolution = DeadlockPolicy.DEFAULT;

            try {
                // Start the client.
                Assert.AreEqual(clientIdx - 1, startUpDone);
                env.RepMgrStartClient(3, false);
                while (startUpDone < clientIdx)
                {
                    if (timeout > 10)
                    {
                        throw new TestException();
                    }
                    timeout++;
                    Thread.Sleep(1000);
                }

                ReplicationStats repStats =
                    env.ReplicationSystemStats();
                Assert.LessOrEqual(0, repStats.Elections);
                Assert.LessOrEqual(0,
                                   repStats.ElectionTiebreaker);
                Assert.LessOrEqual(0, repStats.ElectionTimeSec +
                                   repStats.ElectionTimeUSec);
                Assert.LessOrEqual(0, repStats.MasterChanges);
                Assert.LessOrEqual(0, repStats.NewSiteMessages);
                Assert.LessOrEqual(0,
                                   repStats.ReceivedLogRecords);
                Assert.LessOrEqual(0, repStats.ReceivedMessages);
                Assert.LessOrEqual(0, repStats.ReceivedPages);
                Assert.GreaterOrEqual(clientIdx + 1,
                                      repStats.RegisteredSitesNeeded);
                Assert.LessOrEqual(0, repStats.Sites);

                // Notify the next event.
                notifyHandle.Set();

                // Wait for master's leave.
                if (!clientsElectionSignal.WaitOne(50000))
                {
                    throw new TestException();
                }

                timeout = 0;
                while (!electionDone)
                {
                    if (timeout > 10)
                    {
                        throw new TestException();
                    }
                    timeout++;
                    Thread.Sleep(1000);
                }

                env.LogFlush();

                timeout = 0;
                // Start up done event happens on client.
                while (startUpDone < 2)
                {
                    if (timeout > 10)
                    {
                        throw new TestException();
                    }
                    timeout++;
                    Thread.Sleep(1000);
                }
                Thread.Sleep((int)priority * 100);
            } catch (Exception e) {
                Console.WriteLine(e.Message);
            } finally {
                env.Close();
                Console.WriteLine(
                    "Client{0}: Leaving the replication",
                    clientIdx);
            }
        }
Exemplo n.º 4
0
        public void Master()
        {
            string home   = testHome + "/Master";
            string dbName = "rep.db";

            Configuration.ClearDir(home);

            /*
             * Configure and open environment with replication
             * application.
             */
            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.RepSystemCfg = new ReplicationConfig();
            cfg.RepSystemCfg.RepmgrSitesConfig.Add(new DbSiteConfig());
            cfg.RepSystemCfg.RepmgrSitesConfig[0].Host      = "127.0.0.1";
            cfg.RepSystemCfg.RepmgrSitesConfig[0].Port      = ports[0];
            cfg.RepSystemCfg.RepmgrSitesConfig[0].LocalSite = true;
            cfg.RepSystemCfg.Priority        = 100;
            cfg.RepSystemCfg.BulkTransfer    = true;
            cfg.RepSystemCfg.AckTimeout      = 2000;
            cfg.RepSystemCfg.BulkTransfer    = true;
            cfg.RepSystemCfg.CheckpointDelay = 1500;
            cfg.RepSystemCfg.Clockskew(102, 100);
            cfg.RepSystemCfg.ConnectionRetry     = 10;
            cfg.RepSystemCfg.DelayClientSync     = false;
            cfg.RepSystemCfg.ElectionRetry       = 5;
            cfg.RepSystemCfg.ElectionTimeout     = 3000;
            cfg.RepSystemCfg.FullElectionTimeout = 5000;
            cfg.RepSystemCfg.HeartbeatMonitor    = 100;
            cfg.RepSystemCfg.HeartbeatSend       = 10;
            cfg.RepSystemCfg.LeaseTimeout        = 1300;
            cfg.RepSystemCfg.AutoInit            = true;
            cfg.RepSystemCfg.NoBlocking          = false;
            cfg.RepSystemCfg.RepMgrAckPolicy     =
                AckPolicy.ALL_PEERS;
            cfg.RepSystemCfg.RetransmissionRequest(10, 100);
            cfg.RepSystemCfg.Strict2Site     = true;
            cfg.RepSystemCfg.UseMasterLeases = false;
            cfg.EventNotify = new EventNotifyDelegate(stuffHappened);
            DatabaseEnvironment env = DatabaseEnvironment.Open(
                home, cfg);

            // Get initial replication stats.
            ReplicationStats repStats = env.ReplicationSystemStats();

            env.PrintReplicationSystemStats();
            Assert.AreEqual(100, repStats.EnvPriority);
            Assert.AreEqual(1,
                            repStats.CurrentElectionGenerationNumber);
            Assert.AreEqual(0, repStats.CurrentGenerationNumber);
            Assert.AreEqual(0, repStats.AppliedTransactions);
            Assert.AreEqual(0, repStats.ElectionDataGeneration);

            // Start a master site with replication manager.
            env.RepMgrStartMaster(3);

            // Open a btree database and write some data.
            Transaction         txn      = env.BeginTransaction();
            BTreeDatabaseConfig dbConfig =
                new BTreeDatabaseConfig();

            dbConfig.Creation = CreatePolicy.IF_NEEDED;
            dbConfig.Env      = env;
            dbConfig.PageSize = 512;
            BTreeDatabase db = BTreeDatabase.Open(dbName,
                                                  dbConfig, txn);

            txn.Commit();
            txn = env.BeginTransaction();
            for (int i = 0; i < 5; i++)
            {
                db.Put(new DatabaseEntry(BitConverter.GetBytes(i)),
                       new DatabaseEntry(BitConverter.GetBytes(i)), txn);
            }
            txn.Commit();

            Console.WriteLine(
                "Master: Finished initialization and data#1.");

            // Client site could enter now.
            clientStartSignal.Set();
            Console.WriteLine(
                "Master: Wait for Client to join and get #1.");

            Console.WriteLine("...");

            // Put some new data into master site.
            txn = env.BeginTransaction();
            for (int i = 10; i < 15; i++)
            {
                db.Put(new DatabaseEntry(BitConverter.GetBytes(i)),
                       new DatabaseEntry(BitConverter.GetBytes(i)),
                       txn);
            }
            txn.Commit();
            Console.WriteLine(
                "Master: Write something new, data #2.");
            Console.WriteLine("Master: Wait for client to read #2...");

            // Get the stats.
            repStats = env.ReplicationSystemStats(true);
            env.PrintReplicationSystemStats();
            Assert.LessOrEqual(0, repStats.AppliedTransactions);
            Assert.LessOrEqual(0, repStats.AwaitedLSN.LogFileNumber);
            Assert.LessOrEqual(0, repStats.AwaitedLSN.Offset);
            Assert.LessOrEqual(0, repStats.AwaitedPage);
            Assert.LessOrEqual(0, repStats.BadGenerationMessages);
            Assert.LessOrEqual(0, repStats.BulkBufferFills);
            Assert.LessOrEqual(0, repStats.BulkBufferOverflows);
            Assert.LessOrEqual(0, repStats.BulkBufferTransfers);
            Assert.LessOrEqual(0, repStats.BulkRecordsStored);
            Assert.LessOrEqual(0, repStats.ClientServiceRequests);
            Assert.LessOrEqual(0, repStats.ClientServiceRequestsMissing);
            Assert.IsInstanceOf(typeof(bool), repStats.ClientStartupComplete);
            Assert.AreEqual(2, repStats.CurrentElectionGenerationNumber);
            Assert.AreEqual(1, repStats.CurrentGenerationNumber);
            Assert.LessOrEqual(0, repStats.CurrentQueuedLogRecords);
            Assert.LessOrEqual(0, repStats.CurrentWinner);
            Assert.LessOrEqual(0, repStats.CurrentWinnerMaxLSN.LogFileNumber);
            Assert.LessOrEqual(0, repStats.CurrentWinnerMaxLSN.Offset);
            Assert.LessOrEqual(0, repStats.DuplicateLogRecords);
            Assert.LessOrEqual(0, repStats.DuplicatePages);
            Assert.LessOrEqual(0, repStats.DupMasters);
            Assert.LessOrEqual(0, repStats.ElectionGenerationNumber);
            Assert.LessOrEqual(0, repStats.ElectionPriority);
            Assert.LessOrEqual(0, repStats.Elections);
            Assert.LessOrEqual(0, repStats.ElectionStatus);
            Assert.LessOrEqual(0, repStats.ElectionsWon);
            Assert.LessOrEqual(0, repStats.ElectionTiebreaker);
            Assert.LessOrEqual(0, repStats.ElectionTimeSec);
            Assert.LessOrEqual(0, repStats.ElectionTimeUSec);
            Assert.AreEqual(repStats.EnvID, repStats.MasterEnvID);
            Assert.LessOrEqual(0, repStats.EnvPriority);
            Assert.LessOrEqual(0, repStats.FailedMessageSends);
            Assert.LessOrEqual(0, repStats.ForcedRerequests);
            Assert.LessOrEqual(0, repStats.IgnoredMessages);
            Assert.LessOrEqual(0, repStats.MasterChanges);
            Assert.LessOrEqual(0, repStats.MasterEnvID);
            Assert.LessOrEqual(0, repStats.MaxLeaseSec);
            Assert.LessOrEqual(0, repStats.MaxLeaseUSec);
            Assert.LessOrEqual(0, repStats.MaxPermanentLSN.Offset);
            Assert.LessOrEqual(0, repStats.MaxQueuedLogRecords);
            Assert.LessOrEqual(0, repStats.MessagesSent);
            Assert.LessOrEqual(0, repStats.MissedLogRecords);
            Assert.LessOrEqual(0, repStats.MissedPages);
            Assert.LessOrEqual(0, repStats.NewSiteMessages);
            Assert.LessOrEqual(repStats.MaxPermanentLSN.LogFileNumber,
                               repStats.NextLSN.LogFileNumber);
            if (repStats.MaxPermanentLSN.LogFileNumber ==
                repStats.NextLSN.LogFileNumber)
            {
                Assert.Less(repStats.MaxPermanentLSN.Offset,
                            repStats.NextLSN.Offset);
            }
            Assert.LessOrEqual(0, repStats.NextPage);
            Assert.LessOrEqual(0, repStats.Outdated);
            Assert.LessOrEqual(0, repStats.QueuedLogRecords);
            Assert.LessOrEqual(0, repStats.ReceivedLogRecords);
            Assert.LessOrEqual(0, repStats.ReceivedMessages);
            Assert.LessOrEqual(0, repStats.ReceivedPages);
            Assert.LessOrEqual(0, repStats.RegisteredSites);
            Assert.LessOrEqual(0, repStats.RegisteredSitesNeeded);
            Assert.LessOrEqual(0, repStats.Sites);
            Assert.LessOrEqual(0, repStats.StartSyncMessagesDelayed);
            Assert.AreEqual(2, repStats.Status);
            Assert.LessOrEqual(0, repStats.Throttled);
            Assert.LessOrEqual(0, repStats.Votes);

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

            // Print them out.
            env.PrintRepMgrSystemStats();

            // Wait until client has finished reading.
            masterCloseSignal.WaitOne();
            Console.WriteLine("Master: Leave as well.");

            // Close all.
            db.Close(false);
            env.LogFlush();
            env.Close();
        }
Exemplo n.º 5
0
        public void StableClient3()
        {
            string home = testHome + "/StableClient3";

            Configuration.ClearDir(home);

            client3StartSignal.WaitOne();
            Console.WriteLine("Client3: Join the replication");

            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.RepMgrLocalSite =
                new ReplicationHostAddress("127.0.0.1", 5888);
            cfg.RepSystemCfg.Priority = 80;
            cfg.RepSystemCfg.AddRemoteSite(
                new ReplicationHostAddress("127.0.0.1", 8888), false);
            cfg.RepSystemCfg.AddRemoteSite(
                new ReplicationHostAddress("127.0.0.1", 6888), true);
            cfg.RepSystemCfg.NSites          = 4;
            cfg.EventNotify                  = new EventNotifyDelegate(stuffHappened);
            cfg.RepSystemCfg.ElectionRetry   = 10;
            cfg.RepSystemCfg.RepMgrAckPolicy = AckPolicy.QUORUM;
            DatabaseEnvironment env = DatabaseEnvironment.Open(
                home, cfg);

            env.DeadlockResolution = DeadlockPolicy.DEFAULT;

            env.RepMgrStartClient(3, false);

            // Leave enough time to sync with master.
            Thread.Sleep(20000);

            // The current client site is fully initialized.
            client3ReadySignal.Set();

            // Wait for master's leave signal.
            masterLeaveSignal.WaitOne();

            /*
             * Set the master's leave signal so that other clients
             * could be informed.
             */
            masterLeaveSignal.Set();

            /*
             * Master will leave the replication after all clients'
             * initialization. Leave sometime for master to leave
             * and for clients elect.
             */
            Thread.Sleep(5000);

            ReplicationStats repStats = env.ReplicationSystemStats();

            Assert.LessOrEqual(0, repStats.Elections);
            Assert.LessOrEqual(0, repStats.ElectionTiebreaker);
            Assert.LessOrEqual(0,
                               repStats.ElectionTimeSec + repStats.ElectionTimeUSec);
            Assert.LessOrEqual(0, repStats.MasterChanges);
            Assert.LessOrEqual(0, repStats.NewSiteMessages);
            Assert.LessOrEqual(0, repStats.ReceivedLogRecords);
            Assert.LessOrEqual(0, repStats.ReceivedMessages);
            Assert.LessOrEqual(0, repStats.ReceivedPages);
            Assert.GreaterOrEqual(4, repStats.RegisteredSitesNeeded);
            Assert.LessOrEqual(0, repStats.Sites);

            /*
             * Client 3 will be the new master. The Elected master should wait
             * until all other clients leave.
             */
            Thread.Sleep(10000);

            env.LogFlush();
            env.Close();
            Console.WriteLine("Client3: Leaving the replication");
        }
Exemplo n.º 6
0
        public void StableClient2()
        {
            string home = testHome + "/StableClient2";

            Configuration.ClearDir(home);

            client2StartSignal.WaitOne();
            Console.WriteLine("Client2: Join the replication");

            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.RepMgrLocalSite =
                new ReplicationHostAddress("127.0.0.1", 6888);
            cfg.RepSystemCfg.Priority = 20;
            cfg.RepSystemCfg.AddRemoteSite(
                new ReplicationHostAddress("127.0.0.1", 8888), false);
            cfg.RepSystemCfg.AddRemoteSite(
                new ReplicationHostAddress("127.0.0.1", 7888), true);
            cfg.RepSystemCfg.NSites          = 4;
            cfg.RepSystemCfg.ElectionRetry   = 10;
            cfg.RepSystemCfg.RepMgrAckPolicy =
                AckPolicy.ONE_PEER;
            cfg.EventNotify = new EventNotifyDelegate(stuffHappened);
            DatabaseEnvironment env = DatabaseEnvironment.Open(
                home, cfg);

            env.DeadlockResolution = DeadlockPolicy.DEFAULT;

            // Start the client who will raise election if no master.
            env.RepMgrStartClient(3, true);

            // Leave enough time to sync.
            Thread.Sleep(20000);

            // The current client site is fully initialized.
            client2ReadySignal.Set();

            // Wait for master's leave signal.
            masterLeaveSignal.WaitOne();

            /*
             * Set the master's leave signal so that other clients
             * could be informed.
             */
            masterLeaveSignal.Set();

            // Leave sometime for client to hold election.
            Thread.Sleep(5000);

            env.LogFlush();
            env.Close();
            Console.WriteLine("Client2: Leaving the replication");
        }
Exemplo n.º 7
0
        public void UnstableMaster()
        {
            string home = testHome + "/UnstableMaster";

            Configuration.ClearDir(home);

            // Open environment with replication configuration.
            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.RepSystemCfg = new ReplicationConfig();
            cfg.RepSystemCfg.RepMgrLocalSite =
                new ReplicationHostAddress("127.0.0.1", 8888);
            cfg.RepSystemCfg.Priority        = 200;
            cfg.RepSystemCfg.NSites          = 4;
            cfg.RepSystemCfg.ElectionRetry   = 10;
            cfg.RepSystemCfg.RepMgrAckPolicy = AckPolicy.ALL;
            cfg.EventNotify = new EventNotifyDelegate(stuffHappened);
            DatabaseEnvironment env = DatabaseEnvironment.Open(
                home, cfg);

            env.DeadlockResolution = DeadlockPolicy.DEFAULT;

            // Start as master site.
            env.RepMgrStartMaster(3);

            Console.WriteLine("Master: Finish initialization");

            // Notify clients to join.
            client1StartSignal.Set();
            client2StartSignal.Set();
            client3StartSignal.Set();

            // Wait for initialization of all clients.
            client1ReadySignal.WaitOne();
            client2ReadySignal.WaitOne();
            client3ReadySignal.WaitOne();

            List <uint> ports = new List <uint>();

            ports.Add(5888);
            ports.Add(6888);
            ports.Add(7888);
            foreach (RepMgrSite site in env.RepMgrRemoteSites)
            {
                Assert.AreEqual("127.0.0.1", site.Address.Host);
                Assert.IsTrue(ports.Contains(site.Address.Port));
                Assert.Greater(4, site.EId);
                Assert.IsTrue(site.isConnected);
            }

            // After all of them are ready, close the current master.
            Console.WriteLine("Master: Unexpected leave.");
            env.LogFlush();
            env.Close();
            masterLeaveSignal.Set();
        }
Exemplo n.º 8
0
        public void StableClient1()
        {
            string home = testHome + "/StableClient1";

            Configuration.ClearDir(home);

            // Get notification from master and start the #1 client.
            client1StartSignal.WaitOne();
            Console.WriteLine("Client1: Join the replication");

            // Open the 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.RepMgrLocalSite =
                new ReplicationHostAddress("127.0.0.1", 7888);
            cfg.RepSystemCfg.Priority = 10;
            cfg.RepSystemCfg.AddRemoteSite(
                new ReplicationHostAddress("127.0.0.1", 8888), false);
            cfg.RepSystemCfg.AddRemoteSite(
                new ReplicationHostAddress("127.0.0.1", 5888), true);
            cfg.RepSystemCfg.NSites          = 4;
            cfg.RepSystemCfg.ElectionRetry   = 10;
            cfg.RepSystemCfg.RepMgrAckPolicy = AckPolicy.NONE;
            cfg.EventNotify = new EventNotifyDelegate(stuffHappened);
            DatabaseEnvironment env = DatabaseEnvironment.Open(
                home, cfg);

            env.DeadlockResolution = DeadlockPolicy.DEFAULT;

            // Start the client who won't raise any election.
            env.RepMgrStartClient(3, false);

            // Leave enough time to sync.
            Thread.Sleep(20000);

            // The current client site is fully initialized.
            client1ReadySignal.Set();

            foreach (RepMgrSite site in env.RepMgrRemoteSites)
            {
                if (site.Address.Port == 5888)
                {
                    Assert.IsTrue(site.isPeer);
                }
                else
                {
                    Assert.IsFalse(site.isPeer);
                }
            }

            // Wait for master's leave signal.
            masterLeaveSignal.WaitOne();

            /*
             * Set the master's leave signal so that other clients
             * could be informed.
             */
            masterLeaveSignal.Set();

            // Leave sometime for client to hold election.
            Thread.Sleep(10000);

            env.LogFlush();
            env.Close();
            Console.WriteLine("Client1: Leaving the replication");
        }
Exemplo n.º 9
0
        public void StableClient1()
        {
            string home = testHome + "/StableClient1";

            Configuration.ClearDir(home);

            // Get notification from master and start the #1 client.
            client1StartSignal.WaitOne();
            Console.WriteLine("Client1: Join the replication");

            // Open the 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]        = 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.RepSystemCfg.RepmgrSitesConfig.Add(new DbSiteConfig());
            cfg.RepSystemCfg.RepmgrSitesConfig[2]      = new DbSiteConfig();
            cfg.RepSystemCfg.RepmgrSitesConfig[2].Host = "127.0.0.1";
            cfg.RepSystemCfg.RepmgrSitesConfig[2].Port = ports[3];
            cfg.RepSystemCfg.RepmgrSitesConfig[2].Peer = true;
            cfg.RepSystemCfg.ElectionRetry             = 10;
            cfg.RepSystemCfg.RepMgrAckPolicy           = AckPolicy.NONE;
            cfg.EventNotify = new EventNotifyDelegate(stuffHappened);
            DatabaseEnvironment env = DatabaseEnvironment.Open(
                home, cfg);

            env.DeadlockResolution = DeadlockPolicy.DEFAULT;

            // Start the client who won't raise any election.
            env.RepMgrStartClient(3, false);

            // Leave enough time to sync.
            Thread.Sleep(20000);

            // Wait for master's leave signal.
            masterLeaveSignal.WaitOne();

            /*
             * Set the master's leave signal so that other clients
             * could be informed.
             */
            masterLeaveSignal.Set();

            // Leave sometime for client to hold election.
            Thread.Sleep(10000);

            env.LogFlush();
            env.Close();
            Console.WriteLine("Client1: Leaving the replication");
        }