/// <summary> /// Compare the current RS (CurrentReplicaSetStatus) with what it should be ie the list of instances in our role (Endpoints) /// </summary> /// <param name="CurrentReplicaSetStatus"></param> /// <param name="Endpoints"></param> /// <returns></returns> public static bool AreReplicaSetConfigEqual(ReplicaSetStatus CurrentReplicaSetStatus, List<NodeEndPoint> Endpoints) { if (CurrentReplicaSetStatus.Members.Count != Endpoints.Count) return false; //Check that every endpoints is in the replicatset config foreach (NodeEndPoint node in Endpoints) { if (CurrentReplicaSetStatus.Members.FirstOrDefault(m => node == new NodeEndPoint(m.Adress,Int32.Parse(m.Port))) == null) return false; } return true; }
private bool IsCurrentConfigurationCorrect(ReplicaSetStatus CurrentReplicaSetStatus) { List<NodeEndPoint> ThisRSendpoints = MongoDBAzurePlatform.Instance.GetReplicaSetMembers(RoleEnvironment.CurrentRoleInstance.Id); return MongoHelper.AreReplicaSetConfigEqual(CurrentReplicaSetStatus, ThisRSendpoints); }
/// <summary> /// Récupère le status des replicaSets /// </summary> /// <returns></returns> public static ReplicaSetStatus GetReplicaSetStatus(NodeEndPoint nodeEndpoint) { MongoServer server = CreateMongoServer(nodeEndpoint); try { var statusCommand = new CommandDocument { { "replSetGetStatus", 1 } }; CommandResult result = server.RunAdminCommand(statusCommand); if (!result.Ok) return null; ReplicaSetStatus status = new ReplicaSetStatus(); foreach (var item in result.Response) { switch (item.Name) { case "set": status.ReplicasetName = item.Value.AsString; break; case "date": status.Date = item.Value.AsDateTime; break; case "members": foreach (var item2 in item.Value.AsBsonArray) { ReplicaSetNode node = new ReplicaSetNode(); foreach (var member in item2.AsBsonDocument) { switch (member.Name) { case "_id": node.Id = member.Value.AsInt32; break; case "name": string[] fullAdress = member.Value.AsString.Split(':'); if (fullAdress.Length > 1) { node.Adress = fullAdress[0]; node.Port = fullAdress[1]; } else node.Adress = member.Value.AsString; break; case "health": node.Health = member.Value.AsDouble == 0 ? "Down" : "Up"; break; case "stateStr": node.StateStr = member.Value.AsString; break; case "state": node.State = ReplicaSetNode.GetStateFromInt(member.Value.AsInt32); break; case "optimeDate": node.OpTime = member.Value.AsDateTime; break; case "errmsg": node.ErrMsg = member.Value.AsString; break; default: break; } } status.Members.Add(node); } break; default: break; } } return status; } catch (Exception ex) { if (ex.Message.Contains("(EMPTYCONFIG)")) { ReplicaSetStatus status = new ReplicaSetStatus(); status.IsEmptyConfig = true; Trace.TraceWarning(string.Format("MongoHelper.GetStatus Exception : {0}", ex)); return status; } else { Trace.TraceError(string.Format("MongoHelper.GetStatus Exception : {0}", ex)); return null; } } }