mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-24 00:22:29 +00:00
dbms: fixed error [#CONV-6490].
This commit is contained in:
parent
0d99e28531
commit
03534ee9ab
@ -2,6 +2,8 @@
|
||||
|
||||
#include <boost/bind.hpp>
|
||||
|
||||
#include <Poco/Net/NetException.h>
|
||||
|
||||
#include <Yandex/Revision.h>
|
||||
|
||||
#include <statdaemons/Stopwatch.h>
|
||||
@ -17,7 +19,6 @@
|
||||
#include <DB/Interpreters/executeQuery.h>
|
||||
|
||||
#include "TCPHandler.h"
|
||||
#include <Poco/Ext/ThreadNumber.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
@ -70,9 +71,10 @@ void TCPHandler::runImpl()
|
||||
state.reset();
|
||||
|
||||
/** Исключение во время выполнения запроса (его надо отдать по сети клиенту).
|
||||
* Клиент сможет его принять, если оно не произошло во время отправки другого пакета.
|
||||
* Клиент сможет его принять, если оно не произошло во время отправки другого пакета и клиент ещё не разорвал соединение.
|
||||
*/
|
||||
SharedPtr<DB::Exception> exception;
|
||||
bool network_error = false;
|
||||
|
||||
try
|
||||
{
|
||||
@ -98,7 +100,7 @@ void TCPHandler::runImpl()
|
||||
|
||||
state.reset();
|
||||
}
|
||||
catch (DB::Exception & e)
|
||||
catch (const DB::Exception & e)
|
||||
{
|
||||
LOG_ERROR(log, "DB::Exception. Code: " << e.code() << ", e.displayText() = " << e.displayText() << ", e.what() = " << e.what()
|
||||
<< ", Stack trace:\n\n" << e.getStackTrace().toString());
|
||||
@ -107,13 +109,20 @@ void TCPHandler::runImpl()
|
||||
if (e.code() == ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT)
|
||||
throw;
|
||||
}
|
||||
catch (Poco::Exception & e)
|
||||
catch (const Poco::Net::NetException & e)
|
||||
{
|
||||
network_error = true;
|
||||
LOG_ERROR(log, "Poco::Net::NetException. Code: " << ErrorCodes::POCO_EXCEPTION << ", e.code() = " << e.code()
|
||||
<< ", e.displayText() = " << e.displayText() << ", e.what() = " << e.what());
|
||||
exception = new Exception(e.displayText(), e.code());
|
||||
}
|
||||
catch (const Poco::Exception & e)
|
||||
{
|
||||
LOG_ERROR(log, "Poco::Exception. Code: " << ErrorCodes::POCO_EXCEPTION << ", e.code() = " << e.code()
|
||||
<< ", e.displayText() = " << e.displayText() << ", e.what() = " << e.what());
|
||||
exception = new Exception(e.displayText(), e.code());
|
||||
}
|
||||
catch (std::exception & e)
|
||||
catch (const std::exception & e)
|
||||
{
|
||||
LOG_ERROR(log, "std::exception. Code: " << ErrorCodes::STD_EXCEPTION << ", e.what() = " << e.what());
|
||||
exception = new Exception(e.what(), ErrorCodes::STD_EXCEPTION);
|
||||
@ -124,25 +133,27 @@ void TCPHandler::runImpl()
|
||||
exception = new Exception("Unknown exception", ErrorCodes::UNKNOWN_EXCEPTION);
|
||||
}
|
||||
|
||||
// TODO Не пытаться ничего отправить (данные, эксепшен, прогресс), если уже стало ясно, что соединение разорвано.
|
||||
// (возникает ошибка IO Error 32, когда пытаемся снова записать в сокет)
|
||||
|
||||
if (exception)
|
||||
try
|
||||
{
|
||||
sendException(*exception);
|
||||
if (exception && !network_error)
|
||||
sendException(*exception);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
/** Не удалось отправить информацию об эксепшене клиенту. */
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
state.reset();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
/** В процессе обработки запроса было исключение, которое мы поймали и отправили клиенту.
|
||||
* При уничтожении конвейера выполнения запроса, было второе исключение.
|
||||
* Например, конвейер мог выполняться в нескольких потоках, и в каждом из них могло возникнуть исключение.
|
||||
* Проигнорируем его.
|
||||
*/
|
||||
}
|
||||
try
|
||||
{
|
||||
state.reset();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
/** В процессе обработки запроса было исключение, которое мы поймали и, возможно, отправили клиенту.
|
||||
* При уничтожении конвейера выполнения запроса, было второе исключение.
|
||||
* Например, конвейер мог выполняться в нескольких потоках, и в каждом из них могло возникнуть исключение.
|
||||
* Проигнорируем его.
|
||||
*/
|
||||
}
|
||||
|
||||
watch.stop();
|
||||
|
Loading…
Reference in New Issue
Block a user