diff --git a/src/logging/Manager.cc b/src/logging/Manager.cc index a3d5471c2e..733ba86cc0 100644 --- a/src/logging/Manager.cc +++ b/src/logging/Manager.cc @@ -536,11 +536,11 @@ Manager::WriterInfo* Manager::FindWriter(WriterFrontend* writer) { } bool Manager::CompareFields(const Filter* filter, const WriterFrontend* writer) { - if ( filter->num_fields != writer->NumFields() ) + if ( filter->num_fields != static_cast(writer->GetFields().size()) ) return false; for ( int i = 0; i < filter->num_fields; ++i ) - if ( filter->fields[i]->type != writer->Fields()[i]->type ) + if ( filter->fields[i]->type != writer->GetFields()[i].type ) return false; return true; @@ -1779,8 +1779,13 @@ void Manager::SendAllWritersTo(const broker::endpoint_info& ei) { for ( Stream::WriterMap::iterator i = stream->writers.begin(); i != stream->writers.end(); i++ ) { WriterFrontend* writer = i->second->writer; const auto& writer_val = et->GetEnumVal(i->first.first); - broker_mgr->PublishLogCreate((*s)->id, writer_val.get(), *i->second->info, writer->NumFields(), - writer->Fields(), ei); + + std::vector fields(writer->GetFields().size()); + for ( size_t i = 0; i < writer->GetFields().size(); i++ ) + fields[i] = &writer->GetFields()[i]; + + broker_mgr->PublishLogCreate((*s)->id, writer_val.get(), *i->second->info, fields.size(), fields.data(), + ei); } } } diff --git a/src/logging/WriterFrontend.cc b/src/logging/WriterFrontend.cc index 121cc94dc6..f4451c3f79 100644 --- a/src/logging/WriterFrontend.cc +++ b/src/logging/WriterFrontend.cc @@ -90,10 +90,11 @@ private: WriterFrontend::WriterFrontend(const WriterBackend::WriterInfo& arg_info, EnumVal* arg_stream, EnumVal* arg_writer, bool arg_local, bool arg_remote) : write_buffer(detail::WriteBuffer(BifConst::Log::write_buffer_size)) { - stream = arg_stream; - writer = arg_writer; - Ref(stream); - Ref(writer); + // The header's fields are initialized in Init() + header = detail::LogWriteHeader{{zeek::NewRef{}, arg_stream}, + {zeek::NewRef{}, arg_writer}, + arg_info.filter_name, + arg_info.path}; disabled = initialized = false; buf = true; @@ -108,7 +109,7 @@ WriterFrontend::WriterFrontend(const WriterBackend::WriterInfo& arg_info, EnumVa name = util::copy_string(util::fmt("%s/%s", arg_info.path, w)); if ( local ) { - backend = log_mgr->CreateBackend(this, writer); + backend = log_mgr->CreateBackend(this, header.writer_id.get()); if ( backend ) backend->Start(); @@ -124,8 +125,6 @@ WriterFrontend::~WriterFrontend() { delete[] fields; - Unref(stream); - Unref(writer); delete info; delete[] name; } @@ -166,8 +165,12 @@ void WriterFrontend::Init(int arg_num_fields, const Field* const* arg_fields) { } if ( remote ) { - broker_mgr->PublishLogCreate(stream, writer, *info, arg_num_fields, arg_fields); + broker_mgr->PublishLogCreate(header.stream_id.get(), header.writer_id.get(), *info, arg_num_fields, arg_fields); } + + header.fields.reserve(arg_num_fields); + for ( int i = 0; i < arg_num_fields; i++ ) + header.fields.emplace_back(*arg_fields[i]); } void WriterFrontend::Write(detail::LogRecord&& arg_vals) { @@ -183,7 +186,7 @@ void WriterFrontend::Write(detail::LogRecord&& arg_vals) { } if ( remote ) { - broker_mgr->PublishLogWrite(stream, writer, info->path, vals); + broker_mgr->PublishLogWrite(header.stream_id.get(), header.writer_id.get(), info->path, vals); } if ( ! backend ) diff --git a/src/logging/WriterFrontend.h b/src/logging/WriterFrontend.h index 2f3590b749..6210e44874 100644 --- a/src/logging/WriterFrontend.h +++ b/src/logging/WriterFrontend.h @@ -2,6 +2,7 @@ #pragma once +#include "zeek/logging/Types.h" #include "zeek/logging/WriterBackend.h" namespace zeek::logging { @@ -228,7 +229,10 @@ public: /** * Returns the number of log fields as passed into the constructor. */ - int NumFields() const { return num_fields; } + [[deprecated("Remove in v8.1: Use GetFields() instead")]] + int NumFields() const { + return num_fields; + } /** * Returns a descriptive name for the writer, including the type of @@ -246,14 +250,19 @@ public: /** * Returns the log fields as passed into the constructor. */ - const threading::Field* const* Fields() const { return fields; } + [[deprecated("Remove in v8.1: Use GetFields() instead")]] + const threading::Field* const* Fields() const { + return fields; + } + + /** + * Returns the log fields once Init() was called on the frontend. + */ + const std::vector& GetFields() const { return header.fields; } protected: friend class Manager; - EnumVal* stream; - EnumVal* writer; - WriterBackend* backend; // The backend we have instantiated. bool disabled; // True if disabled. bool initialized; // True if initialized. @@ -263,9 +272,10 @@ protected: const char* name; // Descriptive name of the WriterBackend::WriterInfo* info; // The writer information. - int num_fields; // The number of log fields. - const threading::Field* const* fields; // The log fields. + int num_fields; // Remove in v8.1. + const threading::Field* const* fields; // Remove in v8.1. + detail::LogWriteHeader header; // Collected information about the WriterFrontend. detail::WriteBuffer write_buffer; // Buffer for bulk writes. };