logging/WriterFrontend: Add LogWriteHeader as member

The header captures the enum values as well as the fields
This commit is contained in:
Arne Welzel 2024-11-14 16:52:26 +01:00
parent f5d4526eac
commit 3dd1f8d38a
3 changed files with 38 additions and 20 deletions

View file

@ -536,11 +536,11 @@ Manager::WriterInfo* Manager::FindWriter(WriterFrontend* writer) {
} }
bool Manager::CompareFields(const Filter* filter, const WriterFrontend* writer) { bool Manager::CompareFields(const Filter* filter, const WriterFrontend* writer) {
if ( filter->num_fields != writer->NumFields() ) if ( filter->num_fields != static_cast<int>(writer->GetFields().size()) )
return false; return false;
for ( int i = 0; i < filter->num_fields; ++i ) 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 false;
return true; 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++ ) { for ( Stream::WriterMap::iterator i = stream->writers.begin(); i != stream->writers.end(); i++ ) {
WriterFrontend* writer = i->second->writer; WriterFrontend* writer = i->second->writer;
const auto& writer_val = et->GetEnumVal(i->first.first); 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<const threading::Field*> 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);
} }
} }
} }

View file

@ -90,10 +90,11 @@ private:
WriterFrontend::WriterFrontend(const WriterBackend::WriterInfo& arg_info, EnumVal* arg_stream, EnumVal* arg_writer, WriterFrontend::WriterFrontend(const WriterBackend::WriterInfo& arg_info, EnumVal* arg_stream, EnumVal* arg_writer,
bool arg_local, bool arg_remote) bool arg_local, bool arg_remote)
: write_buffer(detail::WriteBuffer(BifConst::Log::write_buffer_size)) { : write_buffer(detail::WriteBuffer(BifConst::Log::write_buffer_size)) {
stream = arg_stream; // The header's fields are initialized in Init()
writer = arg_writer; header = detail::LogWriteHeader{{zeek::NewRef{}, arg_stream},
Ref(stream); {zeek::NewRef{}, arg_writer},
Ref(writer); arg_info.filter_name,
arg_info.path};
disabled = initialized = false; disabled = initialized = false;
buf = true; 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)); name = util::copy_string(util::fmt("%s/%s", arg_info.path, w));
if ( local ) { if ( local ) {
backend = log_mgr->CreateBackend(this, writer); backend = log_mgr->CreateBackend(this, header.writer_id.get());
if ( backend ) if ( backend )
backend->Start(); backend->Start();
@ -124,8 +125,6 @@ WriterFrontend::~WriterFrontend() {
delete[] fields; delete[] fields;
Unref(stream);
Unref(writer);
delete info; delete info;
delete[] name; delete[] name;
} }
@ -166,8 +165,12 @@ void WriterFrontend::Init(int arg_num_fields, const Field* const* arg_fields) {
} }
if ( remote ) { 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) { void WriterFrontend::Write(detail::LogRecord&& arg_vals) {
@ -183,7 +186,7 @@ void WriterFrontend::Write(detail::LogRecord&& arg_vals) {
} }
if ( remote ) { 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 ) if ( ! backend )

View file

@ -2,6 +2,7 @@
#pragma once #pragma once
#include "zeek/logging/Types.h"
#include "zeek/logging/WriterBackend.h" #include "zeek/logging/WriterBackend.h"
namespace zeek::logging { namespace zeek::logging {
@ -228,7 +229,10 @@ public:
/** /**
* Returns the number of log fields as passed into the constructor. * 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 * 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. * 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<threading::Field>& GetFields() const { return header.fields; }
protected: protected:
friend class Manager; friend class Manager;
EnumVal* stream;
EnumVal* writer;
WriterBackend* backend; // The backend we have instantiated. WriterBackend* backend; // The backend we have instantiated.
bool disabled; // True if disabled. bool disabled; // True if disabled.
bool initialized; // True if initialized. bool initialized; // True if initialized.
@ -263,9 +272,10 @@ protected:
const char* name; // Descriptive name of the const char* name; // Descriptive name of the
WriterBackend::WriterInfo* info; // The writer information. WriterBackend::WriterInfo* info; // The writer information.
int num_fields; // The number of log fields. int num_fields; // Remove in v8.1.
const threading::Field* const* fields; // The log fields. 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. detail::WriteBuffer write_buffer; // Buffer for bulk writes.
}; };