Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Aeron Archive - potential bug extend recordings on same channel different stream id #1719

Closed
matteo-gsr opened this issue Jan 15, 2025 · 17 comments

Comments

@matteo-gsr
Copy link

matteo-gsr commented Jan 15, 2025

There seems to be a potential bug in the archive if you try extending multiple exclusive publications on the same channel but different streams. The archive seems to be creating a duplicate recording out of nowhere and the extend fails with cannot extend active recording. As we are trying to use extend, we first query the archive for existing recordings but we unexpectedly get two recordings for a channel/stream, which should never be the case.

  1. create and record two publications on the same channel and two different stream ids. You will notice in the archive there are three recordings instead of two!
  2. stop the app and the archive
  3. start the archive
  4. start the application, query the archive for existing recordings, extend the existing recordings. Fail.
[464454.516705666] ARCHIVE: RECORDING_SIGNAL [52/52]: controlSessionId=391404064 correlationId=41 recordingId=3 subscriptionId=42 position=0 signal=START
[464454.516968500] ARCHIVE: RECORDING_SESSION_STATE_CHANGE [41/41]: recordingId=3 position=0 INIT -> RECORDING reason=""
[464454.537479000] ARCHIVE: RECORDING_SIGNAL [52/52]: controlSessionId=391404064 correlationId=41 recordingId=4 subscriptionId=42 position=0 signal=START

I see in the logs it's starting a recording for the same same subscription id twice but there are two different recordings in there. Something is up.

Note I am using the Archive C client.

@vyazelenko
Copy link
Contributor

@matteo-gsr If you record a stream with multiple publisher (multiple images on the subcriber side) then Archive will create a recording for each publisher, because recordings are session-based.

@matteo-gsr
Copy link
Author

matteo-gsr commented Jan 15, 2025

@vyazelenko - I have a single publisher for each unique combination of channel/stream_id. The archive is the only consumer with simulate spies subscription on.

@vyazelenko
Copy link
Contributor

Can you post a channel uri for the publisher and subscriber and the code snippet how you start the recording?

@matteo-gsr
Copy link
Author

matteo-gsr commented Jan 15, 2025

publisher1: channel=aeron:udp?control-mode=dynamic|control=127.0.0.1:4002, streamId=11004
publisher2: channel=aeron:udp?control-mode=dynamic|control=127.0.0.1:4002, streamId=11005

on first start:

2025-01-15T19:10:01.731159Z  INFO main Looking for recordings for channel=aeron:udp?control-mode=dynamic|control=127.0.0.1:4002, streamId=11004    
2025-01-15T19:10:01.731556Z  INFO main Start new recording: channel=aeron:udp?control-mode=dynamic|control=127.0.0.1:4002, streamId=11004    
2025-01-15T19:10:01.733007Z  INFO main Recording started: subscriptionId=32    
2025-01-15T19:10:01.733020Z  INFO main Looking for recordings for channel=aeron:udp?control-mode=dynamic|control=127.0.0.1:4002, streamId=11005    
2025-01-15T19:10:01.733119Z  INFO main Start new recording: channel=aeron:udp?control-mode=dynamic|control=127.0.0.1:4002, streamId=11005    
2025-01-15T19:10:01.801281Z  INFO main Recording started: subscriptionId=36   ```

however, archive tool shows three recordings, which is wrong:

19:10:54 (start: 2025-01-15 19:09:57, activity: 1970-01-01 00:59:59)
[MarkFileHeader](sbeTemplateId=200|sbeSchemaId=100|sbeSchemaVersion=1|sbeBlockLength=128):version=196864|activityTimestamp=-1|startTimestamp=1736968197346|pid=92319|controlStreamId=10|localControlStreamId=10|eventsStreamId=30|headerLength=8192|errorBufferLength=1048576|controlChannel='aeron:udp?endpoint=127.0.0.1:7001'|localControlChannel='aeron:ipc?term-length=64k'|eventsChannel=''|aeronDirectory='<redacted>'
Catalog capacity in bytes: 1048576
[RecordingDescriptor](sbeTemplateId=22|sbeSchemaId=101|sbeSchemaVersion=10|sbeBlockLength=80):controlSessionId=0|correlationId=0|recordingId=0|startTimestamp=1736968201733|stopTimestamp=1736968218930|startPosition=0|stopPosition=-1|initialTermId=-573713515|segmentFileLength=134217728|termBufferLength=16777216|mtuLength=1408|sessionId=395525068|streamId=11004|strippedChannel='aeron:udp?control=127.0.0.1:4002|control-mode=dynamic'|originalChannel='aeron:udp?control-mode=dynamic|control=127.0.0.1:4002'|sourceIdentity='aeron:ipc'
[RecordingDescriptor](sbeTemplateId=22|sbeSchemaId=101|sbeSchemaVersion=10|sbeBlockLength=80):controlSessionId=0|correlationId=0|recordingId=1|startTimestamp=1736968201733|stopTimestamp=1736968218930|startPosition=0|stopPosition=-1|initialTermId=1086900562|segmentFileLength=134217728|termBufferLength=16777216|mtuLength=1408|sessionId=395525069|streamId=11004|strippedChannel='aeron:udp?control=127.0.0.1:4002|control-mode=dynamic'|originalChannel='aeron:udp?control-mode=dynamic|control=127.0.0.1:4002'|sourceIdentity='aeron:ipc'
[RecordingDescriptor](sbeTemplateId=22|sbeSchemaId=101|sbeSchemaVersion=10|sbeBlockLength=80):controlSessionId=0|correlationId=0|recordingId=2|startTimestamp=1736968201733|stopTimestamp=1736968218928|startPosition=0|stopPosition=-1|initialTermId=1086900562|segmentFileLength=134217728|termBufferLength=16777216|mtuLength=1408|sessionId=395525069|streamId=11005|strippedChannel='aeron:udp?control=127.0.0.1:4002|control-mode=dynamic'|originalChannel='aeron:udp?control-mode=dynamic|control=127.0.0.1:4002'|sourceIdentity='aeron:ipc'

@matteo-gsr
Copy link
Author

and the archive logs too, three recordings, which is wrong. It doesn't happen if I set a different channel for the 2nd publisher.

[466247.931561458] ARCHIVE: CMD_OUT_RESPONSE [44/44]: controlSessionId=566998004 correlationId=29 relevantId=1 code=OK version=68352 errorMessage=
[466247.931694416] ARCHIVE: CMD_IN_LIST_RECORDINGS_FOR_URI [97/97]: controlSessionId=566998004 correlationId=30 fromRecordingId=0 recordCount=2147483647 streamId=11004 channel=aeron:udp?control-mode=dynamic|control=127.0.0.1:4002
[466247.932007958] ARCHIVE: CMD_OUT_RESPONSE [44/44]: controlSessionId=566998004 correlationId=30 relevantId=0 code=RECORDING_UNKNOWN version=68352 errorMessage=
[466247.932102666] ARCHIVE: CMD_IN_START_RECORDING2 [93/93]: controlSessionId=566998004 correlationId=31 streamId=11004 sourceLocation=LOCAL autoStop=TRUE channel=aeron:udp?control-mode=dynamic|control=127.0.0.1:4002
[466247.933453250] ARCHIVE: CMD_OUT_RESPONSE [44/44]: controlSessionId=566998004 correlationId=31 relevantId=32 code=OK version=68352 errorMessage=
[466247.933546166] ARCHIVE: CMD_IN_LIST_RECORDINGS_FOR_URI [97/97]: controlSessionId=566998004 correlationId=34 fromRecordingId=0 recordCount=2147483647 streamId=11005 channel=aeron:udp?control-mode=dynamic|control=127.0.0.1:4002
[466247.933568125] ARCHIVE: CMD_OUT_RESPONSE [44/44]: controlSessionId=566998004 correlationId=34 relevantId=0 code=RECORDING_UNKNOWN version=68352 errorMessage=
[466247.933668625] ARCHIVE: CMD_IN_START_RECORDING2 [93/93]: controlSessionId=566998004 correlationId=35 streamId=11005 sourceLocation=LOCAL autoStop=TRUE channel=aeron:udp?control-mode=dynamic|control=127.0.0.1:4002
[466248.001678541] ARCHIVE: CMD_OUT_RESPONSE [44/44]: controlSessionId=566998004 correlationId=35 relevantId=36 code=OK version=68352 errorMessage=
[466248.033131833] ARCHIVE: RECORDING_SIGNAL [52/52]: controlSessionId=566998004 correlationId=31 recordingId=0 subscriptionId=32 position=0 signal=START
[466248.033287291] ARCHIVE: RECORDING_SIGNAL [52/52]: controlSessionId=566998004 correlationId=31 recordingId=1 subscriptionId=32 position=0 signal=START
[466248.033342875] ARCHIVE: RECORDING_SIGNAL [52/52]: controlSessionId=566998004 correlationId=35 recordingId=2 subscriptionId=36 position=0 signal=START
[466248.035274250] ARCHIVE: RECORDING_SESSION_STATE_CHANGE [41/41]: recordingId=2 position=0 INIT -> RECORDING reason=""
[466248.035466208] ARCHIVE: RECORDING_SESSION_STATE_CHANGE [41/41]: recordingId=1 position=0 INIT -> RECORDING reason=""
[466248.035533666] ARCHIVE: RECORDING_SESSION_STATE_CHANGE [41/41]: recordingId=0 position=0 INIT -> RECORDING reason=""

@matteo-gsr
Copy link
Author

                final AvailableImageHandler handler = (image) -> taskQueue.addLast(() -> startRecordingSession(
                    controlSession, correlationId, strippedChannel, originalChannel, image, autoStop));

could it be that the image handler is calling that twice because it's the same channel?

@vyazelenko
Copy link
Contributor

The issue here is that there are two session for one of the streams:

[RecordingDescriptor](...|recordingId=0|...|sessionId=395525068|streamId=11004|strippedChannel='aeron:udp?control=127.0.0.1:4002|control-mode=dynamic'|originalChannel='aeron:udp?control-mode=dynamic|control=127.0.0.1:4002'|sourceIdentity='aeron:ipc'
[RecordingDescriptor](...|recordingId=1|...|sessionId=395525069|streamId=11004|strippedChannel='aeron:udp?control=127.0.0.1:4002|control-mode=dynamic'|originalChannel='aeron:udp?control-mode=dynamic|control=127.0.0.1:4002'|sourceIdentity='aeron:ipc'
[RecordingDescriptor](...|recordingId=2|...|sessionId=395525069|streamId=11005|strippedChannel='aeron:udp?control=127.0.0.1:4002|control-mode=dynamic'|originalChannel='aeron:udp?control-mode=dynamic|control=127.0.0.1:4002'|sourceIdentity='aeron:ipc'

Here sessionId=395525069 is used for both streamId=11004 and streamId=11005. Hence the two recordings created for streamId=11004.

@matteo-gsr
Copy link
Author

matteo-gsr commented Jan 15, 2025

but why two recordings for 11004 and only one for 11005? it doesn't make much sense. If you look at the archive logs, I am creating two recordings, one for 11004 and one for 11005 but the archive is creating three.

@matteo-gsr
Copy link
Author

matteo-gsr commented Jan 15, 2025

there's even a duplicate correlation id - doesn't make sense. And both correlation ids have a duplicate subscription id.

[466248.033131833] ARCHIVE: RECORDING_SIGNAL [52/52]: controlSessionId=566998004 correlationId=31 recordingId=0 subscriptionId=32 position=0 signal=START
[466248.033287291] ARCHIVE: RECORDING_SIGNAL [52/52]: controlSessionId=566998004 correlationId=31 recordingId=1 subscriptionId=32 position=0 signal=START
[466248.033342875] ARCHIVE: RECORDING_SIGNAL [52/52]: controlSessionId=566998004 correlationId=35 recordingId=2 subscriptionId=36 position=0 signal=START

@matteo-gsr
Copy link
Author

matteo-gsr commented Jan 15, 2025

                final AvailableImageHandler handler = (image) ->
                {
                    System.err.println("imageStreamId="
                            + image.subscription().streamId()
                            + "|recordingStreamId=" + streamId);
                    System.err.flush();
                    taskQueue.addLast(() -> startRecordingSession(
                            controlSession, correlationId, strippedChannel, originalChannel, image, autoStop));
                };

I have added this. You can clearly see from the logs:

[472366.012068375] log started 2025-01-15 21:04:45.510+0000
[472366.143718958] ARCHIVE: CMD_IN_AUTH_CONNECT [127/127]: correlationId=26 responseStreamId=20 version=68352 responseChannel=aeron:udp?endpoint=127.0.0.1:57070|term-length=65536|sparse=true|mtu=1408|session-id=1822753479 encodedCredentialsLength=0
[472366.149835708] ARCHIVE: CONTROL_SESSION_STATE_CHANGE [44/44]: controlSessionId=1690970956 INIT -> CONNECTING reason="connecting"
[472366.149875791] ARCHIVE: CONTROL_SESSION_STATE_CHANGE [48/48]: controlSessionId=1690970956 CONNECTING -> CONNECTED reason="connected"
[472366.150028041] ARCHIVE: CMD_OUT_RESPONSE [44/44]: controlSessionId=1690970956 correlationId=26 relevantId=1690970956 code=OK version=68352 errorMessage=
[472366.150034208] ARCHIVE: CONTROL_SESSION_STATE_CHANGE [55/55]: controlSessionId=1690970956 CONNECTED -> AUTHENTICATED reason="authenticated"
[472366.150105916] ARCHIVE: CONTROL_SESSION_STATE_CHANGE [45/45]: controlSessionId=1690970956 AUTHENTICATED -> ACTIVE reason="active"
[472366.150125291] ARCHIVE: CMD_OUT_RESPONSE [44/44]: controlSessionId=1690970956 correlationId=29 relevantId=4 code=OK version=68352 errorMessage=
[472366.150256916] ARCHIVE: CMD_IN_LIST_RECORDINGS_FOR_URI [97/97]: controlSessionId=1690970956 correlationId=30 fromRecordingId=0 recordCount=2147483647 streamId=11004 channel=aeron:udp?control-mode=dynamic|control=127.0.0.1:4002
[472366.150518125] ARCHIVE: CMD_OUT_RESPONSE [44/44]: controlSessionId=1690970956 correlationId=30 relevantId=0 code=RECORDING_UNKNOWN version=68352 errorMessage=

here we start the recording for channel aeron:udp?control-mode=dynamic|control=127.0.0.1:4002, stream id 11004

[472366.150602750] ARCHIVE: CMD_IN_START_RECORDING2 [93/93]: controlSessionId=1690970956 correlationId=31 streamId=11004 sourceLocation=LOCAL autoStop=TRUE channel=aeron:udp?control-mode=dynamic|control=127.0.0.1:4002
[472366.151649833] ARCHIVE: CMD_OUT_RESPONSE [44/44]: controlSessionId=1690970956 correlationId=31 relevantId=32 code=OK version=68352 errorMessage=

perform some query just to see if there isn't an existing recording, none is found, as expected.

[472366.151709708] ARCHIVE: CMD_IN_LIST_RECORDINGS_FOR_URI [97/97]: controlSessionId=1690970956 correlationId=34 fromRecordingId=0 recordCount=2147483647 streamId=11005 channel=aeron:udp?control-mode=dynamic|control=127.0.0.1:4002
[472366.151728666] ARCHIVE: CMD_OUT_RESPONSE [44/44]: controlSessionId=1690970956 correlationId=34 relevantId=0 code=RECORDING_UNKNOWN version=68352 errorMessage=

here we start the recording for aeron:udp?control-mode=dynamic|control=127.0.0.1:4002, stream id 11005

[472366.151822750] ARCHIVE: CMD_IN_START_RECORDING2 [93/93]: controlSessionId=1690970956 correlationId=35 streamId=11005 sourceLocation=LOCAL autoStop=TRUE channel=aeron:udp?control-mode=dynamic|control=127.0.0.1:4002
imageStreamId=11004|recordingStreamId=11004

archive prints that log - which is related to the first recording.

archive is processing 2nd recording here:

[472366.204209625] ARCHIVE: CMD_OUT_RESPONSE [44/44]: controlSessionId=1690970956 correlationId=35 relevantId=36 code=OK version=68352 errorMessage=
[472366.209820791] ARCHIVE: RECORDING_SIGNAL [52/52]: controlSessionId=1690970956 correlationId=31 recordingId=0 subscriptionId=32 position=0 signal=START
[472366.211545208] ARCHIVE: RECORDING_SESSION_STATE_CHANGE [41/41]: recordingId=0 position=0 INIT -> RECORDING reason=""

archive prints again 1004 and 1005. It should only print 1005.

imageStreamId=11004|recordingStreamId=11004
imageStreamId=11005|recordingStreamId=11005
[472366.227596250] ARCHIVE: RECORDING_SIGNAL [52/52]: controlSessionId=1690970956 correlationId=31 recordingId=1 subscriptionId=32 position=0 signal=START
[472366.227651708] ARCHIVE: RECORDING_SIGNAL [52/52]: controlSessionId=1690970956 correlationId=35 recordingId=2 subscriptionId=36 position=0 signal=START
[472366.228085958] ARCHIVE: RECORDING_SESSION_STATE_CHANGE [41/41]: recordingId=2 position=0 INIT -> RECORDING reason=""
[472366.228171666] ARCHIVE: RECORDING_SESSION_STATE_CHANGE [41/41]: recordingId=1 position=0 INIT -> RECORDING reason=""

@matteo-gsr
Copy link
Author

matteo-gsr commented Jan 15, 2025

One more thing, if I switch to AERON_ARCHIVE_SOURCE_LOCATION_REMOTE, it doesn't happen, it works as expected. So it seems to be related when one uses spy and spies_simulate_connection

@matteo-gsr
Copy link
Author

matteo-gsr commented Jan 16, 2025

And one more thing - it's only happening with the C media driver. The Java media driver doesn't show the issue. Just tested. So the behaviour is not aligned between the two. So to cut a long story short, the issue is showing when:

  1. use two exclusive network publications, same channel, different stream ids. The publishers are unique.
  2. record the publications, using source local (which behind the scenes uses spy)
  3. c media driver is used

even though you asked to record two publications, three recordings are erroneously created.

@matteo-gsr
Copy link
Author

matteo-gsr commented Jan 16, 2025

you can reproduce it with this simple example:

#if defined(__linux__)
#define _BSD_SOURCE
#define _GNU_SOURCE
#endif

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <inttypes.h>
#include <string.h>

#if !defined(_MSC_VER)
#include <unistd.h>
#endif

#include "aeronc.h"
#include "concurrent/aeron_atomic.h"
#include "util/aeron_strutil.h"
#include "util/aeron_parse_util.h"
#include "aeron_agent.h"
#include "aeron_alloc.h"
#include "aeron_client.h"
#include "aeron_archive.h"
#include "aeron_archive_client.h"
#include "aeron_archive_context.h"

int main(int argc, char **argv)
{
    int status = EXIT_FAILURE, opt;
    aeron_context_t *context = NULL;
    aeron_t *aeron = NULL;
    const char *aeron_dir = "/tmp/aeron";

    if (aeron_context_init(&context) < 0)
    {
        fprintf(stderr, "aeron_context_init: %s\n", aeron_errmsg());
        goto cleanup;
    }

    if (NULL != aeron_dir)
    {
        if (aeron_context_set_dir(context, aeron_dir) < 0)
        {
            fprintf(stderr, "aeron_context_set_dir: %s\n", aeron_errmsg());
            goto cleanup;
        }
    }

    if (aeron_init(&aeron, context) < 0)
    {
        fprintf(stderr, "aeron_init: %s\n", aeron_errmsg());
        goto cleanup;
    }

    if (aeron_start(aeron) < 0)
    {
        fprintf(stderr, "aeron_start: %s\n", aeron_errmsg());
        goto cleanup;
    }

    const char *channel_1 = "aeron:udp?control-mode=dynamic|control=127.0.0.1:4002";
    int32_t stream_id_1 = 11004;

    const char *channel_2 = "aeron:udp?control-mode=dynamic|control=127.0.0.1:4002";
    int32_t stream_id_2 = 11005;

    aeron_archive_context_t *archive_ctx;
    aeron_archive_async_connect_t *archive_async;
    aeron_archive_t *archive = NULL;
    int m_idle_duration_ns = 1000000;

    aeron_archive_context_init(&archive_ctx);
    aeron_archive_context_set_aeron(archive_ctx, aeron);
    aeron_archive_context_set_control_request_channel(archive_ctx, "aeron:udp?endpoint=127.0.0.1:7001");
    aeron_archive_context_set_control_response_channel(archive_ctx, "aeron:udp?endpoint=127.0.0.1:0");

    fprintf(stderr, "connecting to archive");
    aeron_archive_async_connect(&archive_async, archive_ctx);
    while (NULL == archive) {
        if (aeron_archive_async_connect_poll(&archive, archive_async) < 0) {
            fprintf(stderr, "aeron_archive_async_connect_poll: %s\n", aeron_errmsg());
            goto cleanup;
        }
        sched_yield();
    }
    fprintf(stderr, "connected to archive");

    // start the recording on the first publication
    int64_t subscription_id_1;
    if (aeron_archive_start_recording(&subscription_id_1, archive, channel_1, stream_id_1, AERON_ARCHIVE_SOURCE_LOCATION_LOCAL, true) < 0) {
        fprintf(stderr, "aeron_archive_start_recording: %s\n", aeron_errmsg());
    } else {
        fprintf(stdout, "aeron_archive_start_recording: started\n");
    }

    // start the recording on the second publication
    int64_t subscription_id_2;
    if (aeron_archive_start_recording(&subscription_id_2, archive, channel_2, stream_id_2, AERON_ARCHIVE_SOURCE_LOCATION_LOCAL, true) < 0) {
        fprintf(stderr, "aeron_archive_start_recording: %s\n", aeron_errmsg());
    } else {
        fprintf(stdout, "aeron_archive_start_recording: started\n");
    }

    // add the first exclusive publication now
    aeron_async_add_exclusive_publication_t *async_1 = NULL;
    aeron_exclusive_publication_t *publication_1 = NULL;
    if (aeron_async_add_exclusive_publication(&async_1, aeron, channel_1, stream_id_1) < 0)
    {
        fprintf(stderr, "aeron_async_add_exclusive_publication: %s\n", aeron_errmsg());
        goto cleanup;
    }

    while (NULL == publication_1)
    {
        if (aeron_async_add_exclusive_publication_poll(&publication_1, async_1) < 0)
        {
            fprintf(stderr, "aeron_async_add_exclusive_publication_poll: %s\n", aeron_errmsg());
            goto cleanup;
        }

        sched_yield();
    }

    // add the second exclusive publication now
    aeron_async_add_exclusive_publication_t *async_2 = NULL;
    aeron_exclusive_publication_t *publication_2 = NULL;
    if (aeron_async_add_exclusive_publication(&async_2, aeron, channel_2, stream_id_2) < 0)
    {
        fprintf(stderr, "aeron_async_add_exclusive_publication: %s\n", aeron_errmsg());
        goto cleanup;
    }

    while (NULL == publication_2)
    {
        if (aeron_async_add_exclusive_publication_poll(&publication_2, async_2) < 0)
        {
            fprintf(stderr, "aeron_async_add_exclusive_publication_poll: %s\n", aeron_errmsg());
            goto cleanup;
        }

        sched_yield();
    }


    while (true) {
      sleep(1);
    }

    status = EXIT_SUCCESS;

cleanup:
    aeron_exclusive_publication_close(publication_1, NULL, NULL);
    aeron_exclusive_publication_close(publication_2, NULL, NULL);
    aeron_archive_close(archive);
    aeron_archive_context_close(archive_ctx);
    aeron_close(aeron);
    aeron_context_close(context);

    return status;
}

run the C media driver as follows:

AERON_SPIES_SIMULATE_CONNECTION=true AERON_PRINT_CONFIGURATION=1 AERON_DIR=/tmp/aeron ./cppbuild/Release/binaries/aeronmd

and then the archive as follows:

    java -cp aeron-all.jar --add-opens java.base/jdk.internal.misc=ALL-UNNAMED \
      -javaagent:aeron-agent.jar \
      -Daeron.dir=/tmp/aeron  \
      -Daeron.archive.dir=./data/aeron-archive \
      -Daeron.event.log=all \
      -Daeron.event.archive.log=all \
      -Daeron.archive.control.channel="aeron:udp?endpoint=127.0.0.1:7001" \
      -Daeron.archive.response.channel="" \
      -Daeron.archive.recording.channel="" \
      -Daeron.archive.replication.channel="" \
      io.aeron.archive.Archive

Run the archive tool, you would expect two recordings to be created. You'll be surprised!

java -cp aeron-all.jar --add-opens java.base/jdk.internal.misc=ALL-UNNAMED io.aeron.archive.ArchiveTool ./da
ta/aeron-archive describe

@matteo-gsr
Copy link
Author

if you move the add publications before the start recording, the issue doesn't happen. Eager to hear what you think the problem might be.

@vyazelenko
Copy link
Contributor

@matteo-gsr There seems to be a bug in the C media driver around spy matching logic. I was able to reproduce the issue without an Archive.

vyazelenko added a commit that referenced this issue Jan 16, 2025
@nbradac
Copy link
Contributor

nbradac commented Jan 16, 2025

I believe I've found the issue and have opened a PR: #1722

@vyazelenko
Copy link
Contributor

Fixed with #1722.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants