cleanup the parser and message flushing code

This commit is contained in:
Florian Lüke 2023-07-12 16:38:27 +02:00
parent 997a12c433
commit 2db593069d

View file

@ -270,61 +270,57 @@ struct __attribute__((packed, aligned(1))) ParsedModuleHeader
u32 dynamicSize; u32 dynamicSize;
}; };
void parser_nng_eventdata_v1(void *ctx_, int crateIndex, int eventIndex, static const size_t OutputMessageReserved = util::Megabytes(1);
const readout_parser::ModuleData *moduleDataList, unsigned moduleCount)
bool allocate_output_message(ParserNngContext &ctx, const char *debugInfo = "")
{ {
assert(crateIndex >= 0 && crateIndex <= std::numeric_limits<u8>::max()); auto &msg = ctx.outputMessage;
assert(eventIndex >= 0 && eventIndex <= std::numeric_limits<u8>::max());
assert(moduleCount < std::numeric_limits<u8>::max());
auto &ctx = *reinterpret_cast<ParserNngContext *>(ctx_); if (msg)
++ctx.totalReadoutEvents; return false;
auto msg = ctx.outputMessage;
ParsedDataEventHeader eventHeader = if (auto res = nng_msg_alloc(&msg, 0))
{ {
0xF3u, spdlog::error("{} - nng_msg_alloc: {}", debugInfo, nng_strerror(res));
static_cast<u8>(crateIndex), return false;
static_cast<u8>(eventIndex), }
static_cast<u8>(moduleCount),
if (auto res = nng_msg_reserve(msg, OutputMessageReserved))
{
spdlog::error("{} - nng_msg_reserve: {}", debugInfo, nng_strerror(res));
return false;
}
ParsedEventsMessageHeader header =
{
MessageType::ParsedEvents,
++ctx.outputMessageNumber,
}; };
if (int res = nng_msg_append(msg, &eventHeader, sizeof(eventHeader))) nng_msg_append(msg, &header, sizeof(header));
assert(nng_msg_len(msg) == sizeof(header));
return true;
}
bool flush_output_message(ParserNngContext &ctx, const char *debugInfo = "")
{
const auto msgSize = nng_msg_len(ctx.outputMessage);
if (auto res = send_message_retry(ctx.outputSocket, ctx.outputMessage, 0, debugInfo))
{ {
spdlog::error("parser_nng_eventdata_v1: nng_msg_append: {}", nng_strerror(res)); nng_msg_free(ctx.outputMessage);
return; ctx.outputMessage = nullptr;
spdlog::error("{}: send_message_retry: {}:", debugInfo, nng_strerror(res));
return false;
} }
#if 1 ctx.outputMessage = nullptr;
for (size_t moduleIndex = 0; moduleIndex < moduleCount; ++moduleIndex)
{
auto &moduleData = moduleDataList[moduleIndex];
ParsedModuleHeader moduleHeader = {}; spdlog::debug("{}: sent message {} of size {}",
moduleHeader.prefixSize = moduleData.prefixSize; debugInfo, ctx.outputMessageNumber, msgSize);
moduleHeader.dynamicSize = moduleData.dynamicSize;
moduleHeader.suffixSize = moduleData.suffixSize;
if (int res = nng_msg_append(msg, &moduleHeader, sizeof(moduleHeader))) return true;
{
spdlog::error("parser_nng_eventdata_v1: nng_msg_append: {}", nng_strerror(res));
return;
}
auto prefixSpan = prefix_span(moduleData);
auto dynamicSpan = dynamic_span(moduleData);
auto suffixSpan = suffix_span(moduleData);
for (auto &dataSpan: { prefixSpan, dynamicSpan, suffixSpan })
{
if (int res = nng_msg_append(msg, dataSpan.data, dataSpan.size * sizeof(u32)))
{
spdlog::error("parser_nng_eventdata_v1: nng_msg_append: {}", nng_strerror(res));
return;
}
}
}
#endif
} }
void parser_nng_eventdata_v2(void *ctx_, int crateIndex, int eventIndex, void parser_nng_eventdata_v2(void *ctx_, int crateIndex, int eventIndex,
@ -334,31 +330,10 @@ void parser_nng_eventdata_v2(void *ctx_, int crateIndex, int eventIndex,
assert(eventIndex >= 0 && eventIndex <= std::numeric_limits<u8>::max()); assert(eventIndex >= 0 && eventIndex <= std::numeric_limits<u8>::max());
assert(moduleCount < std::numeric_limits<u8>::max()); assert(moduleCount < std::numeric_limits<u8>::max());
static const size_t OutputMessageReserved= util::Megabytes(1);
auto &parserContext = *reinterpret_cast<ParserNngContext *>(ctx_); auto &ctx = *reinterpret_cast<ParserNngContext *>(ctx_);
++parserContext.totalReadoutEvents; ++ctx.totalReadoutEvents;
auto &msg = parserContext.outputMessage; auto &msg = ctx.outputMessage;
auto flush_output_message = [&]
{
const auto msgSize = nng_msg_len(parserContext.outputMessage);
if (auto res = send_message_retry(parserContext.outputSocket, parserContext.outputMessage, 0, "listfile_parser_nng"))
{
nng_msg_free(parserContext.outputMessage);
parserContext.outputMessage = nullptr;
spdlog::error("listfile_parser_nng: send_message_retry: {}:", nng_strerror(res));
return false;
}
parserContext.outputMessage = nullptr;
spdlog::debug("listfile_parser_nng: sent message {} of size {}",
parserContext.outputMessageNumber, msgSize);
return true;
};
size_t requiredBytes = sizeof(ParsedDataEventHeader); size_t requiredBytes = sizeof(ParsedDataEventHeader);
@ -373,33 +348,12 @@ void parser_nng_eventdata_v2(void *ctx_, int crateIndex, int eventIndex,
if (msg && bytesFree < requiredBytes) if (msg && bytesFree < requiredBytes)
{ {
if (!flush_output_message()) if (!flush_output_message(ctx, "parser_nng_eventdata_v2"))
return; return;
} }
if (!msg) if (!msg && !allocate_output_message(ctx, "parser_nng_eventdata_v2"))
{ return;
if (auto res = nng_msg_alloc(&msg, 0))
{
spdlog::error("listfile_parser_nng - nng_msg_alloc: {}", nng_strerror(res));
return;
}
if (auto res = nng_msg_reserve(msg, OutputMessageReserved))
{
spdlog::error("listfile_parser_nng - nng_msg_reserve: {}", nng_strerror(res));
return;
}
ParsedEventsMessageHeader header =
{
MessageType::ParsedEvents,
++parserContext.outputMessageNumber,
};
nng_msg_append(msg, &header, sizeof(header));
assert(nng_msg_len(msg) == sizeof(header));
}
bytesFree = msg ? OutputMessageReserved - nng_msg_len(msg) : 0u; bytesFree = msg ? OutputMessageReserved - nng_msg_len(msg) : 0u;
assert(bytesFree >= requiredBytes); assert(bytesFree >= requiredBytes);
@ -414,11 +368,10 @@ void parser_nng_eventdata_v2(void *ctx_, int crateIndex, int eventIndex,
if (int res = nng_msg_append(msg, &eventHeader, sizeof(eventHeader))) if (int res = nng_msg_append(msg, &eventHeader, sizeof(eventHeader)))
{ {
spdlog::error("parser_nng_eventdata_v1: nng_msg_append: {}", nng_strerror(res)); spdlog::error("parser_nng_eventdata_v2: nng_msg_append: {}", nng_strerror(res));
return; return;
} }
#if 1
for (size_t moduleIndex = 0; moduleIndex < moduleCount; ++moduleIndex) for (size_t moduleIndex = 0; moduleIndex < moduleCount; ++moduleIndex)
{ {
auto &moduleData = moduleDataList[moduleIndex]; auto &moduleData = moduleDataList[moduleIndex];
@ -430,27 +383,39 @@ void parser_nng_eventdata_v2(void *ctx_, int crateIndex, int eventIndex,
if (int res = nng_msg_append(msg, &moduleHeader, sizeof(moduleHeader))) if (int res = nng_msg_append(msg, &moduleHeader, sizeof(moduleHeader)))
{ {
spdlog::error("parser_nng_eventdata_v1: nng_msg_append: {}", nng_strerror(res)); spdlog::error("parser_nng_eventdata_v2: nng_msg_append: {}", nng_strerror(res));
return; return;
} }
if (int res = nng_msg_append(msg, moduleData.data.data, moduleData.data.size * sizeof(u32))) if (int res = nng_msg_append(msg, moduleData.data.data, moduleData.data.size * sizeof(u32)))
{ {
spdlog::error("parser_nng_eventdata_v1: nng_msg_append: {}", nng_strerror(res)); spdlog::error("parser_nng_eventdata_v2: nng_msg_append: {}", nng_strerror(res));
return; return;
} }
} }
#endif
} }
void parser_nng_systemevent(void *ctx_, int crateIndex, const u32 *header, u32 size) void parser_nng_systemevent_v2(void *ctx_, int crateIndex, const u32 *header, u32 size)
{ {
assert(crateIndex >= 0 && crateIndex <= std::numeric_limits<u8>::max()); assert(crateIndex >= 0 && crateIndex <= std::numeric_limits<u8>::max());
auto &ctx = *reinterpret_cast<ParserNngContext *>(ctx_); auto &ctx = *reinterpret_cast<ParserNngContext *>(ctx_);
++ctx.totalSystemEvents; ++ctx.totalSystemEvents;
auto &msg = ctx.outputMessage;
auto msg = ctx.outputMessage; size_t requiredBytes = sizeof(ParsedSystemEventHeader) + size * sizeof(u32);
size_t bytesFree = msg ? OutputMessageReserved - nng_msg_len(msg) : 0u;
if (msg && bytesFree < requiredBytes)
{
if (!flush_output_message(ctx, "parser_nng_systemevent_v2"))
return;
}
if (!msg && !allocate_output_message(ctx, "parser_nng_systemevent_v2"))
return;
bytesFree = msg ? OutputMessageReserved - nng_msg_len(msg) : 0u;
assert(bytesFree >= requiredBytes);
ParsedSystemEventHeader eventHeader = ParsedSystemEventHeader eventHeader =
{ {
@ -465,7 +430,6 @@ void parser_nng_systemevent(void *ctx_, int crateIndex, const u32 *header, u32 s
return; return;
} }
if (int res = nng_msg_append(msg, header, size * sizeof(u32))) if (int res = nng_msg_append(msg, header, size * sizeof(u32)))
{ {
spdlog::error("parser_nng_systemevent: nng_msg_append: {}", nng_strerror(res)); spdlog::error("parser_nng_systemevent: nng_msg_append: {}", nng_strerror(res));
@ -543,7 +507,7 @@ void listfile_parser_nng(
mvlc::readout_parser::ReadoutParserCallbacks parserCallbacks = mvlc::readout_parser::ReadoutParserCallbacks parserCallbacks =
{ {
parser_nng_eventdata_v2, parser_nng_eventdata_v2,
parser_nng_systemevent, parser_nng_systemevent_v2,
}; };
nng_msg *inputMsg = nullptr; nng_msg *inputMsg = nullptr;
@ -614,22 +578,6 @@ void listfile_parser_nng(
auto inputData = reinterpret_cast<const u32 *>(nng_msg_body(inputMsg)); auto inputData = reinterpret_cast<const u32 *>(nng_msg_body(inputMsg));
size_t inputLen = nng_msg_len(inputMsg) / sizeof(u32); size_t inputLen = nng_msg_len(inputMsg) / sizeof(u32);
if (!parserContext.outputMessage)
{
if (auto res = nng_msg_alloc(&parserContext.outputMessage, nng_msg_len(inputMsg) * 1.5))
{
spdlog::error("listfile_parser_nng - nng_msg_alloc: {}", nng_strerror(res));
break;
}
auto &outputHeader = *reinterpret_cast<ParsedEventsMessageHeader *>(nng_msg_body(parserContext.outputMessage));
outputHeader.messageType = MessageType::ParsedEvents;
outputHeader.messageNumber = ++outputMessageNumber;
nng_msg_realloc(parserContext.outputMessage, sizeof(ParsedEventsMessageHeader));
}
assert(parserContext.outputMessage);
readout_parser::parse_readout_buffer( readout_parser::parse_readout_buffer(
listfileFormat, listfileFormat,
parserState, parserState,
@ -642,27 +590,6 @@ void listfile_parser_nng(
tProcess += stopWatch.interval(); tProcess += stopWatch.interval();
// TODO: also flush after a certain time // TODO: also flush after a certain time
#if 0
if (nng_msg_len(parserContext.outputMessage) >= util::Megabytes(1))
{
const auto msgSize = nng_msg_len(parserContext.outputMessage);
if (auto res = send_message_retry(outputSocket, parserContext.outputMessage, 0, "listfile_parser_nng"))
{
nng_msg_free(parserContext.outputMessage);
parserContext.outputMessage = nullptr;
spdlog::error("listfile_parser_nng: send_message_retry: {}:", nng_strerror(res));
break;
}
parserContext.outputMessage = nullptr;
spdlog::debug("listfile_parser_nng: sent message {} of size {}",
outputMessageNumber, msgSize);
}
tSend += stopWatch.interval();
#endif
tTotal += stopWatch.end(); tTotal += stopWatch.end();
} }
@ -686,21 +613,7 @@ void listfile_parser_nng(
} }
if (parserContext.outputMessage) if (parserContext.outputMessage)
{ flush_output_message(parserContext, "listfile_parser_nng_v2");
const auto msgSize = nng_msg_len(parserContext.outputMessage);
if (auto res = send_message_retry(outputSocket, parserContext.outputMessage, 0, "listfile_parser_nng"))
{
nng_msg_free(parserContext.outputMessage);
parserContext.outputMessage = nullptr;
spdlog::error("listfile_parser_nng: send_message_retry: {}:", nng_strerror(res));
}
parserContext.outputMessage = nullptr;
spdlog::debug("listfile_parser_nng: sent message {} of size {}",
outputMessageNumber, msgSize);
}
if (inputMsg) if (inputMsg)
{ {
@ -844,4 +757,4 @@ int main(int argc, char *argv[])
} }
return 0; return 0;
} }