Conversation
| var delay = Task.Delay(timeoutPerReplica); | ||
|
|
||
| var completedTask = await Task.WhenAny(requestTask, delay); | ||
| _replicaTimings[replicaAddress] = stopwatch.ElapsedMilliseconds; |
There was a problem hiding this comment.
Некорректное поведение в случае если реплика не ответила и мы вышли по таймауту или если произошла ошибка при отправке запроса или у самой реплики.
В случае с таймаутом, мы запишем некорректное время т.к. мы не знаем реального времени когда завершится запрос. В таком случае лучше либо не записывать такую статистику (она не достоверная), либо записывать время выполнение но умножать его на какой-то штраф (хотя бы x2/x3)
В случае если произошла ошибка, то Task.WhenAny может моментально вернуть нашу таску и мы запишем время выполнения некорректно, что потом повлияет на сортировку и эта реплика станет первой (а не в конце списка). В этом случае надо выставлять достаточно большое штрафное время (выше нормального времени обработки)
|
|
||
| var delay = Task.Delay(timeoutPerReplica); | ||
| var completedTask = await Task.WhenAny(pendingRequests.Append(delay)) as Task<string>; | ||
| _replicaTimings[replicaAddress] = stopwatch.ElapsedMilliseconds; |
There was a problem hiding this comment.
Тут сразу несколько ошибок:
- Такая же как описывал выше в
RoundRobingClusterClient, в случае таймаута мы запишем время некорректное (= timeoutPerReplica), а в случае ошибки, мы запишим некорректно маленькое время, что поднимет реплику в сортировке на самый верх, хотя должна была быть отправлена в самый низ списка реплик - Запись статистики привязана к текущему значению foreach replicaAddress, НО в completedTask может оказаться любой запрос запущенный ранее (т.е. когда foreach уже на последней реплике, в completedTask может оказаться завершенный запрос для первой или второй реплики). Это собственно неправильно запишет статистику и соответственно неправильно отсортирует наши реплики
| return await completedTask; | ||
| } | ||
|
|
||
| while (pendingRequests.Count > 0) |
There was a problem hiding this comment.
А в этом цикле мы в итоге статистику вообще не обновляем. Соответственно данные по скорости работы реплик будут некорректные и не полные
No description provided.