/// <summary>
        /// Updates the new configuration if the new configuration revision is greater than the current configuration.
        /// </summary>
        /// <param name="bucketConfig">The bucket configuration.</param>
        /// <param name="force">if set to <c>true</c> [force].</param>
        public override void UpdateConfig(IBucketConfig bucketConfig, bool force = false)
        {
            IConfigObserver configObserver;

            if (ConfigObservers != null && ConfigObservers.TryGetValue(bucketConfig.Name, out configObserver))
            {
                IConfigInfo configInfo;
                if (Configs.TryGetValue(bucketConfig.Name, out configInfo))
                {
                    try
                    {
                        Log.Debug("1. Checking config [{0}] with rev#{1} on thread {2}", bucketConfig.Name, bucketConfig.Rev, Thread.CurrentThread.ManagedThreadId);
                        var oldBucketConfig = configInfo.BucketConfig;
                        if (bucketConfig.Rev > oldBucketConfig.Rev)
                        {
                            lock (SyncObj)
                            {
                                Log.Debug("2. Checking config [{0}] with rev#{1} on thread {2}", bucketConfig.Name, bucketConfig.Rev, Thread.CurrentThread.ManagedThreadId);
                                if (bucketConfig.Rev > oldBucketConfig.Rev || !bucketConfig.Equals(oldBucketConfig) ||
                                    force)
                                {
                                    Log.Info(
                                        "Config changed (forced:{0}) new Rev#{1} | old Rev#{2} CCCP: {3}", force,
                                        bucketConfig.Rev, oldBucketConfig.Rev,
                                        JsonConvert.SerializeObject(bucketConfig));

                                    //Set the password on the new server configuration
                                    var clientBucketConfig = GetOrCreateConfiguration(bucketConfig.Name);
                                    bucketConfig.Password = clientBucketConfig.Password;

                                    configInfo.LoadConfig(bucketConfig, force);
                                    ClientConfig.UpdateBootstrapList(bucketConfig);
                                    configObserver.NotifyConfigChanged(configInfo);
                                    Log.Debug("3. Completed checking config [{0}] with rev#{1} on thread {2}", bucketConfig.Name, bucketConfig.Rev, Thread.CurrentThread.ManagedThreadId);
                                }
                            }
                        }
                        else
                        {
                            Log.Info("Ignoring config with rev#{0}", bucketConfig.Rev);
                        }
                    }
                    catch (Exception e)
                    {
                        Log.Debug("Ack! rev#{0} on thread {1}", bucketConfig.Rev, Thread.CurrentThread.ManagedThreadId);
                        Log.Info(e);
                    }
                }
                else
                {
                    throw new ConfigNotFoundException(bucketConfig.Name);
                }
                LogServers(configInfo);
            }
            else
            {
                Log.Warn("No ConfigObserver found for bucket [{0}]", bucketConfig.Name);
            }
        }
        public void UpdateConfig(IBucketConfig bucketConfig, bool force = false)
        {
            IConfigObserver configObserver;

            if (ConfigObservers != null && ConfigObservers.TryGetValue(bucketConfig.Name, out configObserver))
            {
                IConfigInfo configInfo;
                if (Configs.TryGetValue(bucketConfig.Name, out configInfo))
                {
                    var lockTaken = false;
                    try
                    {
                        Monitor.TryEnter(configInfo, ref lockTaken);
                        if (!lockTaken)
                        {
                            return;
                        }

                        var oldBucketConfig = configInfo.BucketConfig;
                        if (bucketConfig.Rev > oldBucketConfig.Rev || !bucketConfig.Equals(oldBucketConfig) || force)
                        {
                            Log.Info(
                                m =>
                                m("Config changed (forced:{0}) new Rev#{1} | old Rev#{2} CCCP: {3}", force,
                                  bucketConfig.Rev, oldBucketConfig.Rev,
                                  JsonConvert.SerializeObject(bucketConfig)));

                            //Set the password on the new server configuration
                            var clientBucketConfig = GetOrCreateConfiguration(bucketConfig.Name);
                            bucketConfig.Password = clientBucketConfig.Password;

                            configInfo.LoadConfig(bucketConfig, force);
                            ClientConfig.UpdateBootstrapList(bucketConfig);
                            configObserver.NotifyConfigChanged(configInfo);
                        }
                    }
                    finally
                    {
                        if (lockTaken)
                        {
                            Monitor.Exit(configInfo);
                        }
                    }
                }
                else
                {
                    throw new ConfigNotFoundException(bucketConfig.Name);
                }
            }
            else
            {
                Log.Warn(m => m("No ConfigObserver found for bucket [{0}]", bucketConfig.Name));
            }
        }
        public void UpdateConfig(IBucketConfig bucketConfig, bool force = false)
        {
            IConfigObserver configObserver;
            if (ConfigObservers != null && ConfigObservers.TryGetValue(bucketConfig.Name, out configObserver))
            {
                IConfigInfo configInfo;
                if (Configs.TryGetValue(bucketConfig.Name, out configInfo))
                {
                    var lockTaken = false;
                    try
                    {
                        Monitor.TryEnter(configInfo, ref lockTaken);
                        if (!lockTaken) return;

                        var oldBucketConfig = configInfo.BucketConfig;
                        if (bucketConfig.Rev > oldBucketConfig.Rev || !bucketConfig.Equals(oldBucketConfig) || force)
                        {
                            Log.LogInformation("Config changed (forced:{0}) new Rev#{1} | old Rev#{2} CCCP: {3}", force,
                                        bucketConfig.Rev, oldBucketConfig.Rev,
                                        JsonConvert.SerializeObject(bucketConfig));

                            //Set the password on the new server configuration
                            var clientBucketConfig = GetOrCreateConfiguration(bucketConfig.Name);
                            bucketConfig.Password = clientBucketConfig.Password;

                            configInfo.LoadConfig(bucketConfig, force);
                            ClientConfig.UpdateBootstrapList(bucketConfig);
                            configObserver.NotifyConfigChanged(configInfo);
                        }
                    }
                    finally
                    {
                        if (lockTaken)
                        {
                            Monitor.Exit(configInfo);
                        }
                    }
                }
                else
                {
                    throw new ConfigNotFoundException(bucketConfig.Name);
                }
            }
            else
            {
                Log.LogWarning("No ConfigObserver found for bucket [{0}]", bucketConfig.Name);
            }
        }