aeron-io/aeron · error · ClusterException

not found in

Error message

${memberId} not found in ${Arrays.toString(clusterMembers)}

What it means

After a BackupResponse, the agent parses the cluster member list and looks up its own memberId to identify the log supplier. If the memberId is not present in the returned member list, the configuration is inconsistent with the cluster and a ClusterException is thrown naming the id and members.

Solutions

  1. Correct the memberId in the ClusterBackup.Context to one present in the cluster's member list.
  2. Point the backup at the correct cluster endpoints for the intended cluster.
  3. Update the cluster's member configuration if the backup is a legitimate new member that the leader must advertise.

Example fix

// before
ctx.memberId(7); // cluster only has members 0-2
// after
ctx.memberId(2); // must exist in the leader-reported clusterMembers
Defensive patterns

Strategy: validation

Validate before calling

// verify memberId appears in the configured cluster members before launching
boolean known = ClusterMember.parse(Backup.Configuration.clusterMembers())
    .stream().anyMatch(m -> m.id() == memberId);

Prevention

When it happens

Trigger: The configured memberId for the backup does not correspond to any member advertised by the leader in the BackupResponse clusterMembers string — e.g. backup pointed at the wrong cluster, or memberId set manually to a value the cluster does not know.

Common situations: Reusing a backup configuration copied from another cluster; stale cluster member configuration after membership changes; typo in memberId property.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of aeron-io/aeron@6d60124e15 (2026-09-12). Data as JSON: /api/errors/e5a881e36900b3ac. Report an issue: GitHub.

Appendix: source

Thrown at aeron-cluster/src/main/java/io/aeron/cluster/ClusterBackupAgent.java:564

                    NULL_TIMESTAMP,
                    NULL_VALUE,
                    RecordingLog.ENTRY_TYPE_TERM,
                    null,
                    true,
                    -1);
            }

            timeOfLastBackupQueryMs = 0;
            this.correlationId = NULL_VALUE;
            leaderCommitPositionCounterId = commitPositionCounterId;

            clusterMembers = ClusterMember.parse(backupResponseDecoder.clusterMembers());
            ClusterMember.setIsLeader(clusterMembers, leaderMemberId);

            logSupplierMember = ClusterMember.findMember(clusterMembers, memberId);
            if (null == logSupplierMember)
            {
                throw new ClusterException(memberId + " not found in " + Arrays.toString(clusterMembers));
            }

            logSupplierMember.leadershipTermId(logLeadershipTermId);

            if (null != eventsListener)
            {
                eventsListener.onBackupResponse(clusterMembers, logSupplierMember, snapshotsToRetrieve);
            }

            if (null == clusterArchive)
            {
                CloseHelper.close(clusterArchiveAsyncConnect);

                final AeronArchive.Context context = ctx.clusterArchiveContext().clone();
                final ChannelUri logSupplierArchiveUri = ChannelUri.parse(context.controlRequestChannel());
                logSupplierArchiveUri.put(ENDPOINT_PARAM_NAME, logSupplierMember.archiveEndpoint());
                context.controlRequestChannel(logSupplierArchiveUri.toString());

View on GitHub (pinned to 6d60124e15)