Exemple #1
0
        public async Task <IReadOnlyList <Record> > GetRecords(IEnumerable <ByteString> keys)
        {
            var list = new List <Record>();

            foreach (var k in keys)
            {
                var replay     = false;
                var retryCount = Configuration.ReadRetryCount;
                var delay      = Configuration.ReadLoopDelay;
                do
                {
                    var cmpkey = k.ToByteArray();
                    var r      = await RecordCollection.Find(x => x.Key == cmpkey).FirstOrDefaultAsync();

                    if (r == null)
                    {
                        list.Add(new Record(k, ByteString.Empty, ByteString.Empty));
                        replay = false;
                    }
                    else
                    {
                        // retry
                        if (r.TransactionLock != null)
                        {
                            if (retryCount <= 0)
                            {
                                throw new Exception("Lock timeout reading record " + cmpkey.ToString());
                            }
#if DEBUG
                            Logger.LogDebug($"Waiting token {new ByteString(r.TransactionLock)} {k.ToString()} {retryCount}");
#endif
                            await Task.Delay(delay);

                            delay  = TimeSpan.FromMilliseconds(delay.TotalMilliseconds * 1.5);
                            replay = true;
                            retryCount--;
                        }
                        else
                        {
                            list.Add(new Record(k, new ByteString(r.Value), new ByteString(r.Version)));
                            replay = false;
                        }
                    }
                } while (replay);
            }

            return(list.AsReadOnly());
        }
        public async Task <IReadOnlyList <Record> > GetRecords(IEnumerable <ByteString> keys)
        {
            var list = new List <Record>();

            foreach (var k in keys)
            {
                var replay     = false;
                var retryCount = Configuration.ReadRetryCount;
                do
                {
                    var cmpkey = k.ToByteArray();
                    var r      = await RecordCollection.Find(x => x.Key == cmpkey).FirstOrDefaultAsync();

                    if (r == null)
                    {
                        list.Add(new Record(k, ByteString.Empty, ByteString.Empty));
                    }
                    else
                    {
                        // retry
                        if (r.TransactionLock != null)
                        {
                            if (retryCount <= 0)
                            {
                                throw new Exception("Lock timeout reading record " + cmpkey.ToString());
                            }
                            await Task.Delay(Configuration.ReadLoopDelay);

                            replay = true;
                            retryCount--;
                        }
                        else
                        {
                            list.Add(new Record(k, new ByteString(r.Value), new ByteString(r.Version)));
                        }
                    }
                } while (replay);
            }

            return(list.AsReadOnly());
        }