mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 15:12:02 +00:00
Better exception message in client in case of exception while writing blocks
This commit is contained in:
parent
b0539eb28f
commit
9d65d83c83
@ -1409,6 +1409,11 @@ void TCPHandler::sendData(const Block & block)
|
||||
{
|
||||
initBlockOutput(block);
|
||||
|
||||
auto prev_bytes_written_out = out->count();
|
||||
auto prev_bytes_written_compressed_out = state.maybe_compressed_out->count();
|
||||
|
||||
try
|
||||
{
|
||||
writeVarUInt(Protocol::Server::Data, *out);
|
||||
/// Send external table name (empty name is the main table)
|
||||
writeStringBinary("", *out);
|
||||
@ -1425,6 +1430,28 @@ void TCPHandler::sendData(const Block & block)
|
||||
state.block_out->write(block);
|
||||
state.maybe_compressed_out->next();
|
||||
out->next();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
/// In case of unsuccessful write, if the buffer with written data was not flushed,
|
||||
/// we will rollback write to avoid breaking the protocol.
|
||||
/// (otherwise the client will not be able to receive exception after unfinished data
|
||||
/// as it will expect the continuation of the data).
|
||||
/// It looks like hangs on client side or a message like "Data compressed with different methods".
|
||||
|
||||
if (state.compression == Protocol::Compression::Enable)
|
||||
{
|
||||
auto extra_bytes_written_compressed = state.maybe_compressed_out->count() - prev_bytes_written_compressed_out;
|
||||
if (state.maybe_compressed_out->offset() >= extra_bytes_written_compressed)
|
||||
state.maybe_compressed_out->position() -= extra_bytes_written_compressed;
|
||||
}
|
||||
|
||||
auto extra_bytes_written_out = out->count() - prev_bytes_written_out;
|
||||
if (out->offset() >= extra_bytes_written_out)
|
||||
out->position() -= extra_bytes_written_out;
|
||||
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user