mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-22 09:40:49 +00:00
fix ALTER LIVE VIEW lock issue
This PR fixes a lock issue that happens while executing `ALTER LIVE VIEW` query with the `REFRESH` command that results in a exception. The problem is that lock is currently being acquired in `InterpreterALterQuery.cpp` in the `InterpreterAlterQuery::execute()` method and lock is again being reacquired in `StorageLiveView.cpp` in the ` StorageLiveView::refresh` method. This removes that extra lock. Before fix: ```sql --create table CREATE TABLE test0 ( c0 UInt64 ) ENGINE = MergeTree() PARTITION BY c0 ORDER BY c0; -- enable experimental_live_view :) SET allow_experimental_live_view=1 -- create live view; :) CREATE LIVE VIEW live1 AS SELECT * FROM table0; -- alter live view results in exception :) ALTER LIVE VIEW live1 REFRESH; ... ... Received exception from server (version 20.8.1): Code: 49. DB::Exception: Received from localhost:9000. DB::Exception: RWLockImpl::getLock(): RWLock is already locked in exclusive mode. ``` After fix: ```sql :) ALTER LIVE VIEW live1 REFRESH; ALTER LIVE VIEW live1 REFRESH Ok. 0 rows in set. Elapsed: 0.016 sec. ```
This commit is contained in:
parent
e2fa0eae2f
commit
c3dd968931
@ -101,7 +101,7 @@ BlockIO InterpreterAlterQuery::execute()
|
||||
switch (command.type)
|
||||
{
|
||||
case LiveViewCommand::REFRESH:
|
||||
live_view->refresh(context);
|
||||
live_view->refresh();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -518,9 +518,10 @@ void StorageLiveView::drop()
|
||||
condition.notify_all();
|
||||
}
|
||||
|
||||
void StorageLiveView::refresh(const Context & context)
|
||||
void StorageLiveView::refresh()
|
||||
{
|
||||
auto table_lock = lockExclusively(context.getCurrentQueryId(), context.getSettingsRef().lock_acquire_timeout);
|
||||
// Lock is already acquired exclusively from InterperterAlterQuery.cpp InterpreterAlterQuery::execute() method.
|
||||
// So, reacquiring lock is not needed and will result in an exception.
|
||||
{
|
||||
std::lock_guard lock(mutex);
|
||||
if (getNewBlocks())
|
||||
|
@ -122,7 +122,7 @@ public:
|
||||
void startup() override;
|
||||
void shutdown() override;
|
||||
|
||||
void refresh(const Context & context);
|
||||
void refresh();
|
||||
|
||||
Pipe read(
|
||||
const Names & column_names,
|
||||
|
Loading…
Reference in New Issue
Block a user