Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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));
            }
        }
Exemplo n.º 3
0
        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));
        }
Exemplo n.º 5
0
        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);
            }
        }
Exemplo n.º 6
0
        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));
            }
        }
Exemplo n.º 7
0
        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));
                }
            }
        }