Suppress exceptions from logger code

Some code does not expect from the logger code to throw, and this can
lead to the problems like:
- marking distributed batch as broken (in
  StorageDistributedDirectoryMonitor)
- some MergeTree code may also be affected.

So instead of throwing the exception, it will be logged to the stderr
(if it is possible).
This commit is contained in:
Azat Khuzhin 2021-05-12 21:18:15 +03:00
parent be66ecacef
commit 89a4d886bf
2 changed files with 40 additions and 2 deletions

View File

@ -4,6 +4,7 @@
#include <Core/Block.h>
#include <Interpreters/InternalTextLogsQueue.h>
#include <Interpreters/TextLog.h>
#include <IO/WriteBufferFromFileDescriptor.h>
#include <sys/time.h>
#include <Poco/Message.h>
#include <Common/CurrentThread.h>
@ -26,16 +27,52 @@ void OwnSplitChannel::log(const Poco::Message & msg)
auto matches = masker->wipeSensitiveData(message_text);
if (matches > 0)
{
logSplit({msg, message_text}); // we will continue with the copy of original message with text modified
tryLogSplit({msg, message_text}); // we will continue with the copy of original message with text modified
return;
}
}
logSplit(msg);
tryLogSplit(msg);
}
void OwnSplitChannel::tryLogSplit(const Poco::Message & msg)
{
try
{
logSplit(msg);
}
catch (...)
{
/// It is better to catch the errors here in order to avoid
/// breaking some functionality because of unexpected "File not
/// found" (or similar) error.
///
/// For example StorageDistributedDirectoryMonitor will mark batch
/// as broken, some MergeTree code can also be affected.
///
/// Also note, that we cannot log the exception here, since this
/// will lead to recursion, using regular tryLogCurrentException().
/// but let's log it into the stderr at least.
std::string message = "Cannot add message to the log:\n";
message += msg.getText();
message += "\n";
message += getCurrentExceptionMessage(true);
try
{
WriteBufferFromFileDescriptor out(STDERR_FILENO, 4096);
writeBinary(message, out);
out.finalize();
}
catch (...)
{
/// Nothing can be done. Ignore the exception.
}
}
}
void OwnSplitChannel::logSplit(const Poco::Message & msg)
{
ExtendedLogMessage msg_ext = ExtendedLogMessage::getFrom(msg);

View File

@ -24,6 +24,7 @@ public:
private:
void logSplit(const Poco::Message & msg);
void tryLogSplit(const Poco::Message & msg);
using ChannelPtr = Poco::AutoPtr<Poco::Channel>;
/// Handler and its pointer casted to extended interface