// 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();
 }
Exemple #2
0
        // 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();
        }
Exemple #3
0
        public void TestAreNotEqualWhenTagsAreNotEqual()
        {
            var tagSet1 = new ReplicaSetTagSet
            {
                new ReplicaSetTag("dc", "ny")
            };

            var tagSet2 = new ReplicaSetTagSet
            {
                new ReplicaSetTag("dc", "tx")
            };

            Assert.AreNotEqual(tagSet1, tagSet2);
        }
Exemple #4
0
        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 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());
        }