public void Report(TopicFailure request) { var recoveryAction = HandleFailure(new FailureDescriptor { PathToDbFile = Connections.PathToDbFile(Connections.TopicsDir, request.Name), DbLock = Locks.TakeTopicLock(request.Name), CooperatorAddress = request.Cooperator, RecoveryCategory = "topics", DbName = request.Name }); Propagators.ScheduleTopicOperation(request.Name, recoveryAction); }
void Create(IDbConnection connection, CreateAnnouncement request) { var announcement = new Announcement { Content = request.Content, CreationTime = request.CreationTime.HasValue ? DateTime.FromBinary(request.CreationTime.Value) : DateTime.UtcNow }; connection.Insert(announcement); if (!string.IsNullOrEmpty(request.Cooperator)) { request.CreationTime = announcement.CreationTime.ToBinary(); Propagators.ScheduleTopicOperation(request.TopicName, () => PropagateToCo(request)); } }
void Create(IDbConnection connection, CreateSubscription request) { var subscriber = new Subscriber { CreationTime = request.CreationTime.HasValue ? DateTime.FromBinary(request.CreationTime.Value) : DateTime.UtcNow, LastAnnouncementId = null, Id = request.SubscriberId }; connection.Insert(subscriber); if (!string.IsNullOrEmpty(request.Cooperator)) { request.CreationTime = subscriber.CreationTime.ToBinary(); Propagators.ScheduleTopicOperation(request.TopicName, () => PropagateRequest(request)); } }
void Delete(IDbConnection connection, DeleteAnnouncement request) { var subscriber = connection.GetById <Subscriber>(request.SubscriberId); var announcement = connection.First(NextAnnouncement.make(connection, subscriber)); if (announcement.Id != request.AnnouncementId) { throw new ArgumentException("Invalid announcement"); } connection.UpdateOnly(new Subscriber { LastAnnouncementId = announcement.Id }, subscription => new { subscription.LastAnnouncementId }, subscription => subscription.Id == subscriber.Id); Propagators.ScheduleTopicOperation(request.TopicName, () => Propagate(request)); }
public void Delete(DeleteTopic request) { var topicLock = Locks.TakeTopicLock(request.TopicName); lock (topicLock) { if (Locks.TopicsRecoveryLocks.ContainsKey(request.TopicName)) { throw new Exception($"Topic {request.TopicName} is inconsistent"); } Connections.RemoveTopic(request.TopicName); Monitor.PulseAll(topicLock); Propagators.ScheduleTopicOperation(request.TopicName, () => Propagate(request)); Locks.RemoveTopicLock(request.TopicName); } }
public void Delete(DeleteSubscription request) { var topicLock = Locks.TakeTopicLock(request.TopicName); lock (topicLock) { if (Locks.TopicsRecoveryLocks.ContainsKey(request.TopicName)) { throw new Exception($"Topic {request.TopicName} is inconsistent"); } using (var connection = Connections.ConnectToInitializedTopic(request.TopicName)) { connection.DeleteById <Subscriber>(request.SubscriberId); } Propagators.ScheduleTopicOperation(request.TopicName, () => Propagate(request)); } }
public void Create(CreateTopic request) { var topicLock = Locks.TakeTopicLock(request.Name); lock (topicLock) { if (Locks.TopicsRecoveryLocks.ContainsKey(request.Name)) { throw new Exception($"Topic {request.Name} is inconsistent"); } using (var connection = Connections.ConnectToTopic(request.Name)) { connection.CreateTableIfNotExists <Announcement>(); connection.CreateTableIfNotExists <Subscriber>(); } if (!string.IsNullOrEmpty(request.Cooperator)) { Propagators.ScheduleTopicOperation(request.Name, () => PropagateRequest(request)); } } }