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