From 79df508507e141e8597715496c5fa2f9f073a733 Mon Sep 17 00:00:00 2001 From: "guoan.chen" Date: Thu, 13 Feb 2025 00:01:48 +0800 Subject: [PATCH 1/4] [c++ Wrapper] Use aeron_distinct_error_log to implement the ErrorLogReader.read functionality. --- .../src/main/cpp_wrapper/CMakeLists.txt | 3 +- .../concurrent/errors/ErrorLogDescriptor.h | 83 ------------------- .../concurrent/errors/ErrorLogReader.h | 58 +++++-------- 3 files changed, 24 insertions(+), 120 deletions(-) delete mode 100644 aeron-client/src/main/cpp_wrapper/concurrent/errors/ErrorLogDescriptor.h diff --git a/aeron-client/src/main/cpp_wrapper/CMakeLists.txt b/aeron-client/src/main/cpp_wrapper/CMakeLists.txt index af6d23af79..490c77c238 100644 --- a/aeron-client/src/main/cpp_wrapper/CMakeLists.txt +++ b/aeron-client/src/main/cpp_wrapper/CMakeLists.txt @@ -52,8 +52,7 @@ SET(HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/atomic/Atomic64_gcc_cpp11.h ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/atomic/Atomic64_gcc_x86_64.h ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/atomic/Atomic64_msvc.h - ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/errors/ErrorLogDescriptor.h - ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/errors/ErrorLogReader.h + ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/errors/ErrorLogReader.h ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/logbuffer/BufferClaim.h ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/logbuffer/DataFrameHeader.h ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/logbuffer/FrameDescriptor.h diff --git a/aeron-client/src/main/cpp_wrapper/concurrent/errors/ErrorLogDescriptor.h b/aeron-client/src/main/cpp_wrapper/concurrent/errors/ErrorLogDescriptor.h deleted file mode 100644 index 238b959b1f..0000000000 --- a/aeron-client/src/main/cpp_wrapper/concurrent/errors/ErrorLogDescriptor.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2014-2025 Real Logic Limited. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#ifndef AERON_CONCURRENT_ERROR_LOG_DESCRIPTOR_H -#define AERON_CONCURRENT_ERROR_LOG_DESCRIPTOR_H - -#include - -#include "util/Index.h" - -namespace aeron { namespace concurrent { namespace errors { - -/** - * Distinct record of error observations. Rather than grow a record indefinitely when many errors of the same type - * are logged, this log takes the approach of only recording distinct errors of the same type type and stack trace - * and keeping a count and time of observation so that the record only grows with new distinct observations. - * - * The provided {@link AtomicBuffer} can wrap a memory-mapped file so logging can be out of process. This provides - * the benefit that if a crash or lockup occurs then the log can be read externally without loss of data. - * - * This class is threadsafe to be used from multiple logging threads. - * - * The error records are recorded to the memory mapped buffer in the following format. - * - *
- *   0                   1                   2                   3
- *   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- *  |R|                         Length                              |
- *  +-+-------------------------------------------------------------+
- *  |R|                     Observation Count                       |
- *  +-+-------------------------------------------------------------+
- *  |R|                Last Observation Timestamp                   |
- *  |                                                               |
- *  +-+-------------------------------------------------------------+
- *  |R|               First Observation Timestamp                   |
- *  |                                                               |
- *  +---------------------------------------------------------------+
- *  |                     ASCII Encoded Error                      ...
- * ...                                                              |
- *  +---------------------------------------------------------------+
- * 
- */ - -namespace ErrorLogDescriptor { - -#pragma pack(push) -#pragma pack(4) -struct ErrorLogEntryDefn -{ - std::int32_t length; - std::int32_t observationCount; - std::int64_t lastObservationTimestamp; - std::int64_t firstObservationTimestamp; -}; -#pragma pack(pop) - -static const util::index_t LENGTH_OFFSET = offsetof(ErrorLogEntryDefn, length); -static const util::index_t OBSERVATION_COUNT_OFFSET = offsetof(ErrorLogEntryDefn, observationCount); -static const util::index_t LAST_OBSERVATION_TIMESTAMP_OFFSET = offsetof(ErrorLogEntryDefn, lastObservationTimestamp); -static const util::index_t FIRST_OBSERVATION_TIMESTAMP_OFFSET = offsetof(ErrorLogEntryDefn, firstObservationTimestamp); -static const util::index_t ENCODED_ERROR_OFFSET = sizeof(ErrorLogEntryDefn); -static const util::index_t HEADER_LENGTH = sizeof(ErrorLogEntryDefn); - -static const util::index_t RECORD_ALIGNMENT = sizeof(std::int64_t); - -} - -}}} - -#endif diff --git a/aeron-client/src/main/cpp_wrapper/concurrent/errors/ErrorLogReader.h b/aeron-client/src/main/cpp_wrapper/concurrent/errors/ErrorLogReader.h index ca417ce4c7..679b23e744 100644 --- a/aeron-client/src/main/cpp_wrapper/concurrent/errors/ErrorLogReader.h +++ b/aeron-client/src/main/cpp_wrapper/concurrent/errors/ErrorLogReader.h @@ -17,9 +17,11 @@ #define AERON_CONCURRENT_ERROR_LOG_READER_H #include -#include "util/BitUtil.h" #include "concurrent/AtomicBuffer.h" -#include "concurrent/errors/ErrorLogDescriptor.h" +extern "C" +{ +#include "concurrent/aeron_distinct_error_log.h" +} namespace aeron { namespace concurrent { namespace errors { @@ -35,40 +37,26 @@ typedef std::function= sinceTimestamp) - { - auto &entry = buffer.overlayStruct(offset); - - ++entries; - - consumer( - entry.observationCount, - entry.firstObservationTimestamp, - lastObservationTimestamp, - buffer.getStringWithoutLength( - offset + ErrorLogDescriptor::ENCODED_ERROR_OFFSET, - static_cast(length - ErrorLogDescriptor::HEADER_LENGTH))); - } - - offset += util::BitUtil::align(length, ErrorLogDescriptor::RECORD_ALIGNMENT); - } - - return entries; + auto consumer = reinterpret_cast(client_id); + (*consumer)(observation_count, + first_observation_timestamp, + last_observation_timestamp, + std::string(encoded_exception, length)); + }; + aeron_error_log_read( + buffer.buffer(), + buffer.capacity(), + aeron_error_log_consumer, + const_cast(reinterpret_cast(&consumer)), + sinceTimestamp); } }}}} From 487e0905430384a4dd8f1ddb42764c4b2a2eb208 Mon Sep 17 00:00:00 2001 From: "guoan.chen" Date: Thu, 13 Feb 2025 00:04:44 +0800 Subject: [PATCH 2/4] tidy up --- aeron-client/src/main/cpp_wrapper/CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/aeron-client/src/main/cpp_wrapper/CMakeLists.txt b/aeron-client/src/main/cpp_wrapper/CMakeLists.txt index 490c77c238..d85e679793 100644 --- a/aeron-client/src/main/cpp_wrapper/CMakeLists.txt +++ b/aeron-client/src/main/cpp_wrapper/CMakeLists.txt @@ -51,8 +51,7 @@ SET(HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/YieldingIdleStrategy.h ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/atomic/Atomic64_gcc_cpp11.h ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/atomic/Atomic64_gcc_x86_64.h - ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/atomic/Atomic64_msvc.h - ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/errors/ErrorLogReader.h + ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/atomic/Atomic64_msvc.h ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/errors/ErrorLogReader.h ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/logbuffer/BufferClaim.h ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/logbuffer/DataFrameHeader.h ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/logbuffer/FrameDescriptor.h From 0d6c7a98893b19cd8d2a6210ef9130d5ac35f290 Mon Sep 17 00:00:00 2001 From: "guoan.chen" Date: Thu, 13 Feb 2025 00:06:02 +0800 Subject: [PATCH 3/4] tidy up --- aeron-client/src/main/cpp_wrapper/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aeron-client/src/main/cpp_wrapper/CMakeLists.txt b/aeron-client/src/main/cpp_wrapper/CMakeLists.txt index d85e679793..5d8df201d7 100644 --- a/aeron-client/src/main/cpp_wrapper/CMakeLists.txt +++ b/aeron-client/src/main/cpp_wrapper/CMakeLists.txt @@ -51,7 +51,8 @@ SET(HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/YieldingIdleStrategy.h ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/atomic/Atomic64_gcc_cpp11.h ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/atomic/Atomic64_gcc_x86_64.h - ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/atomic/Atomic64_msvc.h ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/errors/ErrorLogReader.h + ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/atomic/Atomic64_msvc.h + ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/errors/ErrorLogReader.h ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/logbuffer/BufferClaim.h ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/logbuffer/DataFrameHeader.h ${CMAKE_CURRENT_SOURCE_DIR}/concurrent/logbuffer/FrameDescriptor.h From 53158522ef2d1df94574a5f8f25506bc52c7b775 Mon Sep 17 00:00:00 2001 From: "guoan.chen" Date: Thu, 13 Feb 2025 10:32:25 +0800 Subject: [PATCH 4/4] fix return --- .../src/main/cpp_wrapper/concurrent/errors/ErrorLogReader.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aeron-client/src/main/cpp_wrapper/concurrent/errors/ErrorLogReader.h b/aeron-client/src/main/cpp_wrapper/concurrent/errors/ErrorLogReader.h index 679b23e744..c3e4567ec0 100644 --- a/aeron-client/src/main/cpp_wrapper/concurrent/errors/ErrorLogReader.h +++ b/aeron-client/src/main/cpp_wrapper/concurrent/errors/ErrorLogReader.h @@ -51,12 +51,12 @@ inline static int read(AtomicBuffer &buffer, const error_consumer_t &consumer, s last_observation_timestamp, std::string(encoded_exception, length)); }; - aeron_error_log_read( + return static_cast(aeron_error_log_read( buffer.buffer(), buffer.capacity(), aeron_error_log_consumer, const_cast(reinterpret_cast(&consumer)), - sinceTimestamp); + sinceTimestamp)); } }}}}