public override void UnRegisterObserver(IConfigObserver observer)
        {
            IConfigObserver observerToRemove;

            if (ConfigObservers.TryRemove(observer.Name, out observerToRemove))
            {
                var temp = observerToRemove;
                Log.Info(m => m("Unregistering observer {0}", temp.Name));

                IConfigInfo configInfo;
                if (Configs.TryRemove(observer.Name, out configInfo))
                {
                    configInfo.Dispose();
                    Log.Info(m => m("Removing config for observer {0}", observer.Name));
                }
                else
                {
                    Log.Warn(m => m("Could not remove config for {0}", observer.Name));
                }
            }
            else
            {
                Log.Warn(m => m("Could not unregister observer {0}", observer.Name));
            }
        }
        /// <summary>
        /// Un-registers an observer, which is either a Couchbase or Memcached Bucket, from the provider.
        /// </summary>
        /// <param name="observer"></param>
        public override void UnRegisterObserver(IConfigObserver observer)
        {
            try
            {
                ConfigLock.EnterWriteLock();
                Thread thread;
                if (_threads.TryRemove(observer.Name, out thread))
                {
                    CancellationTokenSource cancellationTokenSource;
                    if (_cancellationTokens.TryRemove(observer.Name, out cancellationTokenSource))
                    {
                        Log.Info("Cancelling {0}", observer.Name);
                        cancellationTokenSource.Cancel();
                        cancellationTokenSource.Dispose();
                    }

                    IConfigObserver temp;
                    if (ConfigObservers.TryRemove(observer.Name, out temp))
                    {
                        Log.Info("Removing observer for {0}", observer.Name);
                    }

                    IConfigInfo configInfo;
                    if (Configs.TryRemove(observer.Name, out configInfo))
                    {
                        configInfo.Dispose();
                        Log.Info("Removing config for {0}", observer.Name);
                    }
                }
            }
            finally
            {
                ConfigLock.ExitWriteLock();
            }
        }
 public void Dispose(bool disposing)
 {
     try
     {
         ConfigLock.EnterWriteLock();
         if (!Disposed && disposing)
         {
             GC.SuppressFinalize(this);
         }
         if (_heartBeat != null)
         {
             _heartBeat.Dispose();
         }
         foreach (var configObserver in ConfigObservers)
         {
             UnRegisterObserver(configObserver.Value);
         }
         ConfigObservers.Clear();
         Disposed = true;
     }
     finally
     {
         ConfigLock.ExitWriteLock();
     }
 }
        /// <summary>
        /// Raised when a configuration update has occurred. All observers will be notified of the changes.
        /// </summary>
        /// <param name="bucketConfig">The new configuration.</param>
        void ConfigChangedHandler(IBucketConfig bucketConfig)
        {
            IConfigObserver configObserver;

            if (ConfigObservers.TryGetValue(bucketConfig.Name, out configObserver))
            {
                IConfigInfo configInfo;
                if (Configs.TryGetValue(configObserver.Name, out configInfo))
                {
                    var staleBucketConfig = configInfo.BucketConfig;
                    if (bucketConfig.Rev > staleBucketConfig.Rev)
                    {
                        configInfo.LoadConfig(bucketConfig);
                    }
                }
                else
                {
                    configInfo = CreateConfigInfo(bucketConfig);
                    Configs.TryAdd(bucketConfig.Name, configInfo);
                }

                UpdateBootstrapList(bucketConfig);
                configObserver.NotifyConfigChanged(configInfo);
            }
            SignalCountdownEvent();
        }
        /// <summary>
        /// Un-registers an observer, which is either a Couchbase or Memcached Bucket, from the Provider.
        /// </summary>
        /// <param name="observer"></param>
        public override void UnRegisterObserver(IConfigObserver observer)
        {
            lock (SyncObj)
            {
                Thread thread;
                if (_threads.TryRemove(observer.Name, out thread))
                {
                    CancellationTokenSource cancellationTokenSource;
                    if (_cancellationTokens.TryRemove(observer.Name, out cancellationTokenSource))
                    {
                        Log.Info(m => m("Cancelling {0}", observer.Name));
                        cancellationTokenSource.Cancel();
                        cancellationTokenSource.Dispose();
                    }

                    IConfigObserver temp;
                    if (ConfigObservers.TryRemove(observer.Name, out temp))
                    {
                        Log.Info(m => m("Removing observer for {0}", observer.Name));
                    }

                    IConfigInfo configInfo;
                    if (Configs.TryRemove(observer.Name, out configInfo))
                    {
                        Log.Info(m => m("Removing config for {0}", observer.Name));
                    }
                }
            }
        }
Beispiel #6
0
        /// <summary>
        /// Registers an <see cref="IConfigObserver"/> object, which is notified when a configuration changes.
        /// </summary>
        /// <param name="observer">The <see cref="IConfigObserver"/> that will be notified when a configuration
        /// update occurs. These are Memcached and Couchbase Buckets.</param>
        /// <returns>True if the observer was registered without failure.</returns>
        public override bool RegisterObserver(IConfigObserver observer)
        {
            var hasRegistered = false;
            var bucketConfig  = _serverConfig.Buckets.Find(x => x.Name == observer.Name);

            if (bucketConfig == null)
            {
                throw new BucketNotFoundException(observer.Name);
            }

            var cancellationTokenSource = new CancellationTokenSource();

            _cancellationTokens[observer.Name] = cancellationTokenSource;

            var configThreadState = new ConfigThreadState(bucketConfig, ConfigChangedHandler, ErrorOccurredHandler, cancellationTokenSource.Token);
            var thread            = new Thread(configThreadState.ListenForConfigChanges);

            if (_threads.TryAdd(observer.Name, thread) && ConfigObservers.TryAdd(observer.Name, observer))
            {
                _threads[observer.Name].Start();

                if (CountdownEvent.CurrentCount == 0)
                {
                    CountdownEvent.Reset(1);
                }

                //TODO add timeout?
                CountdownEvent.Wait(cancellationTokenSource.Token);
                hasRegistered = true;
            }
            return(hasRegistered);
        }
Beispiel #7
0
        public void UpdateConfig(IBucketConfig bucketConfig)
        {
            IConfigObserver configObserver;

            if (!ConfigObservers.TryGetValue(bucketConfig.Name, out configObserver))
            {
                Log.Warn(x => x("A ConfigObserver for the bucket {0} was not found. Provider has been disposed: {1}",
                                bucketConfig.Name, Disposed));
                return;
            }

            IConfigInfo oldConfigInfo;

            if (!Configs.TryGetValue(bucketConfig.Name, out oldConfigInfo))
            {
                throw new ConfigNotFoundException(bucketConfig.Name);
            }

            var oldBucketConfig = oldConfigInfo.BucketConfig;

            if (bucketConfig.Rev > oldBucketConfig.Rev)
            {
                var configInfo = GetConfig(bucketConfig);
                if (Configs.TryUpdate(bucketConfig.Name, configInfo, oldConfigInfo))
                {
                    configObserver.NotifyConfigChanged(configInfo);
                }
            }
        }
Beispiel #8
0
        public void UpdateConfig(IBucketConfig bucketConfig)
        {
            IConfigObserver configObserver;

            if (ConfigObservers.TryGetValue(bucketConfig.Name, out configObserver))
            {
                IConfigInfo configInfo;
                if (Configs.TryGetValue(bucketConfig.Name, out configInfo))
                {
                    var oldBucketConfig = configInfo.BucketConfig;
                    if (bucketConfig.Rev > oldBucketConfig.Rev)
                    {
                        Log.Info(m => m("New config has changed new Rev#{0} | old Rev#{1} CCCP: {2}", bucketConfig.Rev, oldBucketConfig.Rev, JsonConvert.SerializeObject(bucketConfig)));
                        configInfo.LoadConfig(bucketConfig);
                        UpdateBootstrapList(bucketConfig);
                        configObserver.NotifyConfigChanged(configInfo);
                    }
                }
                else
                {
                    throw new ConfigNotFoundException(bucketConfig.Name);
                }
            }
            else
            {
                Log.Warn(m => m("No ConfigObserver found for bucket [{0}]", bucketConfig.Name));
            }
        }
        /// <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));
            }
        }
Beispiel #11
0
 public void Dispose(bool disposing)
 {
     if (!Disposed && disposing)
     {
         GC.SuppressFinalize(this);
     }
     foreach (var configObserver in ConfigObservers)
     {
         UnRegisterObserver(configObserver.Value);
     }
     ConfigObservers.Clear();
     Disposed = true;
 }
Beispiel #12
0
        /// <summary>
        /// Updates the new configuration if the new configuration revision is greater than the current configuration.
        /// </summary>
        /// <param name="bucketConfig">The bucket cluster map configuration.</param>
        /// <param name="force">if set to <c>true</c> [force].</param>
        public override void UpdateConfig(IBucketConfig bucketConfig, bool force = false)
        {
            try
            {
                ConfigLock.EnterWriteLock();
                IConfigObserver configObserver;
                if (!ConfigObservers.TryGetValue(bucketConfig.Name, out configObserver))
                {
                    // Observer has been unregistered
                    return;
                }

                IConfigInfo configInfo;
                if (Configs.TryGetValue(configObserver.Name, out configInfo))
                {
                    var staleBucketConfig = configInfo.BucketConfig;

                    Log.Info("Config [{0}] changed new Rev#{1} | old Rev#{2} HTTP: {3}",
                             bucketConfig.Name, bucketConfig.Rev, staleBucketConfig.Rev, JsonConvert.SerializeObject(bucketConfig));

                    if (bucketConfig.Rev > staleBucketConfig.Rev)
                    {
                        configInfo.LoadConfig(bucketConfig);
                    }
                }
                else
                {
                    configInfo = CreateConfigInfo(bucketConfig, null, null);
                    Configs.TryAdd(bucketConfig.Name, configInfo);
                }
                LogServers(configInfo);

                try
                {
                    ClientConfig.UpdateBootstrapList(bucketConfig);
                    configObserver.NotifyConfigChanged(configInfo);
                }
                catch (Exception e)
                {
                    Log.Error(e);
                }
                SignalCountdownEvent();
            }
            finally
            {
                ConfigLock.ExitWriteLock();
            }
        }
Beispiel #13
0
 public void Dispose(bool disposing)
 {
     lock (SyncObj)
     {
         if (!Disposed && disposing)
         {
             GC.SuppressFinalize(this);
         }
         if (_heartBeat != null)
         {
             _heartBeat.Dispose();
         }
         foreach (var configObserver in ConfigObservers)
         {
             UnRegisterObserver(configObserver.Value);
         }
         ConfigObservers.Clear();
         Disposed = true;
     }
 }
 public void Dispose(bool disposing)
 {
     try
     {
         ConfigLock.EnterWriteLock();
         {
             if (!_disposed && disposing)
             {
                 GC.SuppressFinalize(this);
             }
             foreach (var configObserver in ConfigObservers)
             {
                 UnRegisterObserver(configObserver.Value);
             }
             ConfigObservers.Clear();
             _threads.Clear();
             _disposed = true;
         }
     }
     finally
     {
         ConfigLock.ExitWriteLock();
     }
 }
 /// <summary>
 /// Checks to see if an observer has been registered.
 /// </summary>
 /// <param name="observer"></param>
 /// <returns></returns>
 public virtual bool ObserverExists(IConfigObserver observer)
 {
     return(ConfigObservers.ContainsKey(observer.Name));
 }
 public override bool RegisterObserver(IConfigObserver observer)
 {
     return(ConfigObservers.TryAdd(observer.Name, observer));
 }