mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-26 01:22:04 +00:00
Better
This commit is contained in:
parent
838957f0e2
commit
d374a6fb58
@ -108,9 +108,6 @@ RWLockImpl::LockHolder RWLockImpl::getLock(RWLockImpl::Type type, const String &
|
|||||||
: ProfileEvents::RWLockWritersWaitMilliseconds, watch.elapsedMilliseconds());
|
: ProfileEvents::RWLockWritersWaitMilliseconds, watch.elapsedMilliseconds());
|
||||||
};
|
};
|
||||||
|
|
||||||
GroupsContainer::iterator it_group;
|
|
||||||
ClientsContainer::iterator it_client;
|
|
||||||
|
|
||||||
/// This object is placed above unique_lock, because it may lock in destructor.
|
/// This object is placed above unique_lock, because it may lock in destructor.
|
||||||
LockHolder res;
|
LockHolder res;
|
||||||
|
|
||||||
@ -157,9 +154,13 @@ RWLockImpl::LockHolder RWLockImpl::getLock(RWLockImpl::Type type, const String &
|
|||||||
* We will throw an exception instead.
|
* We will throw an exception instead.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
GroupsContainer::iterator it_group;
|
||||||
|
|
||||||
|
/// A locking request is considered potentially dangerous if it needs to wait in the queue and
|
||||||
|
/// its associated query_id already holds at least one Read lock. We raise an exception in such case
|
||||||
if (type == Type::Write || queue.empty() || queue.back().type == Type::Write)
|
if (type == Type::Write || queue.empty() || queue.back().type == Type::Write)
|
||||||
{
|
{
|
||||||
if (type == Type::Read && !queue.empty() && queue.back().type == Type::Write && request_has_query_id)
|
if (type == Type::Read && request_has_query_id && !queue.empty())
|
||||||
all_read_locks.check(query_id);
|
all_read_locks.check(query_id);
|
||||||
|
|
||||||
/// Create new group of clients
|
/// Create new group of clients
|
||||||
@ -167,13 +168,14 @@ RWLockImpl::LockHolder RWLockImpl::getLock(RWLockImpl::Type type, const String &
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (type == Type::Read && request_has_query_id && queue.size() > 1)
|
||||||
|
all_read_locks.check(query_id);
|
||||||
|
|
||||||
/// Will append myself to last group
|
/// Will append myself to last group
|
||||||
it_group = std::prev(queue.end());
|
it_group = std::prev(queue.end());
|
||||||
|
|
||||||
if (it_group != queue.begin() && request_has_query_id)
|
|
||||||
all_read_locks.check(query_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ClientsContainer::iterator it_client;
|
||||||
/// Append myself to the end of chosen group
|
/// Append myself to the end of chosen group
|
||||||
auto & clients = it_group->clients;
|
auto & clients = it_group->clients;
|
||||||
try
|
try
|
||||||
|
Loading…
Reference in New Issue
Block a user