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); }
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)); } }
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); } }
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); }
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; } }
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 }); }