You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Чтобы лучше воспроизводилось надо "пропатчиить" это место (суть патча добавить sleep чтобы разломать инварианты)
diff --git a/core/include/userver/concurrent/queue.hpp b/core/include/userver/concurrent/queue.hpp
index 97de7533a..706ba2ba4 100644
--- a/core/include/userver/concurrent/queue.hpp+++ b/core/include/userver/concurrent/queue.hpp@@ -404,6 +404,18 @@ class GenericQueue<T, QueuePolicy>::SingleProducerSide final {
used_capacity_.fetch_add(value_size);
queue_.DoPush(token, std::move(value));
++ // Проблема в этом месте. Reset может сделать сброс "следующего" события.+ //+ // Пусть начали делать вставку в очередь и одновременно удалять единственный Consumer+ // Во время начала вставки консьюемер еще был жив (NoMoreConsumers == false)+ // Успешно вставляем элемент (queue_.DoPush)+ // Consumer удаляется, при удалении он выставляет event в деструкторе (queue_->MarkConsumerIsDead())+ // А теперь мы сбрасываем event (non_full_event_.Reset())+ //+ // Итого на выходе вернем true, и клиенты опять будут обращаться к Producer и блокироватья навсегда.+ std::this_thread::sleep_for(std::chrono::seconds(3));+
non_full_event_.Reset();
return true;
}
По итогу сниппет кода виснет намертво с таким stdout:
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from Queue
[ RUN ] Queue.RaceCondition
consumer reseted
first push successed
The text was updated successfully, but these errors were encountered:
Воспроизведение:
Чтобы лучше воспроизводилось надо "пропатчиить" это место (суть патча добавить sleep чтобы разломать инварианты)
По итогу сниппет кода виснет намертво с таким stdout:
The text was updated successfully, but these errors were encountered: