From 82e965587c34f20305cb5cd15bddc5072ee99ed5 Mon Sep 17 00:00:00 2001 From: hvlad Date: Fri, 25 Jan 2019 12:28:14 +0200 Subject: [PATCH] Fixed bug CORE-5993 : When creation of audit log file fails, there is no error message in firebird.log --- src/include/firebird/FirebirdInterface.idl | 2 ++ src/include/firebird/IdlFbInterfaces.h | 34 +++++++++++++++++++++- src/jrd/trace/TraceObjects.cpp | 15 ++++++++++ src/utilities/ntrace/PluginLogWriter.cpp | 17 +++++++++++ src/utilities/ntrace/PluginLogWriter.h | 1 + src/utilities/ntrace/TracePluginImpl.cpp | 10 ++++++- 6 files changed, 77 insertions(+), 2 deletions(-) diff --git a/src/include/firebird/FirebirdInterface.idl b/src/include/firebird/FirebirdInterface.idl index 3bb82f33907..45c15cfaa1a 100644 --- a/src/include/firebird/FirebirdInterface.idl +++ b/src/include/firebird/FirebirdInterface.idl @@ -1165,6 +1165,8 @@ interface TraceSweepInfo : Versioned interface TraceLogWriter : ReferenceCounted { uint write(const void* buf, uint size); +version: // 3.0.4 -> 3.0.5 + uint write_s(Status status, const void* buf, uint size); } interface TraceInitInfo : Versioned diff --git a/src/include/firebird/IdlFbInterfaces.h b/src/include/firebird/IdlFbInterfaces.h index 105ff6c522a..8f4c08e9373 100644 --- a/src/include/firebird/IdlFbInterfaces.h +++ b/src/include/firebird/IdlFbInterfaces.h @@ -4726,6 +4726,7 @@ namespace Firebird struct VTable : public IReferenceCounted::VTable { unsigned (CLOOP_CARG *write)(ITraceLogWriter* self, const void* buf, unsigned size) throw(); + unsigned (CLOOP_CARG *write_s)(ITraceLogWriter* self, IStatus* status, const void* buf, unsigned size) throw(); }; protected: @@ -4739,13 +4740,27 @@ namespace Firebird } public: - static const unsigned VERSION = 3; + static const unsigned VERSION = 4; unsigned write(const void* buf, unsigned size) { unsigned ret = static_cast(this->cloopVTable)->write(this, buf, size); return ret; } + + template unsigned write_s(StatusType* status, const void* buf, unsigned size) + { + if (cloopVTable->version < 4) + { + StatusType::setVersionError(status, "ITraceLogWriter", cloopVTable->version, 4); + StatusType::checkException(status); + return 0; + } + StatusType::clearException(status); + unsigned ret = static_cast(this->cloopVTable)->write_s(this, status, buf, size); + StatusType::checkException(status); + return ret; + } }; class ITraceInitInfo : public IVersioned @@ -15206,6 +15221,7 @@ namespace Firebird this->addRef = &Name::cloopaddRefDispatcher; this->release = &Name::cloopreleaseDispatcher; this->write = &Name::cloopwriteDispatcher; + this->write_s = &Name::cloopwrite_sDispatcher; } } vTable; @@ -15225,6 +15241,21 @@ namespace Firebird } } + static unsigned CLOOP_CARG cloopwrite_sDispatcher(ITraceLogWriter* self, IStatus* status, const void* buf, unsigned size) throw() + { + StatusType status2(status); + + try + { + return static_cast(self)->Name::write_s(&status2, buf, size); + } + catch (...) + { + StatusType::catchException(&status2); + return static_cast(0); + } + } + static void CLOOP_CARG cloopaddRefDispatcher(IReferenceCounted* self) throw() { try @@ -15265,6 +15296,7 @@ namespace Firebird } virtual unsigned write(const void* buf, unsigned size) = 0; + virtual unsigned write_s(StatusType* status, const void* buf, unsigned size) = 0; }; template diff --git a/src/jrd/trace/TraceObjects.cpp b/src/jrd/trace/TraceObjects.cpp index b627736a8e4..6cd4cda2d98 100644 --- a/src/jrd/trace/TraceObjects.cpp +++ b/src/jrd/trace/TraceObjects.cpp @@ -503,6 +503,7 @@ class TraceLogWriterImpl FB_FINAL : // TraceLogWriter implementation FB_SIZE_T write(const void* buf, FB_SIZE_T size); + FB_SIZE_T write_s(CheckStatusWrapper* status, const void* buf, FB_SIZE_T size); int release() { @@ -556,6 +557,20 @@ FB_SIZE_T TraceLogWriterImpl::write(const void* buf, FB_SIZE_T size) return size; } +FB_SIZE_T TraceLogWriterImpl::write_s(CheckStatusWrapper* status, const void* buf, FB_SIZE_T size) +{ + try + { + return write(buf, size); + } + catch (Exception &ex) + { + ex.stuffException(status); + } + + return 0; +} + /// TraceInitInfoImpl diff --git a/src/utilities/ntrace/PluginLogWriter.cpp b/src/utilities/ntrace/PluginLogWriter.cpp index b8a04bde7ac..ae5e430d45e 100644 --- a/src/utilities/ntrace/PluginLogWriter.cpp +++ b/src/utilities/ntrace/PluginLogWriter.cpp @@ -60,7 +60,10 @@ PluginLogWriter::PluginLogWriter(const char* fileName, size_t maxSize) : mutexName.append(m_fileName); checkMutex("init", ISC_mutex_init(&m_mutex, mutexName.c_str())); + Guard guard(this); #endif + + reopen(); } PluginLogWriter::~PluginLogWriter() @@ -182,6 +185,20 @@ FB_SIZE_T PluginLogWriter::write(const void* buf, FB_SIZE_T size) return written; } +FB_SIZE_T PluginLogWriter::write_s(CheckStatusWrapper* status, const void* buf, FB_SIZE_T size) +{ + try + { + return write(buf, size); + } + catch (Exception &ex) + { + ex.stuffException(status); + } + + return 0; +} + void PluginLogWriter::checkErrno(const char* operation) { if (errno == 0) diff --git a/src/utilities/ntrace/PluginLogWriter.h b/src/utilities/ntrace/PluginLogWriter.h index 6ff0b886ac1..ea53090665c 100644 --- a/src/utilities/ntrace/PluginLogWriter.h +++ b/src/utilities/ntrace/PluginLogWriter.h @@ -56,6 +56,7 @@ class PluginLogWriter FB_FINAL : // TraceLogWriter implementation virtual FB_SIZE_T write(const void* buf, FB_SIZE_T size); + virtual FB_SIZE_T write_s(Firebird::CheckStatusWrapper* status, const void* buf, unsigned size); virtual int release() { diff --git a/src/utilities/ntrace/TracePluginImpl.cpp b/src/utilities/ntrace/TracePluginImpl.cpp index 56fdf81a067..63d1d04a18d 100644 --- a/src/utilities/ntrace/TracePluginImpl.cpp +++ b/src/utilities/ntrace/TracePluginImpl.cpp @@ -236,7 +236,15 @@ void TracePluginImpl::logRecord(const char* action) // TODO: implement adjusting of line breaks // line.adjustLineBreaks(); - logWriter->write(record.c_str(), record.length()); + LocalStatus ls; + CheckStatusWrapper status(&ls); + + logWriter->write_s(&status, record.c_str(), record.length()); + + if (ls.getState() & IStatus::STATE_ERRORS && ls.getErrors()[1] == isc_interface_version_too_old) + logWriter->write(record.c_str(), record.length()); + else + check(&status); record = ""; }