Exemple #1
0
        /// <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);
        }
Exemple #2
0
        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>();
        }
Exemple #3
0
        /// <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);
        }
Exemple #5
0
        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);
        }