// constructors /// <summary> /// Initializes a new instance of the <see cref="ReplicaSetInformation"/> class. /// </summary> /// <param name="name">The name.</param> /// <param name="primary">The primary.</param> /// <param name="members">The members.</param> /// <param name="tagSet">The tag set.</param> public ReplicaSetInformation(string name, MongoServerAddress primary, IEnumerable <MongoServerAddress> members, ReplicaSetTagSet tagSet) { _name = name; _primary = primary; _members = members == null ? new List <MongoServerAddress>() : members.ToList(); _tagSet = tagSet.FrozenCopy(); }
// constructors /// <summary> /// Initializes a new instance of the <see cref="ReplicaSetInformation"/> class. /// </summary> /// <param name="name">The name.</param> /// <param name="primary">The primary.</param> /// <param name="members">The members.</param> /// <param name="tagSet">The tag set.</param> public ReplicaSetInformation(string name, MongoServerAddress primary, IEnumerable <MongoServerAddress> members, ReplicaSetTagSet tagSet) { if (name == null) { throw new ArgumentNullException("name"); } _name = name; _primary = primary; _members = members == null ? new List <MongoServerAddress>() : members.ToList(); _tagSet = tagSet.FrozenCopy(); }
public void TestAreNotEqualWhenTagsAreNotEqual() { var tagSet1 = new ReplicaSetTagSet { new ReplicaSetTag("dc", "ny") }; var tagSet2 = new ReplicaSetTagSet { new ReplicaSetTag("dc", "tx") }; Assert.AreNotEqual(tagSet1, tagSet2); }
public void TestGetHashCodeIsSameWhenTagsAreTheSame() { var tagSet1 = new ReplicaSetTagSet { new ReplicaSetTag("dc", "ny") }; var tagSet2 = new ReplicaSetTagSet { new ReplicaSetTag("dc", "ny") }; Assert.AreEqual(tagSet1.GetHashCode(), tagSet2.GetHashCode()); }
public void TestReadPreference_SecondaryWithTwoTagSets() { var tagSets = new ReplicaSetTagSet[] { new ReplicaSetTagSet { { "dc", "ny" }, { "rack", "1" } }, new ReplicaSetTagSet { { "dc", "sf" } } }; var readPreference = new ReadPreference { ReadPreferenceMode = ReadPreferenceMode.Secondary, TagSets = tagSets }; var built = new MongoUrlBuilder { Server = _localhost, ReadPreference = readPreference }; var connectionString = "mongodb://localhost/?readPreference=secondary;readPreferenceTags=dc:ny,rack:1;readPreferenceTags=dc:sf"; foreach (var builder in EnumerateBuiltAndParsedBuilders(built, connectionString)) { Assert.AreEqual(ReadPreferenceMode.Secondary, builder.ReadPreference.ReadPreferenceMode); var builderTagSets = builder.ReadPreference.TagSets.ToArray(); Assert.AreEqual(2, builderTagSets.Length); var builderTagSet1Tags = builderTagSets[0].Tags.ToArray(); var builderTagSet2Tags = builderTagSets[1].Tags.ToArray(); Assert.AreEqual(2, builderTagSet1Tags.Length); Assert.AreEqual(new ReplicaSetTag("dc", "ny"), builderTagSet1Tags[0]); Assert.AreEqual(new ReplicaSetTag("rack", "1"), builderTagSet1Tags[1]); Assert.AreEqual(1, builderTagSet2Tags.Length); Assert.AreEqual(new ReplicaSetTag("dc", "sf"), builderTagSet2Tags[0]); Assert.AreEqual(connectionString, builder.ToString()); } }
internal static ReplicaSetTagSet ParseReplicaSetTagSet(string name, string s) { var tagSet = new ReplicaSetTagSet(); foreach (var tagString in s.Split(',')) { var parts = tagString.Split(':'); if (parts.Length != 2) { throw new FormatException(FormatMessage(name, s)); } var tag = new ReplicaSetTag(parts[0].Trim(), parts[1].Trim()); tagSet.Add(tag); } return tagSet; }
public void TestReadPreferenceSecondaryWithOneTagSet() { var tagSets = new ReplicaSetTagSet[] { new ReplicaSetTagSet { { "dc", "ny" }, { "rack", "1" } } }; var readPreference = new ReadPreference { ReadPreferenceMode = ReadPreferenceMode.Secondary, TagSets = tagSets }; var builder = new MongoUrlBuilder("mongodb://localhost") { ReadPreference = readPreference }; Assert.AreEqual(ReadPreferenceMode.Secondary, builder.ReadPreference.ReadPreferenceMode); var builderTagSets = builder.ReadPreference.TagSets.ToArray(); Assert.AreEqual(1, builderTagSets.Length); var builderTagSet1Tags = builderTagSets[0].Tags.ToArray(); Assert.AreEqual(2, builderTagSet1Tags.Length); Assert.AreEqual(new ReplicaSetTag("dc", "ny"), builderTagSet1Tags[0]); Assert.AreEqual(new ReplicaSetTag("rack", "1"), builderTagSet1Tags[1]); var connectionString = "mongodb://localhost/?readPreference=secondary;readPreferenceTags=dc:ny,rack:1"; Assert.AreEqual(connectionString, builder.ToString()); Assert.AreEqual(connectionString, new MongoUrlBuilder(connectionString).ToString()); }
// private methods private void LookupServerInformation(MongoConnection connection) { IsMasterResult isMasterResult = null; bool ok = false; try { var isMasterCommand = new CommandDocument("ismaster", 1); var tempResult = connection.RunCommand("admin", QueryFlags.SlaveOk, isMasterCommand, false); isMasterResult = new IsMasterResult(); isMasterResult.Initialize(isMasterCommand, tempResult.Response); if (!isMasterResult.Ok) { throw new MongoCommandException(isMasterResult); } MongoServerBuildInfo buildInfo; var buildInfoCommand = new CommandDocument("buildinfo", 1); var buildInfoResult = connection.RunCommand("admin", QueryFlags.SlaveOk, buildInfoCommand, false); if (buildInfoResult.Ok) { buildInfo = MongoServerBuildInfo.FromCommandResult(buildInfoResult); } else { // short term fix: if buildInfo fails due to auth we don't know the server version; see CSHARP-324 if (buildInfoResult.ErrorMessage != "need to login") { throw new MongoCommandException(buildInfoResult); } buildInfo = null; } ReplicaSetInformation replicaSetInformation = null; MongoServerInstanceType instanceType = MongoServerInstanceType.StandAlone; if (isMasterResult.ReplicaSetName != null) { var tagSet = new ReplicaSetTagSet(); var peers = isMasterResult.Hosts.Concat(isMasterResult.Passives).Concat(isMasterResult.Arbiters).ToList(); replicaSetInformation = new ReplicaSetInformation(isMasterResult.ReplicaSetName, isMasterResult.Primary, peers, tagSet); instanceType = MongoServerInstanceType.ReplicaSetMember; } else if (isMasterResult.Message != null && isMasterResult.Message == "isdbgrid") { instanceType = MongoServerInstanceType.ShardRouter; } lock (_serverInstanceLock) { _isMasterResult = isMasterResult; _maxDocumentSize = isMasterResult.MaxBsonObjectSize; _maxMessageLength = isMasterResult.MaxMessageLength; _buildInfo = buildInfo; this.SetState(MongoServerState.Connected, instanceType, isMasterResult.IsPrimary, isMasterResult.IsSecondary, isMasterResult.IsPassive, isMasterResult.IsArbiterOnly, replicaSetInformation); } ok = true; } finally { if (!ok) { lock (_serverInstanceLock) { _isMasterResult = isMasterResult; _maxDocumentSize = MongoDefaults.MaxDocumentSize; _maxMessageLength = MongoDefaults.MaxMessageLength; _buildInfo = null; this.SetState(MongoServerState.Disconnected, _instanceType, false, false, false, false, null); } } } }
private IEnumerable<ReplicaSetTagSet> ParseReplicaSetTagSets(string value) { var tagSets = new List<ReplicaSetTagSet>(); foreach (var tagSetString in value.Split('|')) { var tagSet = new ReplicaSetTagSet(); foreach (var tagString in tagSetString.Split(',')) { var parts = tagString.Split(':'); if (parts.Length != 2) { var message = string.Format("Invalid tag: {0}.", tagString); } var tag = new ReplicaSetTag(parts[0], parts[1]); tagSet.Add(tag); } tagSets.Add(tagSet); } return tagSets; }
public void TestReadPreferenceSecondaryWithTwoTagSets() { var tagSets = new ReplicaSetTagSet[] { new ReplicaSetTagSet { { "dc", "ny" }, { "rack", "1" } }, new ReplicaSetTagSet { { "dc", "sf" } } }; var readPreference = new ReadPreference { ReadPreferenceMode = ReadPreferenceMode.Secondary, TagSets = tagSets }; var builder = new MongoConnectionStringBuilder() { Server = __localhost, ReadPreference = readPreference }; Assert.AreEqual(ReadPreferenceMode.Secondary, builder.ReadPreference.ReadPreferenceMode); var builderTagSets = builder.ReadPreference.TagSets.ToArray(); Assert.AreEqual(2, builderTagSets.Length); var builderTagSet1Tags = builderTagSets[0].Tags.ToArray(); var builderTagSet2Tags = builderTagSets[1].Tags.ToArray(); Assert.AreEqual(2, builderTagSet1Tags.Length); Assert.AreEqual(new ReplicaSetTag("dc", "ny"), builderTagSet1Tags[0]); Assert.AreEqual(new ReplicaSetTag("rack", "1"), builderTagSet1Tags[1]); Assert.AreEqual(1, builderTagSet2Tags.Length); Assert.AreEqual(new ReplicaSetTag("dc", "sf"), builderTagSet2Tags[0]); var connectionString = "server=localhost;readPreference=secondary;readPreferenceTags=dc:ny,rack:1|dc:sf"; Assert.AreEqual(connectionString, builder.ToString()); Assert.AreEqual(connectionString, new MongoConnectionStringBuilder(connectionString).ToString()); }