Skip to content

Кроткая Александра#62

Open
Krotkaya wants to merge 2 commits intokontur-courses:masterfrom
Krotkaya:master
Open

Кроткая Александра#62
Krotkaya wants to merge 2 commits intokontur-courses:masterfrom
Krotkaya:master

Conversation

@Krotkaya
Copy link
Copy Markdown

No description provided.

protected string[] ReplicaAddresses { get; set; }
protected string[] ReplicaAddresses { get; }
private readonly object statsLock = new ();
private readonly Dictionary<string, (double AvgMs, int Count)> stats = new();
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Предложение на будущее: Лучше использовать контракты, создать класс или record или вообще структуру для хранения данных. Это более удобно использовать, читать и поддерживать)

Comment on lines +29 to +31
protected string[] GetReplicasOrderedBySpeed()
{
lock (statsLock)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лучше в асинхроном коде не использовать синхронные блокировки. Это влияет на производительность

Какие варианты более правильны:

  1. Если есть возможность сделать эти методы асинхронными (Task<string[]>), то за место обычного lock(obj) использовать SemaphoreSlim(1,1) —  его ожидание асинхронное, не сильно влияет на производительность
  2. Если нет возможности превратить эти методы в асинхронные, то лучше тогда исопльзовать LockFree коллекции, к примеру ConcurrentDictionary и использовать его возможности (в основном для записи AddOrUpdate или если данные не слишком важны, то TryUpdate

Comment on lines +40 to +42
protected void RecordReplicaTime(string address, long elapsedMs)
{
lock (statsLock)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут то же замечание, что и выше

attemptSw.Stop();
if (completed != task)
{
RecordReplicaPenalty(addr, (long)slice.TotalMilliseconds);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Единственное, у нас при таймауте записываться будет в статистику не реальное время выполнения, а только время текущего кусочка таймаута — в некоторых случаях такое поведение может быть не валидным; Но в данном случае не страшно

if (runningTasks.Count == 0)
break;

var delay = Task.Delay(leftSlice < leftTotal ? leftSlice : leftTotal);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Есть небольшая потенциальная проблема: не учитывается, что leftTotal может стать отрицательным (если общий таймаут уже истёк). Передача отрицательного значения в Task.Delay вызовет исключение ArgumentOutOfRangeException

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants