public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            foreach (var uri in ReplicaAddresses.OrderBy(x => random.Next()))
            {
                var webRequest = CreateRequest(uri + "?query=" + query);
                var resultTask = ProcessRequestAsync(webRequest);
                Console.WriteLine($"Processing {webRequest.RequestUri}");

                Tasks.Add(resultTask);
                if (TryCheckIfPreviousCompleted(out var completed))
                {
                    Console.WriteLine($"While processing {webRequest.RequestUri} old task {completed.Id} was completed");
                    return(completed.Result);
                }

                await Task.WhenAny(resultTask, Task.Delay(GetSoftTimeout(timeout)));

                if (resultTask.IsCompleted)
                {
                    return(resultTask.Result);
                }
            }

            // wait extra
            Console.WriteLine($"Waiting extra than timeout {timeout.ToString()}");
            var answered = await Task.WhenAny(Tasks);

            if (answered.IsCompleted)
            {
                return(answered.Result);
            }
            // or do not wait excess
            throw new TimeoutException();
        }
示例#2
0
        public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            var replica         = ReplicaAddresses.ToList();
            var priorityReplica = replica
                                  .Select((t, i) => new Tuple <int, string>(Priority[i], t))
                                  .ToList();

            priorityReplica.Sort();
            var timeoutOneTask = new TimeSpan(timeout.Ticks / ReplicaAddresses.Length);

            for (var i = 0; i < priorityReplica.Count; i++)
            {
                var priorityReplicaAddress = priorityReplica[i];
                var replicaAddress         = priorityReplicaAddress.Item2;
                var webRequest             = CreateRequest(replicaAddress + "?query=" + query);
                Log.InfoFormat("Processing {0}", webRequest.RequestUri);

                var resultTask = ProcessRequestAsync(webRequest);
                await Task.WhenAny(resultTask, Task.Delay(timeoutOneTask));

                if (!resultTask.IsCompleted || resultTask.IsFaulted)
                {
                    Priority[i] += 1;
                    continue;
                }

                Priority[i] -= 1;
                return(resultTask.Result);
            }

            throw new TimeoutException();
        }
示例#3
0
        public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            var webRequests = ReplicaAddresses.Select(uri => CreateRequest(uri + "?query=" + query)).ToList();
            var resultTasks = new List <Task <string> >();

            foreach (var request in webRequests)
            {
                Log.InfoFormat("Processing {0}", request.RequestUri);
                resultTasks.Add(ProcessRequestAsync(request));
            }
            var result = Task.WhenAny(resultTasks);
            await Task.WhenAny(result, Task.Delay(timeout));

            if (!result.IsCompleted && !result.IsFaulted)
            {
                throw new TimeoutException();
            }

            for (var i = 0; i < resultTasks.Count; i++)
            {
                if (resultTasks[i].IsCompleted)
                {
                    continue;
                }
                var cancellation = CreateRequest(ReplicaAddresses[i] + "?query=" + query);
                cancellation.Method = "DELETE";
                ProcessRequestAsync(cancellation);
            }

            return(result.Result.Result);
        }
示例#4
0
        public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            if (Cache.ContainsKey(query))
            {
                return(Cache[query]);
            }
            var webRequests = ReplicaAddresses.Select(uri => CreateRequest(uri + "?query=" + query));
            var resultTasks = new List <Task <string> >();

            foreach (var request in webRequests)
            {
                Log.InfoFormat("Processing {0}", request.RequestUri);
                resultTasks.Add(ProcessRequestAsync(request));
            }
            var resultTask = Task.WhenAny(resultTasks);
            await Task.WhenAny(resultTask, Task.Delay(timeout));

            if (!resultTask.IsCompleted && !resultTask.IsFaulted)
            {
                throw new TimeoutException();
            }

            var requestResult = resultTask.Result.Result;

            Cache[query] = requestResult;
            return(requestResult);
        }
        public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            timeout = TimeSpan.FromSeconds(timeout.TotalSeconds / ReplicaAddresses.Length);

            var orderedAddresses = ReplicaAddresses.OrderBy(addr => requestStatistics[addr].GetValue()).ToArray();

            foreach (var uri in orderedAddresses)
            {
                var request = CreateRequest(uri + "?query=" + query);
                Log.InfoFormat("Processing {0}", request.RequestUri);

                timer.Start();
                var task = ProcessRequestAsync(request);
                await Task.WhenAny(task, Task.Delay(timeout));

                timer.Stop();

                requestStatistics[uri].Update(timer.ElapsedMilliseconds);

                timer.Reset();

                if (task.IsCompleted && !task.IsFaulted)
                {
                    return(task.Result);
                }
            }
            throw new TimeoutException();
        }
示例#6
0
        public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            var replica = ReplicaAddresses.ToArray();

            replica.Shuffle(rand);
            foreach (var s in replica)
            {
                Console.Write(s + " ");
            }
            Console.WriteLine();
            var timeoutOneTask = new TimeSpan(timeout.Ticks / ReplicaAddresses.Length);

            foreach (var replicaAddress in replica)
            {
                var webRequest = CreateRequest(replicaAddress + "?query=" + query);
                Log.InfoFormat("Processing {0}", webRequest.RequestUri);

                var resultTask = ProcessRequestAsync(webRequest);
                await Task.WhenAny(resultTask, Task.Delay(timeoutOneTask));

                if (!resultTask.IsCompleted)
                {
                    continue;
                }
                if (resultTask.IsFaulted)
                {
                    continue;
                }

                return(resultTask.Result);
            }

            throw new TimeoutException();
        }
示例#7
0
        public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            timeout = TimeSpan.FromSeconds(timeout.TotalSeconds / ReplicaAddresses.Length);

            var shuffledAddresses = ReplicaAddresses.Shuffle();
            var filtredAddresses  = shuffledAddresses.Where(server => DateTime.Now - mutedServers[server] > TimeInBan).ToList();

            if (filtredAddresses.Count == 0)
            {
                filtredAddresses = shuffledAddresses.OrderBy(server => DateTime.Now - mutedServers[server]).ToList();
            }

            var webRequests = filtredAddresses.Select(uri => CreateRequest(uri + "?query=" + query));

            foreach (var request in webRequests)
            {
                Log.InfoFormat("Processing {0}", request.RequestUri);
                var task = ProcessRequestAsync(request);
                await Task.WhenAny(task, Task.Delay(timeout));

                if (task.IsCompleted && !task.IsFaulted)
                {
                    return(task.Result);
                }
                mutedServers[request.Host] = DateTime.Now;
            }

            throw new TimeoutException();
        }
示例#8
0
        public IEnumerable <string> RandomizeReplicas()
        {
            var replicasToList = ReplicaAddresses.ToList();

            while (replicasToList.Count > 0)
            {
                var uri = replicasToList[new Random().Next(replicasToList.Count)];
                replicasToList.Remove(uri);
                yield return(uri);
            }
        }
        protected override async Task <string> ProcessRequestAsyncInternal(string query, TimeSpan timeout)
        {
            // в случаае, если одна реплика не работает, то ъждать ответа от остальных
            var tasks = ReplicaAddresses.Select(async addr =>
            {
                var request = CreateRequest($"{addr}?query={query}", timeout);

                return(await ProcessRequestAsync(request).WithTimeout(timeout));
            });

            return(await await TaskExtensions.WhenAnySucceded(tasks));
        }
        protected override async Task <string> ProcessRequestAsyncInternal(string query, TimeSpan timeout)
        {
            var batchCount         = Math.Ceiling((double)ReplicaAddresses.Length / batchSize);
            var singleBatchTimeout = TimeSpan.FromMilliseconds(timeout.TotalMilliseconds / batchCount);
            var requests           = ReplicaAddresses
                                     .RandomSubset(ReplicaAddresses.Length)
                                     .Select(addr => CreateRequest($"{addr}?query={query}", timeout))
                                     .Batch(batchSize);
            var requestQueue = requests.ToQueue();

            return(await await SendNextBatchAsync(requestQueue, singleBatchTimeout));
        }
示例#11
0
 public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
 {
     return((await WaitForAnyNonFaultedTaskAsync(
                 ReplicaAddresses.Select(replica =>
                                         Task.Run(async() =>
     {
         var webRequest = CreateRequest(replica + "?query=" + query);
         Log.InfoFormat("Processing {0}", webRequest.RequestUri);
         var resultTask = ProcessRequestAsync(webRequest);
         await Task.WhenAny(resultTask, Task.Delay(timeout));
         return resultTask.Result;
     })).ToArray()))?.Result);
 }
示例#12
0
        public async override Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            var timer = Stopwatch.StartNew();

            Tuple <long, int> valueForLinq;
            var webRequests = ReplicaAddresses
                              .OrderBy(uri =>
            {
                replicaAverageDelay.TryGetValue(uri, out valueForLinq);
                return(valueForLinq.Item1);
            })
                              .ToDictionary(uri => uri, uri => CreateRequest(uri + "?query=" + query));

            timeout = new TimeSpan((long)(timeout.Ticks * 1.0 / ReplicaAddresses.Length));

            var tasksToAwait = new ConcurrentBag <Task <string> >();

            foreach (var pair in webRequests)
            {
                var tempPair = pair;
                Log.InfoFormat("Processing {0}", tempPair.Value.RequestUri);

                tasksToAwait.Add(ProcessRequestAsync(tempPair.Value));
                var resultTask = await Task.WhenAny(tasksToAwait);

                Task.WaitAny(resultTask, Task.Delay(timeout));

                if (!resultTask.IsCompleted)
                {
                    continue;
                }

                if (!resultTask.IsFaulted)
                {
                    var processTime = timer.ElapsedMilliseconds;

                    Tuple <long, int> currentValue;
                    replicaAverageDelay.TryGetValue(tempPair.Key, out currentValue);

                    var newAverDelay = (currentValue.Item1 * currentValue.Item2 + processTime) /
                                       (currentValue.Item2 + 1);

                    replicaAverageDelay.TryUpdate(tempPair.Key,
                                                  Tuple.Create(newAverDelay, currentValue.Item2 + 1), currentValue);

                    return(resultTask.Result);
                }
            }

            throw new TimeoutException();
        }
示例#13
0
        protected override async Task <string> ProcessRequestAsyncInternal(string query, TimeSpan timeout)
        {
            if (greylist.Count() == ReplicaAddresses.Length)
            {
                greylist.Clear();
            }

            var availableReplicas = ReplicaAddresses.Except(greylist).ToArray();

            var singleRequestTimeout = TimeSpan.FromMilliseconds(timeout.TotalMilliseconds / availableReplicas.Length);
            var requests             = availableReplicas
                                       .OrderBy(replicaStatistics.GetAverageResponseTime)
                                       .Select(addr => CreateRequest($"{addr}?query={query}", timeout)).ToArray();
            var requestQueue = new Queue <WebRequest>(requests);

            return(await SendNextRequestAsync(requestQueue, singleRequestTimeout));
        }
示例#14
0
        public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            var newTimeout = TimeSpan.FromMilliseconds((double)timeout.TotalMilliseconds / ReplicaAddresses.Length);

            return((await WaitForAnyNonFaultedTaskAsync(
                        ReplicaAddresses.Select(replica => Task.Run(async() =>
            {
                var webRequest = CreateRequest(replica + "?query=" + query);
                Log.InfoFormat("Processing {0}", webRequest.RequestUri);
                var resultTask = ProcessRequestAsync(webRequest);
                await Task.WhenAny(resultTask, Task.Delay(newTimeout));
                //Console.WriteLine("1" + resultTask.IsCompleted);
                if (resultTask.IsCompleted)
                {
                    return resultTask.Result;
                }
                //Console.WriteLine("2" + resultTask.IsCompleted);
                await Task.WhenAny(resultTask);
                //Console.WriteLine("3" + resultTask.IsCompleted);
                return resultTask.Result;
            })).ToArray()))?.Result);

            var bigTask = await WaitForAnyNonFaultedTaskAsync(Task.Run(async() =>
            {
                foreach (var replica in RandomizeReplicas())
                {
                    var webRequest = CreateRequest(replica + "?query=" + query);
                    Log.InfoFormat("Processing {0}", webRequest.RequestUri);
                    var resultTask = ProcessRequestAsync(webRequest);
                    await Task.WhenAny(resultTask, Task.Delay(newTimeout));

                    if (!resultTask.IsFaulted && resultTask.IsCompleted)
                    {
                        return(resultTask.Result);
                    }
                }
                throw new Exception("No Replica Answered");
            }));

            if (bigTask == null || bigTask.IsFaulted)
            {
                return(null);
            }
            return(bigTask.Result);
        }
        public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            var queryTasks = ReplicaAddresses
                             .Select(uri => CreateRequest(uri + "?query=" + query))
                             .Select(ProcessRequestAsync)
                             .Concat(new[] { Task.Delay(timeout) })
                             .ToArray();

            var task = await Task.WhenAny(queryTasks);

            var result = (task as Task <string>)?.Result;

            if (result == null)
            {
                throw new TimeoutException();
            }
            return(result);
        }
        public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            foreach (var uri in ReplicaAddresses.OrderBy(x => random.Next()))
            {
                var webRequest = CreateRequest(uri + "?query=" + query);
                var resultTask = ProcessRequestAsync(webRequest);
                Console.WriteLine($"Processing {webRequest.RequestUri}");


                await Task.WhenAny(resultTask, Task.Delay(GetSoftTimeout(timeout)));

                if (resultTask.IsCompleted)
                {
                    return(resultTask.Result);
                }
            }

            throw new TimeoutException();
        }
示例#17
0
        public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            try
            {
                var tasks = ReplicaAddresses.Select(async uri =>
                {
                    var webRequest = CreateRequest(uri + "?query=" + query);

                    Log.InfoFormat($"Processing {webRequest.RequestUri}");
                    var resultTask = ProcessRequestAsync(webRequest);

                    await Task.WhenAny(resultTask, Task.Delay(timeout));
                    if (!resultTask.IsCompletedSuccessfully)
                    {
                        throw new TimeoutException();
                    }

                    return(resultTask.Result);
                }).ToArray();
                while (tasks.Length > 0)
                {
                    var task = await Task.WhenAny(tasks);

                    if (!task.IsCompletedSuccessfully)
                    {
                        tasks = tasks.Except(new[] { task }).ToArray();
                    }
                    else
                    {
                        return(task.Result);
                    }
                }
                throw new TimeoutException();
            }
            catch (AggregateException e)
            {
                if (e.InnerException != null)
                {
                    throw e.InnerException;
                }
                throw;
            }
        }
        public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            var shuffledReplicas = ReplicaAddresses.ToArray();

            shuffledReplicas.RandomShuffle();

            timeout = TimeSpan.FromTicks(timeout.Ticks / shuffledReplicas.Length);

            foreach (var task in shuffledReplicas
                     .Select(uri => CreateRequest(uri + "?query=" + query))
                     .Select(request => ProcessRequestAsync(request)))
            {
                if (await Task.WhenAny(task, Task.Delay(timeout)) == task)
                {
                    return(task.Result);
                }
            }

            throw new TimeoutException();
        }
        public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            var time = TimeSpan.FromSeconds(timeout.TotalSeconds / ReplicaAddresses.Length);

            var shuffledAddresses = ReplicaAddresses.Shuffle();
            var webRequests       = shuffledAddresses.Select(uri => CreateRequest(uri + "?query=" + query));

            foreach (var request in webRequests)
            {
                Log.InfoFormat("Processing {0}", request.RequestUri);
                var task = ProcessRequestAsync(request);
                await Task.WhenAny(task, Task.Delay(time));

                if (task.IsCompleted && !task.IsFaulted)
                {
                    return(task.Result);
                }
            }

            throw new TimeoutException();
        }
        public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            var tasks = ReplicaAddresses
                        .Select(uri => CreateRequest($"{uri}?query={query}"))
                        .Select(request =>
            {
                Log.InfoFormat($"Processing {request.RequestUri}");
                return(ProcessRequestAsync(request));
            })
                        .ToArray();

            var resultTask = Task.WhenAny(tasks);
            await Task.WhenAny(resultTask, Task.Delay(timeout));

            if (!resultTask.IsCompleted)
            {
                throw new TimeoutException();
            }

            return(resultTask.Result.Result);
        }
        public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            var tasks = ReplicaAddresses.Select(async(uri) =>
            {
                var webRequest = CreateRequest(uri + "?query=" + query);
                Console.WriteLine($"Processing {webRequest.RequestUri}");
                return(await ProcessRequestAsync(webRequest));
            });
            var timeoutTask = Task.Delay(timeout);

            tasks.Append(timeoutTask);

            var resultTask = await Task.WhenAny(tasks);

            if (!resultTask.IsCompleted)
            {
                throw new TimeoutException();
            }

            return(resultTask.Result);
        }
        public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            timeout = TimeSpan.FromSeconds(timeout.TotalSeconds / ReplicaAddresses.Length);

            var orderedAddresses = ReplicaAddresses.OrderBy(addr => requestStatistics[addr].GetValue()).ToArray();

            orderedAddresses.ForEach(uri => stopwatches[uri] = new Stopwatch());

            var tasksPool = new Dictionary <string, Task <string> >();

            foreach (var uri in orderedAddresses)
            {
                var request = CreateRequest(uri + "?query=" + query);
                Log.InfoFormat("Processing {0}", request.RequestUri);

                tasksPool[uri] = ProcessRequestAsync(request);
                var task = Task.WhenAny(tasksPool.Values);
                await Task.WhenAny(task, Task.Delay(timeout));

                if (task.IsCompleted && !task.IsFaulted)
                {
                    stopwatches.Values.ForEach(timer => timer.Stop());

                    var completed = tasksPool.First(pair => pair.Value.IsCompleted).Key;

                    requestStatistics[completed].Update(stopwatches[completed].ElapsedMilliseconds);

                    stopwatches.Values.ForEach(timer => timer.Reset());
                    return(task.Result.Result);
                }

                stopwatches[uri].Stop();
                requestStatistics[uri].Update(stopwatches[uri].ElapsedMilliseconds);
                stopwatches[uri].Start();
            }

            throw new TimeoutException();
        }
        public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            var shuffledReplicas = ReplicaAddresses.ToArray();

            shuffledReplicas.RandomShuffle();

            timeout = TimeSpan.FromTicks(timeout.Ticks / shuffledReplicas.Length);

            var queries = new List <RequestDescriptor>();

            foreach (var uri in shuffledReplicas)
            {
                var guid    = Guid.NewGuid();
                var request = CreateRequest(uri + "?query=" + query + "&guid=" + guid);
                var task    = ProcessRequestAsync(request);
                queries.Add(new RequestDescriptor(uri, guid, task));
                var finishedTask = await Task.WhenAny(queries
                                                      .Select(d => d.Task)
                                                      .Concat(new[] { Task.Delay(timeout) }));

                if (!(finishedTask is Task <string>))
                {
                    continue;
                }
                foreach (var _ in queries
                         .Where(d => d.Task != finishedTask)
                         .Select(d => CreateRequest(d.Uri + "?abort=" + "&guid=" + d.Guid))
                         .Select(r => ProcessRequestAsync(r)))
                {
                    ;
                }

                return((finishedTask as Task <string>).Result);
            }

            throw new TimeoutException();
        }
示例#24
0
        public override async Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            ReplicaAddresses.Shuffle(rand);
            var timeoutOneTask   = new TimeSpan(timeout.Ticks / ReplicaAddresses.Length);
            var timerForAllTasks = Task.Delay(timeout);

            var resultTasks = new List <Task> {
                timerForAllTasks
            };

            foreach (var uri in ReplicaAddresses)
            {
                var timer      = Task.Delay(timeoutOneTask);
                var webRequest = CreateRequest(uri + "?query=" + query);
                Log.InfoFormat("Processing {0}", webRequest.RequestUri);
                resultTasks.Add(ProcessRequestAsync(webRequest));
                var taskWithTimer = resultTasks.Concat(new[] { timer }).ToList();
                var completed     = await Task.WhenAny(taskWithTimer);

                if (timerForAllTasks.IsCompleted)
                {
                    throw new TimeoutException();
                }
                if (timer.IsCompleted)
                {
                    continue;
                }
                if (!completed.IsFaulted)
                {
                    return(((Task <string>)completed).Result);
                }

                resultTasks.Remove(completed);
            }

            throw new TimeoutException();
        }
示例#25
0
        public async override Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            var responseTasks = new Dictionary <WebRequest, Task <string> >();
            var globalTimer   = Stopwatch.StartNew();

            foreach (var webRequest in ReplicaAddresses.Select(uri => CreateRequest(uri + "?query=" + query)))
            {
                Log.InfoFormat($"Processing {webRequest.RequestUri} {DateTime.Now.TimeOfDay}");

                var interRequestsDelay = new TimeSpan((timeout - globalTimer.Elapsed).Ticks / (ReplicaAddresses.Length - responseTasks.Count));
                if (interRequestsDelay < TimeSpan.Zero)
                {
                    throw new TimeoutException();
                }

                responseTasks[webRequest] = ProcessRequestAsync(webRequest);

                await Task.WhenAny(responseTasks.Values.Concat(new[] { Task.Delay(interRequestsDelay) }));

                var responseTask = responseTasks.Values.FirstOrDefault(t => t.IsCompleted);

                if (responseTask == null)
                {
                    continue;
                }

                foreach (var webRequestToAbort in responseTasks.Where(t => !t.Value.IsCompleted).Select(t => t.Key))
                {
                    webRequestToAbort.Abort();
                    Log.InfoFormat("WebRequest to {0} was aborted", webRequestToAbort.RequestUri);
                }

                return(responseTask.Result);
            }

            throw new TimeoutException();
        }
        public async override Task <string> ProcessRequestAsync(string query, TimeSpan timeout)
        {
            var webRequests = ReplicaAddresses
                              .Select(uri => CreateRequest(uri + "?query=" + query))
                              .ToArray();

            foreach (var request in webRequests)
            {
                Log.InfoFormat("Processing {0}", request);
            }

            var requestTasks = webRequests
                               .Select(async request => await ProcessRequestAsync(request))
                               .ToList();

            while (requestTasks.Count > 0)
            {
                var resultTask = await Task.WhenAny(requestTasks);

                await Task.WhenAny(resultTask, Task.Delay(timeout));

                if (!resultTask.IsCompleted)
                {
                    throw new TimeoutException();
                }

                if (!resultTask.IsFaulted)
                {
                    return(resultTask.Result);
                }

                requestTasks.Remove(resultTask);
            }

            throw new TimeoutException();
        }