All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.fluxtion.agrona.concurrent.errors.ErrorLogReader Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2014-2024 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.
 */
package com.fluxtion.agrona.concurrent.errors;

import com.fluxtion.agrona.concurrent.AtomicBuffer;

import static com.fluxtion.agrona.BitUtil.SIZE_OF_INT;
import static com.fluxtion.agrona.BitUtil.align;
import static com.fluxtion.agrona.concurrent.errors.DistinctErrorLog.*;

/**
 * Reader for the log created by a {@link DistinctErrorLog} encoded as UTF-8 errors.
 * 

* The read methods are thread safe. */ public class ErrorLogReader { /** * Has the error buffer any recorded errors? * * @param buffer containing the {@link DistinctErrorLog}. * @return true if there is at least one error. */ public static boolean hasErrors(final AtomicBuffer buffer) { return buffer.capacity() >= SIZE_OF_INT && buffer.getIntVolatile(LENGTH_OFFSET) > 0; } /** * Read all the errors in a log since the creation of the log. * * @param buffer containing the {@link DistinctErrorLog}. * @param consumer to be called for each exception encountered. * @return the number of entries that has been read. */ public static int read(final AtomicBuffer buffer, final ErrorConsumer consumer) { return read(buffer, consumer, 0); } /** * Read all the errors in a log since a given timestamp. * * @param buffer containing the {@link DistinctErrorLog}. * @param consumer to be called for each exception encountered. * @param sinceTimestamp for filtering errors that have been recorded since this time. * @return the number of entries that has been read. */ public static int read(final AtomicBuffer buffer, final ErrorConsumer consumer, final long sinceTimestamp) { int entries = 0; int offset = 0; final int capacity = buffer.capacity(); while (offset <= capacity - ENCODED_ERROR_OFFSET) { final int length = Math.min(buffer.getIntVolatile(offset + LENGTH_OFFSET), capacity - offset); if (length <= 0) { break; } final long lastObservationTimestamp = buffer.getLongVolatile(offset + LAST_OBSERVATION_TIMESTAMP_OFFSET); if (lastObservationTimestamp >= sinceTimestamp) { ++entries; consumer.accept( buffer.getInt(offset + OBSERVATION_COUNT_OFFSET), buffer.getLong(offset + FIRST_OBSERVATION_TIMESTAMP_OFFSET), lastObservationTimestamp, buffer.getStringWithoutLengthUtf8(offset + ENCODED_ERROR_OFFSET, length - ENCODED_ERROR_OFFSET)); } offset += align(length, RECORD_ALIGNMENT); } return entries; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy