public void RGTest()
        {
            String hostName = "192.168.20.166";
            int    port     = 45000;

            // check whether it is in the cluster environment or not
            if (!Constants.isClusterEnv(sdb))
            {
                Console.WriteLine("It's not a cluster environment.");
                return;
            }
            group = sdb.GetReplicaGroup(groupName);
            if (group == null)
            {
                group = sdb.CreateReplicaGroup(groupName);
            }
            ReplicaGroup group1 = sdb.GetReplicaGroup(group.GroupID);

            Assert.AreEqual(group.GroupName, group1.GroupName);
            ReplicaGroup group2 = sdb.GetReplicaGroup(1);

            Assert.IsNotNull(group2);
            node = group.GetNode(hostName, port);
            if (node == null)
            {
                string dbpath = config.conf.Groups[0].Nodes[0].DBPath;
                Dictionary <string, string> map = new Dictionary <string, string>();
                map.Add("diaglevel", config.conf.Groups[0].Nodes[0].DiagLevel);
                node = group.CreateNode(hostName, port, dbpath, map);
            }
            group.Start();
            int num = group.GetNodeNum(SDBConst.NodeStatus.SDB_NODE_ALL);

            Assert.IsTrue(num > 0);
            BsonDocument detail = group.GetDetail();
            string       gn     = detail["GroupName"].AsString;

            Assert.IsTrue(groupName.Equals(gn));
            SequoiaDB.Node master = group.GetMaster();
            Assert.IsNotNull(master);
            SequoiaDB.Node slave = group.GetSlave();
            Assert.IsNotNull(slave);
            Assert.IsTrue(node.Stop());
            Assert.IsTrue(node.Start());
            SDBConst.NodeStatus status = node.GetStatus();
            Assert.IsTrue(status == SDBConst.NodeStatus.SDB_NODE_ACTIVE);

            Sequoiadb db = node.Connect(config.conf.UserName, config.conf.Password);

            db.Disconnect();
            node.Stop();
            group.Stop();
        }
Example #2
0
        private int _GetMasterPosition(ReplicaGroup group)
        {
            int          primaryId           = -1;
            int          primaryNodePosition = 0;
            bool         hasPrimary          = true;
            BsonDocument detail     = group.GetDetail();
            BsonValue    groupValue = detail.Contains(SequoiadbConstants.FIELD_GROUP) ? detail[SequoiadbConstants.FIELD_GROUP] : null;

            if (groupValue == null || !groupValue.IsBsonArray)
            {
                throw new BaseException("SDB_SYS");
            }
            BsonArray nodes = groupValue.AsBsonArray;

            if (nodes.Count == 0)
            {
                throw new BaseException((int)Errors.errors.SDB_CLS_EMPTY_GROUP);
            }
            BsonValue primaryIdValue = detail.Contains(SequoiadbConstants.FIELD_PRIMARYNODE) ? detail[SequoiadbConstants.FIELD_PRIMARYNODE] : null;

            if (primaryIdValue == null)
            {
                hasPrimary = false;
            }
            else if (!primaryIdValue.IsInt32)
            {
                throw new BaseException((int)Errors.errors.SDB_SYS);
            }
            else if ((primaryId = primaryIdValue.AsInt32) == -1)
            {
                hasPrimary = false;
            }
            // try to mark the position of primary node in the nodes list,
            // the value of position is [1, 7]
            int counter = 0;

            foreach (BsonDocument node in nodes)
            {
                counter++;
                BsonValue nodeIdValue = node.Contains(SequoiadbConstants.FIELD_NODEID) ? node[SequoiadbConstants.FIELD_NODEID] : null;
                if (nodeIdValue == null || !nodeIdValue.IsInt32)
                {
                    throw new BaseException((int)Errors.errors.SDB_SYS, "invalid node id in node list");
                }
                int nodeId = nodeIdValue.AsInt32;
                if (hasPrimary && primaryId == nodeId)
                {
                    primaryNodePosition = counter;
                }
            }
            return(primaryNodePosition);
        }
Example #3
0
        public void GetMasterAndSlaveNodeTest()
        {
            if (!isCluster)
            {
                return;
            }
            groupName = "SYSCatalogGroup";
            group     = sdb.GetReplicaGroup(groupName);
            BsonDocument detail              = group.GetDetail();
            BsonArray    nodeList            = (BsonArray)detail["Group"];
            int          primaryNodePosition = _GetMasterPosition(group);
            int          nodeCount           = nodeList.Count;

            Assert.IsTrue(nodeCount != 0);

            SequoiaDB.Node master = null;
            SequoiaDB.Node slave  = null;

            // case 1
            master = group.GetMaster();
            slave  = group.GetSlave();
            Console.WriteLine(String.Format("case1: group is: {0}, master is: {1}, slave is: {2}", groupName,
                                            master == null ? null : master.NodeName,
                                            slave == null ? null : slave.NodeName));
            if (nodeCount == 1)
            {
                Assert.AreEqual(master.NodeName, slave.NodeName);
            }
            else
            {
                Assert.AreNotEqual(master.NodeName, slave.NodeName);
            }

            // case 2
            slave = group.GetSlave(1, 2, 3, 4, 5, 6, 7);
            Console.WriteLine(String.Format("case2: group is: {0}, master is: {1}, slave is: {2}", groupName,
                                            master == null ? null : master.NodeName,
                                            slave == null ? null : slave.NodeName));
            if (nodeCount == 1)
            {
                Assert.AreEqual(master.NodeName, slave.NodeName);
            }
            else
            {
                Assert.AreNotEqual(master.NodeName, slave.NodeName);
            }

            // case 3
            Random random = new Random();
            int    pos1   = random.Next(7) + 1;
            int    pos2   = 0;

            while (true)
            {
                pos2 = random.Next(7) + 1;
                if (pos2 != pos1)
                {
                    break;
                }
            }
            //pos1 = 4; pos2 = 7;
            slave = group.GetSlave(pos1, pos2);
            Console.WriteLine(String.Format("case3: group is: {0}, master is: {1}, slave is: {2}", groupName,
                                            master == null ? null : master.NodeName,
                                            slave == null ? null : slave.NodeName));
            if (nodeCount == 1)
            {
                Assert.AreEqual(master.NodeName, slave.NodeName);
            }
            else
            {
                if ((pos1 % nodeCount == pos2 % nodeCount) &&
                    (primaryNodePosition == (pos1 - 1) % nodeCount + 1))
                {
                    Assert.AreEqual(master.NodeName, slave.NodeName);
                }
                else
                {
                    Assert.AreNotEqual(master.NodeName, slave.NodeName);
                }
            }
        }