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(); }
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); }
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); } } }