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)); } } } }
/// <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); }
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); } } }
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)); } }
public void Dispose(bool disposing) { if (!Disposed && disposing) { GC.SuppressFinalize(this); } foreach (var configObserver in ConfigObservers) { UnRegisterObserver(configObserver.Value); } ConfigObservers.Clear(); Disposed = true; }
/// <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(); } }
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)); }