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) {
if ( filter->num_fields != writer->NumFields() )
if ( filter->num_fields != static_cast<int>(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<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,
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 )

View file

@ -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<threading::Field>& 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.
};