/// <summary> /// Создать объект репликации /// </summary> /// <param name="replicationInfo">Информация о реплицируемом объекте</param> public void CreateReplicationObject(ReplicationInfo replicationInfo) { lock (_replicationObjects) { _replicationObjects.Add(replicationInfo); } }
/// <summary> /// Удалить объект репликации /// </summary> /// <param name="replicationInfo">Информация о реплицируемом объекте</param> public void DeleteReplicationObject(ReplicationInfo replicationInfo) { lock (_replicationObjects) { _replicationObjects.RemoveAll(r => String.Compare(r.Uid.ToString(), replicationInfo.Uid.ToString(), StringComparison.OrdinalIgnoreCase) == 0); } }
/// <summary> /// Уведомить об изменении объекта /// </summary> /// <param name="replicationInfo">Информация о реплицируемом объекте</param> /// <param name="operationType">Тип операции репликации</param> public void SimulateObjectChanged(ReplicationInfo replicationInfo, OperationType operationType) { var newProperties = replicationInfo.Properties; var uid = replicationInfo.Uid.ToString(); if (typeof(T).FullName == replicationInfo.FullName) { IReplicationObject replicationObject; if (operationType == OperationType.Create) { replicationObject = new T(); SetReplicationObjectProperties(replicationObject, newProperties); replicationObject.PropertyChanged += PropertyChangedHandler; _replicationObjects.Add(replicationObject); } else { replicationObject = _replicationObjects.FirstOrDefault(ro => String.Compare(ro.Uid, uid, StringComparison.OrdinalIgnoreCase) == 0) ?? new T(); SetReplicationObjectProperties(replicationObject, newProperties); if (operationType == OperationType.Delete) { _replicationObjects.RemoveAll(r => r.Uid == uid); } } RaiseObjectReplicated(replicationObject, operationType); } }
/// <summary> /// Отправить уведомление об изменении состоянии объекта /// </summary> /// <param name="replicationInfo">Информация о реплицируемом объекте</param> /// <param name="operationType">Тип операции репликации</param> /// <param name="sender">Отправитель</param> public void SendObjectChanged(ReplicationInfo replicationInfo, OperationType operationType, IReplicationCallbackContract sender) { IReplicationCallbackContract[] subscribersCopy; lock (_subscribers) { subscribersCopy = _subscribers.Where(s => s != sender).ToArray(); } foreach (var subscriber in subscribersCopy) { if (((ICommunicationObject)subscriber).State == CommunicationState.Opened) { try { subscriber.SimulateObjectChanged(replicationInfo, operationType); } catch (Exception ex) { //TODO сделать лог } } else { RemoveSubscriber(subscriber); } } }
public RedisInfo() { Replication = new ReplicationInfo(); Clients = new ClientInfo(); Server = new ServerInfo(); Memory = new MemoryInfo(); Persistence = new PersistenceInfo(); Stats = new StatsInfo(); CPU = new CPUInfo(); Keyspace = new KeyspaceInfo(); }
/// <summary> /// Обновить объект репликации /// </summary> /// <param name="replicationInfo">Информация о реплицируемом объекте</param> public void UpdateReplicationObject(ReplicationInfo replicationInfo) { lock (_replicationObjects) { var existedReplicationClass = _replicationObjects.FirstOrDefault(r => String.Compare(r.Uid.ToString(), replicationInfo.Uid.ToString(), StringComparison.OrdinalIgnoreCase) == 0); if (existedReplicationClass != null) { existedReplicationClass.UpdateProperties(replicationInfo.Properties); } } }
public void ConstructMissing() { allValues.Clear(); var server = InfoTestsHelper.Create("Replication", allValues); ReplicationInfo info = new ReplicationInfo(server); Assert.IsNull(info.Role); Assert.IsNull(info.LastSync); Assert.IsNull(info.MasterLinkStatus); Assert.IsNull(info.IsMasterSyncInProgress); Assert.IsNull(info.SlaveReplOffset); }
public void Construct() { var server = InfoTestsHelper.Create("Replication", allValues); Assert.Throws <ArgumentNullException>(() => new ReplicationInfo(null)); ReplicationInfo info = new ReplicationInfo(server); Assert.AreEqual(ReplicationRole.Slave, info.Role); Assert.AreEqual(MasterLinkStatus.Up, info.MasterLinkStatus); Assert.AreEqual(10, info.LastSync); Assert.AreEqual(11, info.SlaveReplOffset); Assert.AreEqual(1, info.IsMasterSyncInProgress); Assert.AreEqual(server, info.Main); }
/// <summary> /// Подготовить объект для репликации /// </summary> /// <param name="replicationInfo">Информация о реплицируемом объекте</param> /// <param name="operationType">Тип операции</param> public void PrepareReplicationObject(ReplicationInfo replicationInfo, OperationType operationType) { switch (operationType) { case OperationType.Create: CreateReplicationObject(replicationInfo); break; case OperationType.Update: UpdateReplicationObject(replicationInfo); break; case OperationType.Delete: DeleteReplicationObject(replicationInfo); break; } }
public void SetObject(ReplicationInfo replicationInfo, OperationType operationType) { ReplicatedObjectsSubsystem.PrepareReplicationObject(replicationInfo, operationType); SubscribersDistributer.SendObjectChanged(replicationInfo, operationType, GetSubscriber()); }