Search in sources :

Example 96 with Catalog

use of io.aeron.archive.Catalog in project aeron by real-logic.

the class ArchiveTool method compact.

static void compact(final PrintStream out, final File archiveDir, final EpochClock epochClock) {
    final File compactFile = new File(archiveDir, CATALOG_FILE_NAME + ".compact");
    try {
        final Path compactFilePath = compactFile.toPath();
        try (FileChannel channel = FileChannel.open(compactFilePath, READ, WRITE, CREATE_NEW);
            Catalog catalog = openCatalogReadOnly(archiveDir, epochClock)) {
            final MappedByteBuffer mappedByteBuffer = channel.map(READ_WRITE, 0, MAX_CATALOG_LENGTH);
            mappedByteBuffer.order(CatalogHeaderEncoder.BYTE_ORDER);
            try {
                final UnsafeBuffer unsafeBuffer = new UnsafeBuffer(mappedByteBuffer);
                new CatalogHeaderEncoder().wrap(unsafeBuffer, 0).version(catalog.version()).length(CatalogHeaderEncoder.BLOCK_LENGTH).nextRecordingId(catalog.nextRecordingId()).alignment(catalog.alignment());
                final MutableInteger offset = new MutableInteger(CatalogHeaderEncoder.BLOCK_LENGTH);
                final MutableInteger deletedRecords = new MutableInteger();
                final MutableInteger reclaimedBytes = new MutableInteger();
                catalog.forEach((recordingDescriptorOffset, headerEncoder, headerDecoder, descriptorEncoder, descriptorDecoder) -> {
                    final int frameLength = headerDecoder.encodedLength() + headerDecoder.length();
                    if (INVALID == headerDecoder.state()) {
                        deletedRecords.increment();
                        reclaimedBytes.addAndGet(frameLength);
                        final String[] segmentFiles = listSegmentFiles(archiveDir, descriptorDecoder.recordingId());
                        if (segmentFiles != null) {
                            for (final String segmentFile : segmentFiles) {
                                IoUtil.deleteIfExists(new File(archiveDir, segmentFile));
                            }
                        }
                    } else {
                        final int index = offset.getAndAdd(frameLength);
                        unsafeBuffer.putBytes(index, headerDecoder.buffer(), 0, frameLength);
                    }
                });
                out.println("Compaction result: deleted " + deletedRecords.get() + " records and reclaimed " + reclaimedBytes.get() + " bytes");
            } finally {
                BufferUtil.free(mappedByteBuffer);
            }
        }
        final Path catalogFilePath = compactFilePath.resolveSibling(CATALOG_FILE_NAME);
        Files.delete(catalogFilePath);
        Files.move(compactFilePath, catalogFilePath);
    } catch (final IOException ex) {
        ex.printStackTrace(out);
    } finally {
        IoUtil.deleteIfExists(compactFile);
    }
}
Also used : Path(java.nio.file.Path) MappedByteBuffer(java.nio.MappedByteBuffer) FileChannel(java.nio.channels.FileChannel) MutableInteger(org.agrona.collections.MutableInteger) MigrationUtils.fullVersionString(io.aeron.archive.MigrationUtils.fullVersionString) IOException(java.io.IOException) UnsafeBuffer(org.agrona.concurrent.UnsafeBuffer) File(java.io.File) Catalog(io.aeron.archive.Catalog)

Example 97 with Catalog

use of io.aeron.archive.Catalog in project aeron by real-logic.

the class ArchiveTool method createVerifyEntryProcessor.

private static CatalogEntryProcessor createVerifyEntryProcessor(final PrintStream out, final File archiveDir, final Set<VerifyOption> options, final Catalog catalog, final Checksum checksum, final EpochClock epochClock, final MutableInteger errorCount, final ActionConfirmation<File> truncateOnPageStraddle) {
    final ByteBuffer buffer = BufferUtil.allocateDirectAligned(FILE_IO_MAX_LENGTH_DEFAULT, CACHE_LINE_LENGTH);
    buffer.order(LITTLE_ENDIAN);
    final DataHeaderFlyweight headerFlyweight = new DataHeaderFlyweight(buffer);
    return (recordingDescriptorOffset, headerEncoder, headerDecoder, descriptorEncoder, descriptorDecoder) -> verifyRecording(out, archiveDir, options, catalog, checksum, epochClock, errorCount, truncateOnPageStraddle, headerFlyweight, recordingDescriptorOffset, headerEncoder, headerDecoder, descriptorEncoder, descriptorDecoder);
}
Also used : CACHE_LINE_LENGTH(org.agrona.BitUtil.CACHE_LINE_LENGTH) MigrationUtils.fullVersionString(io.aeron.archive.MigrationUtils.fullVersionString) NATIVE_BYTE_ORDER(org.agrona.BufferUtil.NATIVE_BYTE_ORDER) IntConsumer(java.util.function.IntConsumer) UnsafeBuffer(org.agrona.concurrent.UnsafeBuffer) ByteBuffer(java.nio.ByteBuffer) FILE_IO_MAX_LENGTH_DEFAULT(io.aeron.archive.Archive.Configuration.FILE_IO_MAX_LENGTH_DEFAULT) org.agrona(org.agrona) Collectors.toMap(java.util.stream.Collectors.toMap) Path(java.nio.file.Path) HDR_TYPE_PAD(io.aeron.protocol.HeaderFlyweight.HDR_TYPE_PAD) NULL_POSITION(io.aeron.archive.client.AeronArchive.NULL_POSITION) LogBufferDescriptor.positionBitsToShift(io.aeron.logbuffer.LogBufferDescriptor.positionBitsToShift) HEADER_LENGTH(io.aeron.protocol.DataHeaderFlyweight.HEADER_LENGTH) VERIFY_ALL_SEGMENT_FILES(io.aeron.archive.ArchiveTool.VerifyOption.VERIFY_ALL_SEGMENT_FILES) StandardOpenOption(java.nio.file.StandardOpenOption) Math.min(java.lang.Math.min) INVALID(io.aeron.archive.codecs.RecordingState.INVALID) VALID(io.aeron.archive.codecs.RecordingState.VALID) Stream(java.util.stream.Stream) LITTLE_ENDIAN(java.nio.ByteOrder.LITTLE_ENDIAN) EpochClock(org.agrona.concurrent.EpochClock) DataHeaderFlyweight(io.aeron.protocol.DataHeaderFlyweight) ReplaySession.isInvalidHeader(io.aeron.archive.ReplaySession.isInvalidHeader) java.util(java.util) Checksums.newInstance(io.aeron.archive.checksum.Checksums.newInstance) Catalog(io.aeron.archive.Catalog) HeaderFlyweight(io.aeron.protocol.HeaderFlyweight) Configuration(io.aeron.driver.Configuration) READ_WRITE(java.nio.channels.FileChannel.MapMode.READ_WRITE) io.aeron.archive.codecs(io.aeron.archive.codecs) MutableInteger(org.agrona.collections.MutableInteger) PrintStream(java.io.PrintStream) FrameDescriptor(io.aeron.logbuffer.FrameDescriptor) Collections.emptySet(java.util.Collections.emptySet) Files(java.nio.file.Files) SESSION_ID_FIELD_OFFSET(io.aeron.protocol.DataHeaderFlyweight.SESSION_ID_FIELD_OFFSET) AeronArchive.segmentFileBasePosition(io.aeron.archive.client.AeronArchive.segmentFileBasePosition) IOException(java.io.IOException) CommonContext(io.aeron.CommonContext) Checksum(io.aeron.archive.checksum.Checksum) AeronException(io.aeron.exceptions.AeronException) File(java.io.File) INSTANCE(org.agrona.concurrent.SystemEpochClock.INSTANCE) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) APPLY_CHECKSUM(io.aeron.archive.ArchiveTool.VerifyOption.APPLY_CHECKSUM) CncFileDescriptor(io.aeron.CncFileDescriptor) MarkFileHeaderDecoder(io.aeron.archive.codecs.mark.MarkFileHeaderDecoder) HDR_TYPE_DATA(io.aeron.protocol.HeaderFlyweight.HDR_TYPE_DATA) FileChannel(java.nio.channels.FileChannel) BitUtil.align(org.agrona.BitUtil.align) CATALOG_FILE_NAME(io.aeron.archive.Archive.Configuration.CATALOG_FILE_NAME) MappedByteBuffer(java.nio.MappedByteBuffer) LogBufferDescriptor.computeTermIdFromPosition(io.aeron.logbuffer.LogBufferDescriptor.computeTermIdFromPosition) DataHeaderFlyweight(io.aeron.protocol.DataHeaderFlyweight) ByteBuffer(java.nio.ByteBuffer) MappedByteBuffer(java.nio.MappedByteBuffer)

Example 98 with Catalog

use of io.aeron.archive.Catalog in project aeron by real-logic.

the class ArchiveTool method checksum.

static void checksum(final PrintStream out, final File archiveDir, final boolean allFiles, final Checksum checksum, final EpochClock epochClock) {
    try (Catalog catalog = openCatalogReadWrite(archiveDir, epochClock, MIN_CAPACITY, checksum, null)) {
        final ByteBuffer buffer = ByteBuffer.allocateDirect(align(Configuration.MAX_UDP_PAYLOAD_LENGTH, CACHE_LINE_LENGTH));
        buffer.order(LITTLE_ENDIAN);
        catalog.forEach((recordingDescriptorOffset, headerEncoder, headerDecoder, descriptorEncoder, descriptorDecoder) -> {
            try {
                catalog.updateChecksum(recordingDescriptorOffset);
                checksum(buffer, out, archiveDir, allFiles, checksum, descriptorDecoder);
            } catch (final Exception ex) {
                out.println("(recordingId=" + descriptorDecoder.recordingId() + ") ERR: failed to compute checksums");
                out.println(ex);
            }
        });
    }
}
Also used : ByteBuffer(java.nio.ByteBuffer) MappedByteBuffer(java.nio.MappedByteBuffer) Catalog(io.aeron.archive.Catalog) IOException(java.io.IOException) AeronException(io.aeron.exceptions.AeronException)

Aggregations

Catalog (io.aeron.archive.Catalog)98 ParameterizedTest (org.junit.jupiter.params.ParameterizedTest)78 Test (org.junit.jupiter.api.Test)52 File (java.io.File)44 Checksum (io.aeron.archive.checksum.Checksum)40 ByteBuffer (java.nio.ByteBuffer)36 FileChannel (java.nio.channels.FileChannel)36 DataHeaderFlyweight (io.aeron.protocol.DataHeaderFlyweight)34 IOException (java.io.IOException)34 INVALID (io.aeron.archive.codecs.RecordingState.INVALID)30 VALID (io.aeron.archive.codecs.RecordingState.VALID)30 EpochClock (org.agrona.concurrent.EpochClock)30 Archive.segmentFileName (io.aeron.archive.Archive.segmentFileName)26 Checksums.crc32 (io.aeron.archive.checksum.Checksums.crc32)26 ByteBuffer.allocate (java.nio.ByteBuffer.allocate)26 IoUtil (org.agrona.IoUtil)26 Assertions (org.junit.jupiter.api.Assertions)26 Arguments (org.junit.jupiter.params.provider.Arguments)26 MethodSource (org.junit.jupiter.params.provider.MethodSource)26 Path (java.nio.file.Path)24