███████████: fixed error with destructors when client closes connection without received all data [#CONV-2546].

This commit is contained in:
Alexey Milovidov 2011-12-12 00:38:01 +00:00
parent a652c56044
commit 450be4a929
5 changed files with 71 additions and 16 deletions

View File

@ -67,7 +67,18 @@ public:
~CompressedWriteBuffer()
{
nextImpl();
bool uncaught_exception = std::uncaught_exception();
try
{
nextImpl();
}
catch (...)
{
/// Если до этого уже было какое-то исключение, то второе исключение проигнорируем.
if (!uncaught_exception)
throw;
}
}
};

View File

@ -89,19 +89,30 @@ public:
virtual ~RemoteWriteBuffer()
{
nextImpl();
bool uncaught_exception = std::uncaught_exception();
Poco::Net::HTTPResponse response;
std::istream & istr = session.receiveResponse(response);
Poco::Net::HTTPResponse::HTTPStatus status = response.getStatus();
if (status != Poco::Net::HTTPResponse::HTTP_OK)
try
{
std::stringstream error_message;
error_message << "Received error from remote server " << uri_str << ". HTTP status code: "
<< status << ", body: " << istr.rdbuf();
nextImpl();
throw Exception(error_message.str(), ErrorCodes::RECEIVED_ERROR_FROM_REMOTE_IO_SERVER);
Poco::Net::HTTPResponse response;
std::istream & istr = session.receiveResponse(response);
Poco::Net::HTTPResponse::HTTPStatus status = response.getStatus();
if (status != Poco::Net::HTTPResponse::HTTP_OK)
{
std::stringstream error_message;
error_message << "Received error from remote server " << uri_str << ". HTTP status code: "
<< status << ", body: " << istr.rdbuf();
throw Exception(error_message.str(), ErrorCodes::RECEIVED_ERROR_FROM_REMOTE_IO_SERVER);
}
}
catch (...)
{
/// Если до этого уже было какое-то исключение, то второе исключение проигнорируем.
if (!uncaught_exception)
throw;
}
}
};

View File

@ -28,9 +28,20 @@ public:
virtual ~WriteBufferFromFile()
{
next();
if (0 != close(fd))
throwFromErrno("Cannot close file " + file_name, ErrorCodes::CANNOT_CLOSE_FILE);
bool uncaught_exception = std::uncaught_exception();
try
{
next();
if (0 != close(fd))
throwFromErrno("Cannot close file " + file_name, ErrorCodes::CANNOT_CLOSE_FILE);
}
catch (...)
{
/// Если до этого уже было какое-то исключение, то второе исключение проигнорируем.
if (!uncaught_exception)
throw;
}
}
virtual std::string getFileName()

View File

@ -49,7 +49,18 @@ public:
virtual ~WriteBufferFromFileDescriptor()
{
nextImpl();
bool uncaught_exception = std::uncaught_exception();
try
{
nextImpl();
}
catch (...)
{
/// Если до этого уже было какое-то исключение, то второе исключение проигнорируем.
if (!uncaught_exception)
throw;
}
}
};

View File

@ -35,7 +35,18 @@ public:
~WriteBufferFromOStream()
{
nextImpl();
bool uncaught_exception = std::uncaught_exception();
try
{
nextImpl();
}
catch (...)
{
/// Если до этого уже было какое-то исключение, то второе исключение проигнорируем.
if (!uncaught_exception)
throw;
}
}
};