Handle Protocol::Server::Log in the RemoteQueryExecutor::finish()

Even when finish() is called, there can be no EndOfStream sent, so it is
100% correct to handle Log packages there.

W/o fix in RemoteQueryExecutor:

    Code: 100, e.displayText() = DB::Exception: Unknown packet 10 from one of the following replicas: : While executing Remote (version 20.8.1.1) (from [::1]:56960) (in query: select * from remote('127.{2,3}', system.numbers) where number = 10 limit 1; ), Stack trace (when copying this message, always include the lines below):

    0. Common/StackTrace.cpp:291: StackTrace::tryCapture() @ 0x28b80a
    1. Common/StackTrace.cpp:256: StackTrace::StackTrace() @ 0x28b6ab
    2. Common/Exception.cpp:42: DB::Exception::Exception(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int) @ 0x2481ba
    3. Common/Exception.h:28: DB::Exception::Exception<>() @ 0x334d48
    4. DataStreams/RemoteQueryExecutor.cpp:288: DB::RemoteQueryExecutor::finish() @ 0x330314
    5. Processors/Sources/RemoteSource.cpp:46: DB::RemoteSource::generate() @ 0x6fce5
This commit is contained in:
Azat Khuzhin 2020-08-17 21:38:56 +03:00
parent ad7379a37e
commit 2e933a94a6
3 changed files with 18 additions and 0 deletions

View File

@ -271,6 +271,12 @@ void RemoteQueryExecutor::finish()
finished = true;
break;
case Protocol::Server::Log:
/// Pass logs from remote server to client
if (auto log_queue = CurrentThread::getInternalTextLogsQueue())
log_queue->pushBlock(std::move(packet.block));
break;
case Protocol::Server::Exception:
got_exception_from_replica = true;
packet.exception->rethrow();

View File

@ -0,0 +1,12 @@
#!/usr/bin/env bash
CLICKHOUSE_CLIENT_SERVER_LOGS_LEVEL=trace
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
. "$CURDIR"/../shell_config.sh
# triggered not for the first query
yes "select * from remote('127.{2,3}', system.numbers) where number = 10 limit 1;" 2>/dev/null | {
head -n20 | ${CLICKHOUSE_CLIENT} -n 2>&1 >/dev/null | grep 'DB::Exception: '
}
# grep above will fail during diff with .reference
exit 0