/// <summary> /// Attempt to retrieve reminders, that are my responsibility, from the global reminder table when starting this silo (reminder service instance) /// </summary> /// <returns></returns> public async Task Start() { myRange = ring.GetMyRange(); logger.Info(ErrorCode.RS_ServiceStarting, "Starting reminder system target on: {0} x{1,8:X8}, with range {2}", Silo, Silo.GetConsistentHashCode(), myRange); await reminderTable.Init(config, logger).WithTimeout(initTimeout); await ReadAndUpdateReminders(); logger.Info(ErrorCode.RS_ServiceStarted, "Reminder system target started OK on: {0} x{1,8:X8}, with range {2}", Silo, Silo.GetConsistentHashCode(), myRange); status = ReminderServiceStatus.Started; startedTask.TrySetResult(true); var random = new SafeRandom(); var dueTime = random.NextTimeSpan(Constants.RefreshReminderList); listRefresher = GrainTimer.FromTaskCallback( _ => ReadAndUpdateReminders(), null, dueTime, Constants.RefreshReminderList, name: "ReminderService.ReminderListRefresher"); listRefresher.Start(); ring.SubscribeToRangeChangeEvents(this); }
internal LocalReminderService( SiloAddress addr, GrainId id, IConsistentRingProvider ring, OrleansTaskScheduler localScheduler, IReminderTable reminderTable, GlobalConfiguration config, TimeSpan initTimeout) : base(id, addr) { logger = TraceLogger.GetLogger("ReminderService", TraceLogger.LoggerType.Runtime); localReminders = new Dictionary <ReminderIdentity, LocalReminderData>(); this.ring = ring; scheduler = localScheduler; this.reminderTable = reminderTable; this.config = config; this.initTimeout = initTimeout; status = ReminderServiceStatus.Booting; myRange = null; localTableSequence = 0; tardinessStat = AverageTimeSpanStatistic.FindOrCreate(StatisticNames.REMINDERS_AVERAGE_TARDINESS_SECONDS); IntValueStatistic.FindOrCreate(StatisticNames.REMINDERS_NUMBER_ACTIVE_REMINDERS, () => localReminders.Count); ticksDeliveredStat = CounterStatistic.FindOrCreate(StatisticNames.REMINDERS_COUNTERS_TICKS_DELIVERED); startedTask = new TaskCompletionSource <bool>(); }
/// <summary> /// Attempt to retrieve reminders, that are my responsibility, from the global reminder table when starting this silo (reminder service instance) /// </summary> /// <returns></returns> public async Task Start() { myRange = ring.GetMyRange(); logger.Info(ErrorCode.RS_ServiceStarting, "Starting reminder system target on: {0} x{1,8:X8}, with range {2}", Silo, Silo.GetConsistentHashCode(), myRange); // in case reminderTable is as grain, poke the grain to activate it, before slamming it with multipel parallel requests, which may create duplicate activations. await reminderTable.Init(); await ReadAndUpdateReminders(); logger.Info(ErrorCode.RS_ServiceStarted, "Reminder system target started OK on: {0} x{1,8:X8}, with range {2}", Silo, Silo.GetConsistentHashCode(), myRange); status = ReminderServiceStatus.Started; startedTask.TrySetResult(true); var random = new SafeRandom(); var dueTime = random.NextTimeSpan(Constants.RefreshReminderList); listRefresher = GrainTimer.FromTaskCallback( _ => ReadAndUpdateReminders(), null, dueTime, Constants.RefreshReminderList, name: "ReminderService.ReminderListRefresher"); listRefresher.Start(); ring.SubscribeToRangeChangeEvents(this); }
private void PromoteToStarted() { if (stoppedCancellationTokenSource.IsCancellationRequested) { return; } logger.Info(ErrorCode.RS_ServiceStarted, "Reminder system target started OK on: {0} x{1,8:X8}, with range {2}", this.Silo, this.Silo.GetConsistentHashCode(), this.myRange); status = ReminderServiceStatus.Started; startedTask.TrySetResult(true); var random = new SafeRandom(); var dueTime = random.NextTimeSpan(Constants.RefreshReminderList); if (listRefreshTimer != null) { listRefreshTimer.Dispose(); } listRefreshTimer = GrainTimer.FromTaskCallback( _ => ReadAndUpdateReminders(), null, dueTime, Constants.RefreshReminderList, name: "ReminderService.ReminderListRefresher"); listRefreshTimer.Start(); ring.SubscribeToRangeChangeEvents(this); }
public Task Stop() { logger.Info(ErrorCode.RS_ServiceStopping, "Stopping reminder system target"); status = ReminderServiceStatus.Stopped; ring.UnSubscribeFromRangeChangeEvents(this); if (listRefresher != null) { listRefresher.Dispose(); listRefresher = null; } foreach (LocalReminderData r in localReminders.Values) { r.StopReminder(logger); } // for a graceful shutdown, also handover reminder responsibilities to new owner, and update the ReminderTable // currently, this is taken care of by periodically reading the reminder table return(TaskDone.Done); }