Skip to content

Conversation

@maedhroz
Copy link
Contributor

@maedhroz maedhroz commented Jan 15, 2026

Tracked keyspaces cannot accept new data without first registering it in
the log. Any unreconciled data that isn't present in the log will break
read monotonicity, since mutation tracking uses a single data read and
can only read reconcile mutation IDs that are present in the log. For
more information about how bulk transfers work on tracked keyspaces, see
TrackedImportTransfer.

Full repair sync tasks also deliver data to replicas, and require
integration with the log just like imports do. For more details on a
read anomaly that could happen without integration with the bulk
transfer machinery, see
TrackedKeyspaceRepairSupportTest#testFullRepairPartiallyCompleteAnomaly.

The general design of this integration is to give repair SyncTasks the
same two-phase commit as import transfers, where we stream SSTables to a
pending/ directory, then once sufficient streams complete successfully,
we "activate" those streams and move them out of the pending directory
and into the live set.

The first step is to ensure that each SyncTask is aligned to a single
Mutation Tracking shard, by splitting SyncTasks along the shard
boundaries. Each SyncTask will then stream data within a single shard,
and permit us to assign a single transfer ID to each SyncTask.

Each participant in a repair may receive different SyncTasks (or none at
all, if they're already in-sync). This means that ActivationRequest must be flexible
enough to support transfers with multiple plan IDs or none at all.

@maedhroz maedhroz force-pushed the CASSANDRA-21066-maedhroz branch from 9edc6c2 to d74f11b Compare January 15, 2026 19:29
@maedhroz maedhroz force-pushed the CASSANDRA-21066-maedhroz branch from 9ce9758 to 673e86f Compare January 24, 2026 00:51
@maedhroz maedhroz force-pushed the CASSANDRA-21066-maedhroz branch from f876476 to 7781a20 Compare January 27, 2026 03:40

import org.junit.Test;

public class TrackedNonZeroCopyRepairTransferTest extends TrackedRepairTransferTest
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These tests, and their ZCS equivalents could probably just share a cluster and create a keysapce per test.

aratno and others added 18 commits February 5, 2026 10:47
…aces

This comes with lots of comments and a handful of integration tests, but
the tests aren't passing and it coul use more unit test coverage.
There's a refactor (introducing SyncTasks) that's only partially
complete.

The rest of this commit message is a description of how full repair
is intended to work for tracked keyspaces.

Tracked keyspaces cannot accept new data without first registering it in
the log. Any unreconciled data that isn't present in the log will break
read monotonicity, since mutation tracking uses a single data read and
can only read reconcile mutation IDs that are present in the log. For
more information about how bulk transfers work on tracked keyspaces, see
TrackedImportTransfer.

Full repair sync tasks also deliver data to replicas, and require
integration with the log just like imports do. For more details on a
read anomaly that could happen without integration with the bulk
transfer machinery, see
TrackedKeyspaceRepairSupportTest#testFullRepairPartiallyCompleteAnomaly.

The general design of this integration is to give repair SyncTasks the
same two-phase commit as import transfers, where we stream SSTables to a
pending/ directory, then once sufficient streams complete successfully,
we "activate" those streams and move them out of the pending directory
and into the live set.

The first step is to ensure that each SyncTask is aligned to a single
Mutation Tracking shard, by splitting SyncTasks along the shard
boundaries. Each SyncTask will then stream data within a single shard,
and permit us to assign a single transfer ID to each SyncTask.

Each participant in a repair may receive different SyncTasks (or none at
all, if they're already in-sync). This means that TransferActivation
needs to be made more flexible, and support a single TransferActivation
with multiple plan IDs, or no plan IDs at all. This increase in
flexibility has not yet been implemented.

patch by Abe Ratnofsky; reviewed by Caleb Rackliffe and ? for CASSANDRA-21066
…when nodes are on the receiving end of multiple sync tasks

- minor renaming and cleanup
- stop trying to reconcile not-yet-committed non-ZCS streams
- fix for the case where a remote sync task is split along shard boundaries
- removed the unused alignedToShardBoundaries() method in MTS
@maedhroz maedhroz force-pushed the CASSANDRA-21066-maedhroz branch from a5fe898 to 4492a7f Compare February 5, 2026 16:49
@aratno aratno self-requested a review February 7, 2026 13:36
Comment on lines 280 to 281
Preconditions.checkState(transfer instanceof TrackedImportTransfer);
result.transfers.add(transfer.id(), ((TrackedImportTransfer) transfer).sstables);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to support TrackedRepairTransfer inclusion here to make sure summaries include activated repairs after restart.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm going to attempt to do this by having CoordinatedTransfer and ActivationRequest carry Bounds instead of a Range...

Comment on lines +64 to +65
this.planId = planId;
this.transferId = transferId;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pondering whether we still need planId in SyncStat if it's here now...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it probably can...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I think it's because we key local pending transfers on plan ID.

- don't try to run tests in TrackedRepairTransferTestBase and TrackedTransferTestBase
- deduplication in Shard
- supporting all CoordinatedTransfer types in loadFromJournal()
@maedhroz maedhroz force-pushed the CASSANDRA-21066-maedhroz branch from d24b770 to 143eab3 Compare February 10, 2026 03:04
@maedhroz maedhroz force-pushed the CASSANDRA-21066-maedhroz branch from 55bd0f2 to d2b6ed6 Compare February 10, 2026 04:41
- clean up already committed check in activate()
@maedhroz maedhroz force-pushed the CASSANDRA-21066-maedhroz branch from d2b6ed6 to a992602 Compare February 10, 2026 04:51
… (it's possible to have a plan ID but not stream any actual data and therefor not have a pending local transfer to activate)
… (it's possible to have a plan ID but not stream any actual data and therefor not have a pending local transfer to activate)
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

Successfully merging this pull request may close these issues.

2 participants