Exemple #1
0
        public Task <ReminderTableData> ReadRows(uint begin, uint end)
        {
            ReminderTableData t = remTable.ReadRows(begin, end);

            logger.Verbose("Read {0} reminders from memory: {1}, {2}", t.Reminders.Count, Environment.NewLine, Utils.EnumerableToString(t.Reminders));
            return(Task.FromResult(t));
        }
        public Task <ReminderTableData> ReadRows(uint begin, uint end)
        {
            var range = RangeFactory.CreateRange(begin, end);

            var list = reminderTable.Where(e => range.InRange(e.Key)).SelectMany(e => e.Value.Values).ToList();

            if (logger.IsEnabled(LogLevel.Trace))
            {
                logger.LogTrace(
                    "Selected {SelectCount} out of {TotalCount} reminders from memory for {Range}. Selected: {Reminders}",
                    list.Count,
                    reminderTable.Values.Sum(r => r.Count),
                    range.ToString(),
                    Utils.EnumerableToString(list, e => e.ToString()));
            }

            var result = new ReminderTableData(list);

            if (logger.IsEnabled(LogLevel.Debug))
            {
                logger.LogDebug("Read {ReminderCount} reminders from memory: {Reminders}", result.Reminders.Count, Utils.EnumerableToString(result.Reminders));
            }

            return(Task.FromResult(result));
        }
        protected async Task RemindersRange(int iterations = 1000)
        {
            await Task.WhenAll(Enumerable.Range(1, iterations).Select(async i =>
            {
                GrainReference grainRef = MakeTestGrainReference();

                await RetryHelper.RetryOnExceptionAsync <Task>(10, RetryOperation.Sigmoid, async() =>
                {
                    await remindersTable.UpsertRow(CreateReminder(grainRef, i.ToString()));
                    return(Task.CompletedTask);
                });
            }));

            ReminderTableData rows = await remindersTable.ReadRows(0, uint.MaxValue);

            Assert.Equal(rows.Reminders.Count, iterations);

            rows = await remindersTable.ReadRows(0, 0);

            Assert.Equal(rows.Reminders.Count, iterations);

            uint[] remindersHashes = rows.Reminders.Select(r => r.GrainRef.GetUniformHashCode()).ToArray();

            SafeRandom random = new SafeRandom();

            await Task.WhenAll(Enumerable.Range(0, iterations).Select(i =>
                                                                      TestRemindersHashInterval(remindersTable, (uint)random.Next(), (uint)random.Next(),
                                                                                                remindersHashes)));
        }
Exemple #4
0
        public Task <ReminderTableData> ReadRows(uint begin, uint end)
        {
            ReminderTableData t = remTable.ReadRows(begin, end);

            if (logger.IsEnabled(LogLevel.Debug))
            {
                logger.LogDebug("Read {ReminderCount} reminders from memory: {Reminders}", t.Reminders.Count, Utils.EnumerableToString(t.Reminders));
            }

            return(Task.FromResult(t));
        }
Exemple #5
0
        /// <summary>
        /// Maps the specified source.
        /// </summary>
        /// <param name="converter"></param>
        /// <param name="src">The source.</param>
        /// <param name="dst">The DST.</param>
        /// <returns></returns>
        internal static ReminderTableData Map(
            IGrainReferenceConverter converter,
            List <OrleansEFReminder> src,
            ReminderTableData dst = null
            )
        {
            var entries = src
                          .Select(a => Map(converter, a))
                          .ToList();

            dst = dst ?? new ReminderTableData(entries);

            return(dst);
        }
        public async Task <ReminderTableData> ReadRows(GrainReference key)
        {
            ReminderTableData data = new ReminderTableData();
            // E.g. Get all keys with pattern "key/*"
            var range = await etcdClient.GetRangeValAsync($"{key}/").ConfigureAwait(false);

            foreach (var item in range)
            {
                //data.Reminders.Add(new ReminderEntry()
                // {
                //       item.Value.ToByteArray()
                //    })
            }

            return(null);
        }
Exemple #7
0
        public async Task <ReminderTableData> ReadRows(uint beginHash, uint endHash)
        {
            var dic = JsonSerializer.Deserialize <Dictionary <string, uint> >(await Database.StringGetAsync(GetKeyStringForHash()));

            RedisKey[] keys;

            if (beginHash < endHash)
            {
                keys = dic
                       .Where(x => x.Value > beginHash && x.Value <= endHash)
                       .Select(y => new RedisKey(y.Key))
                       .ToArray();
            }
            else
            {
                keys = dic
                       .Where(x => x.Value > beginHash || x.Value <= endHash)
                       .Select(y => new RedisKey(y.Key))
                       .ToArray();
            }

            var values = await Database.StringGetAsync(keys);

            var tableData = values.Select(x => JsonSerializer.Deserialize <RedisReminderTableData>(x)).ToList();
            var reminders = tableData
                            .Select(y => new ReminderEntry
            {
                Period       = TimeSpan.FromMilliseconds(y.Period),
                ReminderName = y.ReminderName,
                ETag         = y.Version.ToString(),
                StartAt      = y.StartTime,
                GrainRef     = _converter.GetGrainFromKeyString(y.GrainId)
            }).ToList();

            var reminderTableData = new ReminderTableData(reminders);

            if (reminders.Count > 0)
            {
                Console.WriteLine("OPA!");
            }

            return(reminderTableData);
        }
Exemple #8
0
        public async Task <ReminderTableData> ReadRows(uint begin, uint end)
        {
            try
            {
                var entries = await remTableManager.FindReminderEntries(begin, end);

                ReminderTableData data = ConvertFromTableEntryList(entries);
                if (logger.IsEnabled(LogLevel.Trace))
                {
                    logger.Trace("Read in {0} Table=" + Environment.NewLine + "{1}", RangeFactory.CreateRange(begin, end), data);
                }
                return(data);
            }
            catch (Exception exc)
            {
                logger.Warn((int)AzureUtils.Utilities.ErrorCode.AzureTable_40,
                            $"Intermediate error reading reminders in range {RangeFactory.CreateRange(begin, end)} for table {remTableManager.TableName}.", exc);
                throw;
            }
        }
Exemple #9
0
        public async Task <ReminderTableData> ReadRows(GrainReference key)
        {
            try
            {
                var entries = await remTableManager.FindReminderEntries(key);

                ReminderTableData data = ConvertFromTableEntryList(entries);
                if (logger.IsEnabled(LogLevel.Trace))
                {
                    logger.Trace("Read for grain {0} Table=" + Environment.NewLine + "{1}", key, data.ToString());
                }
                return(data);
            }
            catch (Exception exc)
            {
                logger.Warn((int)AzureUtils.Utilities.ErrorCode.AzureTable_47,
                            $"Intermediate error reading reminders for grain {key} in table {remTableManager.TableName}.", exc);
                throw;
            }
        }
Exemple #10
0
        public async Task <ReminderTableData> ReadRows(uint begin, uint end)
        {
            try
            {
                var entries = await remTableManager.FindReminderEntries(begin, end);

                ReminderTableData data = ConvertFromTableEntryList(entries);
                if (logger.IsVerbose2)
                {
                    logger.Verbose2("Read in {0} Table=" + Environment.NewLine + "{1}", RangeFactory.CreateRange(begin, end), data);
                }
                return(data);
            }
            catch (Exception exc)
            {
                logger.Warn(ErrorCode.AzureTable_40, String.Format("Intermediate error reading reminders in range {0} for table {1}.",
                                                                   RangeFactory.CreateRange(begin, end), remTableManager.TableName), exc);
                throw;
            }
        }
Exemple #11
0
        public async Task <ReminderTableData> ReadRows(GrainReference key)
        {
            try
            {
                var entries = await remTableManager.FindReminderEntries(key);

                ReminderTableData data = ConvertFromTableEntryList(entries);
                if (logger.IsVerbose2)
                {
                    logger.Verbose2("Read for grain {0} Table=" + Environment.NewLine + "{1}", key, data.ToString());
                }
                return(data);
            }
            catch (Exception exc)
            {
                logger.Warn(ErrorCode.AzureTable_47, String.Format("Intermediate error reading reminders for grain {0} in table {1}.",
                                                                   key, remTableManager.TableName), exc);
                throw;
            }
        }
Exemple #12
0
        private async Task ReadTableAndStartTimers(IRingRange range, int rangeSerialNumberCopy)
        {
            if (Logger.IsVerbose)
            {
                Logger.Verbose("Reading rows from {0}", range.ToString());
            }
            localTableSequence++;
            long cachedSequence = localTableSequence;

            try
            {
                var srange = (SingleRange)range;
                ReminderTableData table = await reminderTable.ReadRows(srange.Begin, srange.End); // get all reminders, even the ones we already have

                if (rangeSerialNumberCopy < RangeSerialNumber)
                {
                    if (Logger.IsVerbose)
                    {
                        Logger.Verbose($"My range changed while reading from the table, ignoring the results. Another read has been started. RangeSerialNumber {RangeSerialNumber}, RangeSerialNumberCopy {rangeSerialNumberCopy}.");
                    }
                    return;
                }
                if (StoppedCancellationTokenSource.IsCancellationRequested)
                {
                    return;
                }

                // if null is a valid value, it means that there's nothing to do.
                if (null == table && reminderTable is MockReminderTable)
                {
                    return;
                }

                var remindersNotInTable = localReminders.Where(r => range.InRange(r.Key.GrainRef)).ToDictionary(r => r.Key, r => r.Value); // shallow copy
                if (Logger.IsVerbose)
                {
                    Logger.Verbose("For range {0}, I read in {1} reminders from table. LocalTableSequence {2}, CachedSequence {3}", range.ToString(), table.Reminders.Count, localTableSequence, cachedSequence);
                }

                foreach (ReminderEntry entry in table.Reminders)
                {
                    var key = new ReminderIdentity(entry.GrainRef, entry.ReminderName);
                    LocalReminderData localRem;
                    if (localReminders.TryGetValue(key, out localRem))
                    {
                        if (cachedSequence > localRem.LocalSequenceNumber) // info read from table is same or newer than local info
                        {
                            if (localRem.Timer != null)                    // if ticking
                            {
                                if (Logger.IsVerbose2)
                                {
                                    Logger.Verbose2("In table, In local, Old, & Ticking {0}", localRem);
                                }
                                // it might happen that our local reminder is different than the one in the table, i.e., eTag is different
                                // if so, stop the local timer for the old reminder, and start again with new info
                                if (!localRem.ETag.Equals(entry.ETag))
                                // this reminder needs a restart
                                {
                                    if (Logger.IsVerbose2)
                                    {
                                        Logger.Verbose2("{0} Needs a restart", localRem);
                                    }
                                    localRem.StopReminder(Logger);
                                    localReminders.Remove(localRem.Identity);
                                    StartAndAddTimer(entry);
                                }
                            }
                            else // if not ticking
                            {
                                // no-op
                                if (Logger.IsVerbose2)
                                {
                                    Logger.Verbose2("In table, In local, Old, & Not Ticking {0}", localRem);
                                }
                            }
                        }
                        else // cachedSequence < localRem.LocalSequenceNumber ... // info read from table is older than local info
                        {
                            if (localRem.Timer != null) // if ticking
                            {
                                // no-op
                                if (Logger.IsVerbose2)
                                {
                                    Logger.Verbose2("In table, In local, Newer, & Ticking {0}", localRem);
                                }
                            }
                            else // if not ticking
                            {
                                // no-op
                                if (Logger.IsVerbose2)
                                {
                                    Logger.Verbose2("In table, In local, Newer, & Not Ticking {0}", localRem);
                                }
                            }
                        }
                    }
                    else // exists in table, but not locally
                    {
                        if (Logger.IsVerbose2)
                        {
                            Logger.Verbose2("In table, Not in local, {0}", entry);
                        }
                        // create and start the reminder
                        StartAndAddTimer(entry);
                    }
                    // keep a track of extra reminders ... this 'reminder' is useful, so remove it from extra list
                    remindersNotInTable.Remove(key);
                } // foreach reminder read from table

                int remindersCountBeforeRemove = localReminders.Count;

                // foreach reminder that is not in global table, but exists locally
                foreach (var reminder in remindersNotInTable.Values)
                {
                    if (cachedSequence < reminder.LocalSequenceNumber)
                    {
                        // no-op
                        if (Logger.IsVerbose2)
                        {
                            Logger.Verbose2("Not in table, In local, Newer, {0}", reminder);
                        }
                    }
                    else // cachedSequence > reminder.LocalSequenceNumber
                    {
                        if (Logger.IsVerbose2)
                        {
                            Logger.Verbose2("Not in table, In local, Old, so removing. {0}", reminder);
                        }
                        // remove locally
                        reminder.StopReminder(Logger);
                        localReminders.Remove(reminder.Identity);
                    }
                }
                if (Logger.IsVerbose)
                {
                    Logger.Verbose($"Removed {localReminders.Count - remindersCountBeforeRemove} reminders from local table");
                }
            }
            catch (Exception exc)
            {
                Logger.Error(ErrorCode.RS_FailedToReadTableAndStartTimer, "Failed to read rows from table.", exc);
                throw;
            }
        }
        private async Task <IEnumerable <ReminderEntry> > GetAllRows(IReminderTable table)
        {
            ReminderTableData data = await table.ReadRows(0, 0xffffffff);

            return(data.Reminders);
        }