Пример #1
0
        private void AddThread(Action <IRemoteLockCreator> shortAction, IRemoteLockCreator lockCreator)
        {
            var thread = new Thread(() => MakePeriodicAction(shortAction, lockCreator));

            thread.Start();
            threads.Add(thread);
        }
 public PeriodicJobRunnerWithLeaderElection(IRemoteLockCreator remoteLockCreator, IPeriodicTaskRunner periodicTaskRunner, IGraphiteClient graphiteClient, ILog logger)
 {
     this.remoteLockCreator  = remoteLockCreator;
     this.periodicTaskRunner = periodicTaskRunner;
     this.graphiteClient     = graphiteClient;
     this.logger             = logger.ForContext(nameof(PeriodicJobRunnerWithLeaderElection));
 }
 public EventLoggerAdditionalInfoRepository(
     ICassandraCluster cassandraCluster,
     ISerializer serializer,
     IRemoteLockCreator remoteLockCreator,
     ColumnFamilyFullName additionalInfoColumnFamily,
     ColumnFamilyFullName eventLogColumnFamily)
 {
     this.eventLogColumnFamily = eventLogColumnFamily;
     this.serializer           = serializer;
     this.remoteLockCreator    = remoteLockCreator;
     columnFamilyConnection    = cassandraCluster.RetrieveColumnFamilyConnection(additionalInfoColumnFamily.KeyspaceName, additionalInfoColumnFamily.ColumnFamilyName);
 }
Пример #4
0
 private static IRemoteLock Lock(IRemoteLockCreator remoteLockCreator, ManualResetEvent syncSignal, string lockId, MultithreadingTestHelper.RunState state)
 {
     while (true)
     {
         if (state.ErrorOccurred)
         {
             return(null);
         }
         syncSignal.WaitOne();
         if (remoteLockCreator.TryGetLock(lockId, out var remoteLock))
         {
             return(remoteLock);
         }
         Thread.Sleep(ThreadLocalRandom.Instance.Next(32));
     }
 }
Пример #5
0
 private void MakePeriodicAction(Action <IRemoteLockCreator> shortAction, IRemoteLockCreator lockCreator)
 {
     try
     {
         while (!isEnd)
         {
             running.WaitOne();
             Interlocked.Increment(ref runningThreads);
             shortAction(lockCreator);
             Interlocked.Decrement(ref runningThreads);
         }
     }
     catch (Exception e)
     {
         logger.Error(e);
     }
 }
Пример #6
0
        private static IRemoteLockCreator[] PrepareRemoteLockCreators(int threadCount, LocalRivalOptimization localRivalOptimization, CassandraRemoteLockImplementation remoteLockImplementation)
        {
            var remoteLockCreators  = new IRemoteLockCreator[threadCount];
            var remoteLockerMetrics = new RemoteLockerMetrics(null);

            if (localRivalOptimization == LocalRivalOptimization.Enabled)
            {
                var singleRemoteLocker = new RemoteLocker(remoteLockImplementation, remoteLockerMetrics, logger);
                for (var i = 0; i < threadCount; i++)
                {
                    remoteLockCreators[i] = singleRemoteLocker;
                }
            }
            else
            {
                for (var i = 0; i < threadCount; i++)
                {
                    remoteLockCreators[i] = new RemoteLocker(remoteLockImplementation, remoteLockerMetrics, logger);
                }
            }
            return(remoteLockCreators);
        }
Пример #7
0
 private void IncrementDecrementAction(IRemoteLockCreator lockCreator)
 {
     try
     {
         var remoteLock = lockCreator.Lock(lockId);
         using (remoteLock)
         {
             logger.Info("MakeLock with threadId: " + remoteLock.ThreadId);
             Thread.Sleep(1000);
             CheckLocks(remoteLock.ThreadId);
             Assert.AreEqual(0, ReadX());
             logger.Info("Increment");
             Interlocked.Increment(ref x);
             logger.Info("Decrement");
             Interlocked.Decrement(ref x);
         }
     }
     catch (Exception e)
     {
         logger.Error(e);
         throw;
     }
 }
Пример #8
0
        public PeriodicJobWithLeaderElection(
            [NotNull] IRemoteLockCreator remoteLockCreator,
            [NotNull] IPeriodicTaskRunner periodicTaskRunner,
            [NotNull] IGraphiteClient graphiteClient,
            [NotNull] ILog logger,
            [NotNull] string jobName,
            TimeSpan delayBetweenIterations,
            TimeSpan leaderAcquisitionAttemptDelay,
            [NotNull] Action <CancellationToken> jobAction,
            [CanBeNull] Action onTakeTheLead,
            [CanBeNull] Action onLoseTheLead,
            CancellationToken cancellationToken)
        {
            this.remoteLockCreator             = remoteLockCreator;
            this.periodicTaskRunner            = periodicTaskRunner;
            this.graphiteClient                = graphiteClient;
            this.logger                        = logger;
            this.jobName                       = jobName;
            this.delayBetweenIterations        = delayBetweenIterations;
            this.leaderAcquisitionAttemptDelay = leaderAcquisitionAttemptDelay;
            this.jobAction                     = jobAction;
            this.onTakeTheLead                 = onTakeTheLead;
            this.onLoseTheLead                 = onLoseTheLead;
            isDisposed = false;
            jobCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);

            leaderActivityReportingJobId        = $"leaderActivityReportingJobId-{jobName}";
            leaderActivityReportingGraphitePath = $"SubSystem.LeaderElection.{jobName}.{Dns.GetHostName()}";

            jobThread = new Thread(() => ThreadProc(jobCancellationTokenSource.Token))
            {
                Name         = jobName,
                IsBackground = true,
            };
            jobThread.Start();
            this.logger.Info("Job thread has started for {JobName}", new { JobName = jobName });
        }