CEP-45: Implement independent mutation tracking versioning

patch by Blake Eggleston and Aleksey Yeschenko; reviewed by Aleksey
Yeschenko and Blake Eggleston for CASSANDRA-21328

Co-authored-by: Aleksey Yeschenko <aleksey@yeschenko.com>
Co-authored-by: Blake Eggleston <blake@ultrablake.com>
This commit is contained in:
Blake Eggleston 2026-04-22 12:22:51 -07:00 committed by Aleksey Yeshchenko
parent e982cf69b4
commit 16bb95fa15
75 changed files with 998 additions and 846 deletions

View File

@ -406,6 +406,8 @@ public enum CassandraRelevantProperties
MONITORING_MAX_OPERATIONS("cassandra.monitoring_max_operations", "50"),
/** Defines the interval for reporting any operations that have timed out. */
MONITORING_REPORT_INTERVAL_MS("cassandra.monitoring_report_interval_ms", "5000"),
/** The most recent version that's supported by all nodes in the cluster **/
MT_CLUSTER_SAFE_VERSION("cassandra.mutation_tracking.cluster_safe_version"),
MV_ALLOW_FILTERING_NONKEY_COLUMNS_UNSAFE("cassandra.mv.allow_filtering_nonkey_columns_unsafe"),
MV_ENABLE_COORDINATOR_BATCHLOG("cassandra.mv_enable_coordinator_batchlog"),
/** mx4jaddress */

View File

@ -108,7 +108,7 @@ public abstract class AbstractReadCommandVerbHandler<T> implements IVerbHandler<
private ClusterMetadata checkTokenOwnership(ClusterMetadata metadata, Message<T> message)
{
boolean acceptsTransient = message.verb() == Verb.TRACKED_SUMMARY_REQ;
boolean acceptsTransient = message.verb() == Verb.MT_SUMMARY_REQ;
ReadCommand command = getCommand(message.payload);
if (command.metadata().isVirtual())

View File

@ -67,10 +67,10 @@ public interface EmbeddableSinglePartitionReadCommand
ReadCommand.serializer.serialize((ReadCommand) command, out, version);
break;
case TRACKED_DATA:
DataRequest.serializer.serialize((DataRequest) command, out, version);
DataRequest.embedded.serialize((DataRequest) command, out, version);
break;
case TRACKED_SUMMARY:
SummaryRequest.serializer.serialize((SummaryRequest) command, out, version);
SummaryRequest.embedded.serialize((SummaryRequest) command, out, version);
break;
default:
throw new IllegalStateException("Unhandled kind: " + command.kind());
@ -87,9 +87,9 @@ public interface EmbeddableSinglePartitionReadCommand
case UNTRACKED:
return (SinglePartitionReadCommand)ReadCommand.serializer.deserialize(in, version);
case TRACKED_DATA:
return DataRequest.serializer.deserialize(in, version);
return DataRequest.embedded.deserialize(in, version);
case TRACKED_SUMMARY:
return SummaryRequest.serializer.deserialize(in, version);
return SummaryRequest.embedded.deserialize(in, version);
default:
throw new IllegalStateException("Unhandled kind: " + kind);
}
@ -109,9 +109,9 @@ public interface EmbeddableSinglePartitionReadCommand
case UNTRACKED:
return size + ReadCommand.serializer.serializedSize((ReadCommand) command, version);
case TRACKED_DATA:
return size + DataRequest.serializer.serializedSize((DataRequest) command, version);
return size + DataRequest.embedded.serializedSize((DataRequest) command, version);
case TRACKED_SUMMARY:
return size + SummaryRequest.serializer.serializedSize((SummaryRequest) command, version);
return size + SummaryRequest.embedded.serializedSize((SummaryRequest) command, version);
default:
throw new IllegalStateException("Unhandled kind: " + command.kind());
}

View File

@ -50,10 +50,10 @@ public interface IReadResponse
ReadResponse.serializer.serialize((ReadResponse) response, out, version);
break;
case TRACKED_DATA:
TrackedDataResponse.serializer.serialize((TrackedDataResponse) response, out, version);
TrackedDataResponse.embedded.serialize((TrackedDataResponse) response, out, version);
break;
case TRACKED_SUMMARY:
TrackedSummaryResponse.serializer.serialize((TrackedSummaryResponse) response, out, version);
TrackedSummaryResponse.embedded.serialize((TrackedSummaryResponse) response, out, version);
break;
default:
throw new IllegalStateException("Unhandled kind: " + response.kind());
@ -70,9 +70,9 @@ public interface IReadResponse
case UNTRACKED:
return ReadResponse.serializer.deserialize(in, version);
case TRACKED_DATA:
return TrackedDataResponse.serializer.deserialize(in, version);
return TrackedDataResponse.embedded.deserialize(in, version);
case TRACKED_SUMMARY:
return TrackedSummaryResponse.serializer.deserialize(in, version);
return TrackedSummaryResponse.embedded.deserialize(in, version);
default:
throw new IllegalStateException("Unhandled kind: " + kind);
}
@ -93,9 +93,9 @@ public interface IReadResponse
case UNTRACKED:
return size + ReadResponse.serializer.serializedSize((ReadResponse) response, version);
case TRACKED_DATA:
return size + TrackedDataResponse.serializer.serializedSize((TrackedDataResponse) response, version);
return size + TrackedDataResponse.embedded.serializedSize((TrackedDataResponse) response, version);
case TRACKED_SUMMARY:
return size + TrackedSummaryResponse.serializer.serializedSize((TrackedSummaryResponse) response, version);
return size + TrackedSummaryResponse.embedded.serializedSize((TrackedSummaryResponse) response, version);
default:
throw new IllegalStateException("Unhandled kind: " + response.kind());
}

View File

@ -73,9 +73,8 @@ import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
public class Mutation implements IMutation, Supplier<Mutation>, Commitable
{
public static final MutationSerializer serializer = new MutationSerializer();
public static final int ALLOW_POTENTIAL_TRANSACTION_CONFLICTS = 0x01;
public static final int HAS_MUTATION_ID = 0x02;
private final MutationId id;
// todo this is redundant
@ -608,17 +607,20 @@ public class Mutation implements IMutation, Supplier<Mutation>, Commitable
DataOutputPlus out,
int version) throws IOException
{
Map<TableId, PartitionUpdate> modifications = mutation.modifications;
boolean hasMutationId = version >= VERSION_61 && !mutation.id.isNone();
if (version >= VERSION_60)
{
int flags = 0;
flags |= potentialTxnConflictsFlag(mutation.potentialTxnConflicts);
if (hasMutationId) flags |= HAS_MUTATION_ID;
out.write(flags);
}
if (version >= MessagingService.VERSION_61)
MutationId.serializer.serialize(mutation.id, out, version);
if (hasMutationId)
MutationId.serializer.serialize(mutation.id, out);
Map<TableId, PartitionUpdate> modifications = mutation.modifications;
/* serialize the modifications in the mutation */
int size = modifications.size();
@ -640,15 +642,15 @@ public class Mutation implements IMutation, Supplier<Mutation>, Commitable
teeIn = new TeeDataInputPlus(in, dob, CACHEABLE_MUTATION_SIZE_LIMIT);
PotentialTxnConflicts potentialTxnConflicts = PotentialTxnConflicts.DISALLOW;
boolean hasMutationId = false;
if (version >= VERSION_60)
{
int flags = teeIn.readByte();
int flags = teeIn.readUnsignedByte();
potentialTxnConflicts = potentialTxnConflicts(flags);
hasMutationId = version >= VERSION_61 && (flags & HAS_MUTATION_ID) == HAS_MUTATION_ID;
}
MutationId id = version >= MessagingService.VERSION_61
? MutationId.serializer.deserialize(teeIn, version)
: MutationId.none();
MutationId id = hasMutationId ? MutationId.serializer.deserialize(teeIn) : MutationId.none();
int size = teeIn.readUnsignedVInt32();
assert size > 0;
@ -686,32 +688,37 @@ public class Mutation implements IMutation, Supplier<Mutation>, Commitable
*/
public Pair<DecoratedKey, TableMetadata> deserializeKeyAndTableMetadata(DataInputBuffer in, int version, DeserializationHelper.Flag flag) throws IOException
{
if (version >= VERSION_60)
in.skipBytes(1); // potentialTxnConflicts
if (version >= VERSION_61)
MutationId.serializer.skip(in, version);
skipHeader(in, version);
int size = in.readUnsignedVInt32();
assert size > 0;
return PartitionUpdate.serializer.deserializeMetadataAndKey(in, version, flag);
}
public TableId deserializeTableId(DataInputBuffer in, int version, DeserializationHelper.Flag flag) throws IOException
/**
* Return first (out of potentially multiple) table ids in this mutation.
*/
public TableId deserializeFirstTableId(DataInputBuffer in, int version, DeserializationHelper.Flag flag) throws IOException
{
if (version >= VERSION_60)
in.skipBytes(1); // flags
if (version >= VERSION_61)
MutationId.serializer.skip(in, version);
skipHeader(in, version);
int size = in.readUnsignedVInt32();
assert size > 0;
return PartitionUpdate.serializer.deserializeTableId(in, version, flag);
}
private void skipHeader(DataInputBuffer in, int version) throws IOException
{
boolean hasMutationId = false;
if (version >= VERSION_60)
{
int flags = in.readUnsignedByte();
if (version >= VERSION_61)
hasMutationId = (flags & HAS_MUTATION_ID) == HAS_MUTATION_ID;
}
if (hasMutationId)
MutationId.serializer.skip(in);
}
public Mutation deserialize(DataInputPlus in, int version) throws IOException
{
return deserialize(in, version, DeserializationHelper.Flag.FROM_REMOTE);
@ -723,6 +730,8 @@ public class Mutation implements IMutation, Supplier<Mutation>, Commitable
}
}
public static final MutationSerializer serializer = new MutationSerializer();
/**
* There are two implementations of this class. One that keeps the serialized representation on-heap for later
* reuse and one that doesn't. Keeping all sized mutations around may lead to "bad" GC pressure (G1 GC) due to humongous objects.
@ -780,9 +789,11 @@ public class Mutation implements IMutation, Supplier<Mutation>, Commitable
if (size == 0L)
{
if (version >= VERSION_60)
size += TypeSizes.sizeof((byte)ALLOW_POTENTIAL_TRANSACTION_CONFLICTS); // flags
if (version >= MessagingService.VERSION_61)
size += MutationId.serializer.serializedSize(mutation.id, version);
size += TypeSizes.BYTE_SIZE; // flags
if (version >= MessagingService.VERSION_61 && !mutation.id.isNone())
size += MutationId.serializer.serializedSize(mutation.id);
size += TypeSizes.sizeofUnsignedVInt(mutation.modifications.size());
for (PartitionUpdate partitionUpdate : mutation.modifications.values())
size += serializer.serializedSize(partitionUpdate, version);

View File

@ -71,6 +71,7 @@ import org.apache.cassandra.db.marshal.UUIDType;
import org.apache.cassandra.db.partitions.PartitionUpdate;
import org.apache.cassandra.db.rows.Row;
import org.apache.cassandra.db.rows.Rows;
import org.apache.cassandra.dht.AbstractBounds;
import org.apache.cassandra.dht.IPartitioner;
import org.apache.cassandra.dht.LocalPartitioner;
import org.apache.cassandra.dht.Range;
@ -2027,7 +2028,7 @@ public final class SystemKeyspace
// pass 0 as the version to trigger that legacy code.
// In the future, it might be worth switching to a stable text format for the ranges to 1) save that and 2)
// be more user friendly (the serialization format we currently use is pretty custom).
Range.tokenSerializer.serialize(range, out, 0);
AbstractBounds.tokenSerializer.serialize(range, out, 0);
return out.buffer();
}
catch (IOException e)
@ -2042,7 +2043,7 @@ public final class SystemKeyspace
try (DataInputPlus.DataInputStreamPlus in = new DataInputBuffer(ByteBufferUtil.getArray(rawRange)))
{
// See rangeToBytes above for why version is 0.
return (Range<Token>) Range.tokenSerializer.deserialize(in, partitioner, 0);
return (Range<Token>) AbstractBounds.tokenSerializer.deserialize(in, partitioner, 0);
}
catch (IOException e)
{

View File

@ -27,6 +27,7 @@ import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.utils.CollectionSerializers;
import org.apache.cassandra.utils.StringSerializer;
public class FunctionExecutionException extends RequestExecutionException
{
@ -63,7 +64,7 @@ public class FunctionExecutionException extends RequestExecutionException
if (functionName.keyspace != null)
out.writeUTF(functionName.keyspace);
out.writeUTF(functionName.name);
CollectionSerializers.serializeList(argTypes, out, version, CollectionSerializers.STRING_SERIALIZER);
CollectionSerializers.serializeList(argTypes, out, version, StringSerializer.instance);
out.writeUTF(detail);
}
@ -74,7 +75,7 @@ public class FunctionExecutionException extends RequestExecutionException
if (functionName.keyspace != null)
size += TypeSizes.sizeof(functionName.keyspace);
size += TypeSizes.sizeof(functionName.name);
size += CollectionSerializers.serializedListSize(argTypes, version, CollectionSerializers.STRING_SERIALIZER);
size += CollectionSerializers.serializedListSize(argTypes, version, StringSerializer.instance);
size += TypeSizes.sizeof(detail);
return size;
}
@ -83,7 +84,7 @@ public class FunctionExecutionException extends RequestExecutionException
{
String keyspace = in.readBoolean() ? in.readUTF() : null;
String name = in.readUTF();
List<String> argTypes = CollectionSerializers.deserializeList(in, version, CollectionSerializers.STRING_SERIALIZER);
List<String> argTypes = CollectionSerializers.deserializeList(in, version, StringSerializer.instance);
String detail = in.readUTF();
return new FunctionExecutionException(new FunctionName(keyspace, name), argTypes, detail);
}

View File

@ -15,11 +15,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cassandra.io;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.ByteBuffer;
import org.apache.cassandra.io.util.DataInputBuffer;
@ -42,17 +40,6 @@ public interface AsymmetricVersionedSerializer<In, Out, Version>
}
}
default ByteBuffer serializeUnchecked(In t, Version version)
{
try
{
return serialize(t, version);
}
catch (IOException e)
{
throw new UncheckedIOException(e);
}
}
Out deserialize(DataInputPlus in, Version version) throws IOException;
default void skip(DataInputPlus in, Version version) throws IOException
@ -68,17 +55,6 @@ public interface AsymmetricVersionedSerializer<In, Out, Version>
}
}
default Out deserializeUnchecked(ByteBuffer buffer, Version version)
{
try
{
return deserialize(buffer, version);
}
catch (IOException e)
{
throw new UncheckedIOException(e);
}
}
long serializedSize(In t, Version version);
static <In, Out, Version> AsymmetricVersionedSerializer<In, Out, Version> from(AsymmetricUnversionedSerializer<In, Out> delegate)

View File

@ -15,7 +15,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cassandra.io;
import java.io.IOException;
@ -64,11 +63,6 @@ public class EmbeddedAsymmetricVersionedSerializer<In, Out, Version> implements
return delegate.deserialize(in, version);
}
public Version deserializeVersion(DataInputPlus in) throws IOException
{
return versionSerializer.deserialize(in);
}
@Override
public long serializedSize(In t, int msgVersion)
{
@ -81,4 +75,32 @@ public class EmbeddedAsymmetricVersionedSerializer<In, Out, Version> implements
return versionSerializer.serializedSize(version)
+ delegate.serializedSize(t, version);
}
public static <A, B> IVersionedAsymmetricSerializer<A, B> accordEmbedded(AsymmetricVersionedSerializer<A, B, org.apache.cassandra.service.accord.serializers.Version> delegate)
{
return new EmbeddedAsymmetricVersionedSerializer<>(
org.apache.cassandra.service.accord.serializers.Version.CLUSTER_SAFE_VERSION,
org.apache.cassandra.service.accord.serializers.Version.Serializer.instance,
delegate
);
}
public static <A, B> IVersionedAsymmetricSerializer<A, B> accordEmbedded(AsymmetricUnversionedSerializer<A, B> delegate)
{
return accordEmbedded(AsymmetricVersionedSerializer.from(delegate));
}
public static <A, B> IVersionedAsymmetricSerializer<A, B> mtEmbedded(AsymmetricVersionedSerializer<A, B, org.apache.cassandra.replication.Version> delegate)
{
return new EmbeddedAsymmetricVersionedSerializer<>(
org.apache.cassandra.replication.Version.CLUSTER_SAFE_VERSION,
org.apache.cassandra.replication.Version.serializer,
delegate
);
}
public static <A, B> IVersionedAsymmetricSerializer<A, B> mtEmbedded(AsymmetricUnversionedSerializer<A, B> delegate)
{
return mtEmbedded(AsymmetricVersionedSerializer.from(delegate));
}
}

View File

@ -419,7 +419,7 @@ public class StatsMetadata extends MetadataComponent
}
if (version.hasMutationTrackingMetadata())
size += ImmutableCoordinatorLogOffsets.serializer.serializedSize(component.coordinatorLogOffsets, version.correspondingMessagingVersion());
size += ImmutableCoordinatorLogOffsets.embedded.serializedSize(component.coordinatorLogOffsets, version.correspondingMessagingVersion());
return size;
}
@ -546,7 +546,7 @@ public class StatsMetadata extends MetadataComponent
}
if (version.hasMutationTrackingMetadata())
ImmutableCoordinatorLogOffsets.serializer.serialize(component.coordinatorLogOffsets, out, version.correspondingMessagingVersion());
ImmutableCoordinatorLogOffsets.embedded.serialize(component.coordinatorLogOffsets, out, version.correspondingMessagingVersion());
}
private void serializeImprovedMinMax(Version version, StatsMetadata component, DataOutputPlus out) throws IOException
@ -694,7 +694,7 @@ public class StatsMetadata extends MetadataComponent
ImmutableCoordinatorLogOffsets coordinatorLogOffsets = ImmutableCoordinatorLogOffsets.NONE;
if (version.hasMutationTrackingMetadata())
coordinatorLogOffsets = ImmutableCoordinatorLogOffsets.serializer.deserialize(in, version.correspondingMessagingVersion());
coordinatorLogOffsets = ImmutableCoordinatorLogOffsets.embedded.deserialize(in, version.correspondingMessagingVersion());
return new StatsMetadata(partitionSizes,
columnCounts,

View File

@ -58,8 +58,6 @@ import org.apache.cassandra.gms.GossipShutdown;
import org.apache.cassandra.gms.GossipShutdownVerbHandler;
import org.apache.cassandra.hints.HintMessage;
import org.apache.cassandra.hints.HintVerbHandler;
import org.apache.cassandra.io.AsymmetricUnversionedSerializer;
import org.apache.cassandra.io.AsymmetricVersionedSerializer;
import org.apache.cassandra.io.IVersionedAsymmetricSerializer;
import org.apache.cassandra.repair.RepairMessageVerbHandler;
import org.apache.cassandra.repair.messages.CleanupMessage;
@ -93,7 +91,6 @@ import org.apache.cassandra.schema.SchemaPushVerbHandler;
import org.apache.cassandra.schema.SchemaVersionVerbHandler;
import org.apache.cassandra.service.EchoVerbHandler;
import org.apache.cassandra.service.SnapshotVerbHandler;
import org.apache.cassandra.service.accord.AccordSerializers;
import org.apache.cassandra.service.accord.AccordService;
import org.apache.cassandra.service.accord.AccordSyncPropagator;
import org.apache.cassandra.service.accord.AccordSyncPropagator.Notification;
@ -120,7 +117,6 @@ import org.apache.cassandra.service.accord.serializers.PreacceptSerializers;
import org.apache.cassandra.service.accord.serializers.ReadDataSerializer;
import org.apache.cassandra.service.accord.serializers.RecoverySerializers;
import org.apache.cassandra.service.accord.serializers.SetDurableSerializers;
import org.apache.cassandra.service.accord.serializers.Version;
import org.apache.cassandra.service.consensus.migration.ConsensusKeyMigrationState;
import org.apache.cassandra.service.consensus.migration.ConsensusKeyMigrationState.ConsensusKeyMigrationFinished;
import org.apache.cassandra.service.paxos.CasForwardHandler;
@ -190,6 +186,8 @@ import static org.apache.cassandra.concurrent.Stage.READ;
import static org.apache.cassandra.concurrent.Stage.REQUEST_RESPONSE;
import static org.apache.cassandra.concurrent.Stage.TRACING;
import static org.apache.cassandra.concurrent.Stage.TRACKED_CAS;
import static org.apache.cassandra.io.EmbeddedAsymmetricVersionedSerializer.accordEmbedded;
import static org.apache.cassandra.io.EmbeddedAsymmetricVersionedSerializer.mtEmbedded;
import static org.apache.cassandra.net.ResponseHandlerSupplier.RESPONSE_HANDLER;
import static org.apache.cassandra.net.Verb.Kind.CUSTOM;
import static org.apache.cassandra.net.Verb.Kind.NORMAL;
@ -296,8 +294,6 @@ public enum Verb
FAILED_SESSION_MSG (113, P1, repairWithBackoffTimeout, ANTI_ENTROPY, () -> FailSession.serializer, () -> RepairMessageVerbHandler.instance(), REPAIR_RSP ),
STATUS_RSP (115, P1, repairTimeout, ANTI_ENTROPY, () -> StatusResponse.serializer, () -> RepairMessageVerbHandler.instance(), REPAIR_RSP ),
STATUS_REQ (114, P1, repairTimeout, ANTI_ENTROPY, () -> StatusRequest.serializer, () -> RepairMessageVerbHandler.instance(), REPAIR_RSP ),
MT_SYNC_RSP (117, P1, repairWithBackoffTimeout, REQUEST_RESPONSE, () -> MutationTrackingSyncResponse.serializer, RESPONSE_HANDLER ),
MT_SYNC_REQ (116, P1, repairWithBackoffTimeout, ANTI_ENTROPY, () -> MutationTrackingSyncRequest.serializer, () -> RepairMessageVerbHandler.instance(), MT_SYNC_RSP ),
REPLICATION_DONE_RSP (82, P0, rpcTimeout, MISC, () -> NoPayload.serializer, RESPONSE_HANDLER ),
REPLICATION_DONE_REQ (22, P0, rpcTimeout, MISC, () -> NoPayload.serializer, () -> ReplicationDoneVerbHandler.instance, REPLICATION_DONE_RSP),
@ -361,23 +357,25 @@ public enum Verb
DATA_MOVEMENT_EXECUTED_REQ (817, P1, rpcTimeout, MISC, () -> DataMovement.Status.serializer, () -> DataMovements.instance, DATA_MOVEMENT_EXECUTED_RSP ),
// tracked replication
PULL_MUTATIONS_REQ (901, P2, readTimeout, READ, () -> PullMutationsRequest.serializer, () -> PullMutationsRequest.verbHandler ),
PUSH_MUTATION_REQ (902, P3, writeTimeout, MUTATION, () -> PushMutationRequest.serializer, () -> PushMutationRequest.verbHandler, MUTATION_RSP ),
READ_RECONCILE_ACK (903, P2, readTimeout, REQUEST_RESPONSE, () -> ReadReconcileAck.serializer, () -> ReadReconcileAck.verbHandler ),
FORWARD_WRITE_REQ (904, P3, writeTimeout, MUTATION, () -> ForwardedWrite.serializer, () -> ForwardedWrite.verbHandler ),
BROADCAST_LOG_OFFSETS (905, P1, rpcTimeout, MISC, () -> BroadcastLogOffsets.serializer, () -> BroadcastLogOffsets.verbHandler ),
MT_PULL_MUTATIONS_REQ (901, P2, readTimeout, READ, () -> mtEmbedded(PullMutationsRequest.serializer), () -> PullMutationsRequest.verbHandler ),
MT_PUSH_MUTATION_REQ (902, P3, writeTimeout, MUTATION, () -> mtEmbedded(PushMutationRequest.serializer), () -> PushMutationRequest.verbHandler, MUTATION_RSP ),
MT_READ_RECONCILE_ACK (903, P2, readTimeout, REQUEST_RESPONSE, () -> mtEmbedded(ReadReconcileAck.serializer), () -> ReadReconcileAck.verbHandler ),
MT_FORWARD_WRITE_REQ (904, P3, writeTimeout, MUTATION, () -> mtEmbedded(ForwardedWrite.serializer), () -> ForwardedWrite.verbHandler ),
MT_BROADCAST_LOG_OFFSETS (905, P1, rpcTimeout, MISC, () -> mtEmbedded(BroadcastLogOffsets.serializer), () -> BroadcastLogOffsets.verbHandler ),
TRACKED_PARTITION_READ_RSP (906, P2, readTimeout, REQUEST_RESPONSE, () -> TrackedDataResponse.serializer, RESPONSE_HANDLER ),
TRACKED_PARTITION_READ_REQ (907, P3, readTimeout, READ, () -> TrackedRead.DataRequest.serializer, () -> TrackedRead.verbHandler, TRACKED_PARTITION_READ_RSP),
TRACKED_RANGE_READ_RSP (908, P2, rangeTimeout, REQUEST_RESPONSE, () -> TrackedDataResponse.serializer, RESPONSE_HANDLER ),
TRACKED_RANGE_READ_REQ (909, P3, rangeTimeout, READ, () -> TrackedRead.DataRequest.serializer, () -> TrackedRead.verbHandler, TRACKED_RANGE_READ_RSP ),
TRACKED_SUMMARY_RSP (910, P2, readTimeout, REQUEST_RESPONSE, () -> TrackedSummaryResponse.serializer, () -> TrackedSummaryResponse.verbHandler ),
TRACKED_SUMMARY_REQ (911, P3, readTimeout, READ, () -> TrackedRead.SummaryRequest.serializer, () -> TrackedRead.verbHandler, TRACKED_SUMMARY_RSP ),
MT_PARTITION_READ_RSP (906, P2, readTimeout, REQUEST_RESPONSE, () -> TrackedDataResponse.embedded, RESPONSE_HANDLER ),
MT_PARTITION_READ_REQ (907, P3, readTimeout, READ, () -> TrackedRead.DataRequest.embedded, () -> TrackedRead.verbHandler, MT_PARTITION_READ_RSP ),
MT_RANGE_READ_RSP (908, P2, rangeTimeout, REQUEST_RESPONSE, () -> TrackedDataResponse.embedded, RESPONSE_HANDLER ),
MT_RANGE_READ_REQ (909, P3, rangeTimeout, READ, () -> TrackedRead.DataRequest.embedded, () -> TrackedRead.verbHandler, MT_RANGE_READ_RSP ),
MT_SUMMARY_RSP (910, P2, readTimeout, REQUEST_RESPONSE, () -> TrackedSummaryResponse.embedded, () -> TrackedSummaryResponse.verbHandler ),
MT_SUMMARY_REQ (911, P3, readTimeout, READ, () -> TrackedRead.SummaryRequest.embedded, () -> TrackedRead.verbHandler, MT_SUMMARY_RSP ),
TRACKED_TRANSFER_ACTIVATE_RSP (912, P1, repairTimeout, REQUEST_RESPONSE, () -> ActivationResponse.serializer, RESPONSE_HANDLER),
TRACKED_TRANSFER_ACTIVATE_REQ (913, P1, repairTimeout, ANTI_ENTROPY, () -> ActivationRequest.serializer, () -> ActivationRequest.verbHandler, TRACKED_TRANSFER_ACTIVATE_RSP),
TRACKED_TRANSFER_FAILED_RSP (914, P1, repairTimeout, REQUEST_RESPONSE, () -> NoPayload.serializer, RESPONSE_HANDLER),
TRACKED_TRANSFER_FAILED_REQ (915, P1, repairTimeout, ANTI_ENTROPY, () -> TransferFailed.serializer, () -> TransferTrackingService.verbHandler, TRACKED_TRANSFER_FAILED_RSP),
MT_TRANSFER_ACTIVATE_RSP (912, P1, repairTimeout, REQUEST_RESPONSE, () -> mtEmbedded(ActivationResponse.serializer), RESPONSE_HANDLER ),
MT_TRANSFER_ACTIVATE_REQ (913, P1, repairTimeout, ANTI_ENTROPY, () -> mtEmbedded(ActivationRequest.serializer), () -> ActivationRequest.verbHandler, MT_TRANSFER_ACTIVATE_RSP),
MT_TRANSFER_FAILED_RSP (914, P1, repairTimeout, REQUEST_RESPONSE, () -> mtEmbedded(NoPayload.unversionedSerializer), RESPONSE_HANDLER ),
MT_TRANSFER_FAILED_REQ (915, P1, repairTimeout, ANTI_ENTROPY, () -> mtEmbedded(TransferFailed.serializer), () -> TransferTrackingService.verbHandler, MT_TRANSFER_FAILED_RSP ),
MT_SYNC_RSP (916, P1, repairWithBackoffTimeout, REQUEST_RESPONSE, () -> mtEmbedded(MutationTrackingSyncResponse.serializer), RESPONSE_HANDLER ),
MT_SYNC_REQ (917, P1, repairWithBackoffTimeout, ANTI_ENTROPY, () -> mtEmbedded(MutationTrackingSyncRequest.serializer), () -> RepairMessageVerbHandler.instance(), MT_SYNC_RSP ),
// accord
ACCORD_SIMPLE_RSP (119, P2, writeTimeout, IMMEDIATE, () -> accordEmbedded(EnumSerializer.simpleReply), AccordService::responseHandlerOrNoop ),
@ -702,16 +700,6 @@ public enum Verb
{
return CUSTOM_VERB_START - id;
}
private static <A, B> IVersionedAsymmetricSerializer<A, B> accordEmbedded(AsymmetricVersionedSerializer<A, B, Version> delegate)
{
return AccordSerializers.embedded(Version.CLUSTER_SAFE_VERSION, delegate);
}
private static <A, B> IVersionedAsymmetricSerializer<A, B> accordEmbedded(AsymmetricUnversionedSerializer<A, B> delegate)
{
return accordEmbedded(AsymmetricVersionedSerializer.from(delegate));
}
}
@SuppressWarnings("unused")

View File

@ -20,10 +20,11 @@ package org.apache.cassandra.repair.messages;
import java.io.IOException;
import java.util.Set;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.repair.RepairJobDesc;
import org.apache.cassandra.replication.Version;
import org.apache.cassandra.replication.VersionedSerializer;
import static org.apache.cassandra.utils.CollectionSerializers.nullableIntSetSerializer;
@ -57,24 +58,24 @@ public class MutationTrackingSyncRequest extends RepairMessage
'}';
}
public static final IVersionedSerializer<MutationTrackingSyncRequest> serializer = new IVersionedSerializer<>()
public static final VersionedSerializer<MutationTrackingSyncRequest> serializer = new VersionedSerializer<>()
{
public void serialize(MutationTrackingSyncRequest request, DataOutputPlus out, int version) throws IOException
public void serialize(MutationTrackingSyncRequest request, DataOutputPlus out, Version version) throws IOException
{
RepairJobDesc.serializer.serialize(request.desc, out, version);
RepairJobDesc.serializer.serialize(request.desc, out, version.messagingVersion());
nullableIntSetSerializer.serialize(request.liveHostIds, out);
}
public MutationTrackingSyncRequest deserialize(DataInputPlus in, int version) throws IOException
public MutationTrackingSyncRequest deserialize(DataInputPlus in, Version version) throws IOException
{
RepairJobDesc desc = RepairJobDesc.serializer.deserialize(in, version);
RepairJobDesc desc = RepairJobDesc.serializer.deserialize(in, version.messagingVersion());
Set<Integer> liveHostIds = nullableIntSetSerializer.deserialize(in);
return new MutationTrackingSyncRequest(desc, liveHostIds);
}
public long serializedSize(MutationTrackingSyncRequest request, int version)
public long serializedSize(MutationTrackingSyncRequest request, Version version)
{
return RepairJobDesc.serializer.serializedSize(request.desc, version)
return RepairJobDesc.serializer.serializedSize(request.desc, version.messagingVersion())
+ nullableIntSetSerializer.serializedSize(request.liveHostIds);
}
};

View File

@ -30,6 +30,8 @@ import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.repair.RepairJobDesc;
import org.apache.cassandra.replication.CoordinatorLogId;
import org.apache.cassandra.replication.Offsets;
import org.apache.cassandra.replication.Version;
import org.apache.cassandra.replication.VersionedSerializer;
import org.apache.cassandra.utils.CollectionSerializers;
/**
@ -77,33 +79,40 @@ public class MutationTrackingSyncResponse extends RepairMessage
}
private static final IVersionedSerializer<Map<CoordinatorLogId, Offsets.Immutable>> offsetsMapSerializer =
CollectionSerializers.newMapSerializer(CoordinatorLogId.serializer, Offsets.serializer);
IVersionedSerializer.from(CollectionSerializers.newMapSerializer(CoordinatorLogId.serializer, Offsets.serializer));
@SuppressWarnings("unchecked")
public static final IVersionedSerializer<MutationTrackingSyncResponse> serializer = new IVersionedSerializer<>()
public static final VersionedSerializer<MutationTrackingSyncResponse> serializer = new VersionedSerializer<>()
{
public void serialize(MutationTrackingSyncResponse response, DataOutputPlus out, int version) throws IOException
@Override
public void serialize(MutationTrackingSyncResponse response, DataOutputPlus out, Version version) throws IOException
{
RepairJobDesc.serializer.serialize(response.desc, out, version);
CollectionSerializers.serializeMap((Map<AbstractBounds<Token>, Map<CoordinatorLogId, Offsets.Immutable>>) (Map<?, ?>) response.offsetsByShard,
out, version, Range.tokenSerializer, offsetsMapSerializer);
RepairJobDesc.serializer.serialize(response.desc, out, version.messagingVersion());
CollectionSerializers.serializeMap(
(Map<AbstractBounds<Token>, Map<CoordinatorLogId, Offsets.Immutable>>) (Map<?, ?>) response.offsetsByShard,
out, version.messagingVersion(), AbstractBounds.tokenSerializer, offsetsMapSerializer
);
}
public MutationTrackingSyncResponse deserialize(DataInputPlus in, int version) throws IOException
@Override
public MutationTrackingSyncResponse deserialize(DataInputPlus in, Version version) throws IOException
{
RepairJobDesc desc = RepairJobDesc.serializer.deserialize(in, version);
RepairJobDesc desc = RepairJobDesc.serializer.deserialize(in, version.messagingVersion());
Map<AbstractBounds<Token>, Map<CoordinatorLogId, Offsets.Immutable>> raw =
CollectionSerializers.deserializeMap(in, version, Range.tokenSerializer, offsetsMapSerializer);
CollectionSerializers.deserializeMap(in, version.messagingVersion(), AbstractBounds.tokenSerializer, offsetsMapSerializer);
Map<Range<Token>, Map<CoordinatorLogId, Offsets.Immutable>> offsetsByShard =
(Map<Range<Token>, Map<CoordinatorLogId, Offsets.Immutable>>) (Map<?, ?>) raw;
return new MutationTrackingSyncResponse(desc, offsetsByShard);
}
public long serializedSize(MutationTrackingSyncResponse response, int version)
@Override
public long serializedSize(MutationTrackingSyncResponse response, Version version)
{
long size = RepairJobDesc.serializer.serializedSize(response.desc, version);
size += CollectionSerializers.serializedMapSize((Map<AbstractBounds<Token>, Map<CoordinatorLogId, Offsets.Immutable>>) (Map<?, ?>) response.offsetsByShard,
version, Range.tokenSerializer, offsetsMapSerializer);
long size = RepairJobDesc.serializer.serializedSize(response.desc, version.messagingVersion());
size += CollectionSerializers.serializedMapSize(
(Map<AbstractBounds<Token>, Map<CoordinatorLogId, Offsets.Immutable>>) (Map<?, ?>) response.offsetsByShard,
version.messagingVersion(), AbstractBounds.tokenSerializer, offsetsMapSerializer
);
return size;
}
};

View File

@ -26,6 +26,7 @@ import java.util.Objects;
import com.google.common.base.Preconditions;
import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.dht.AbstractBounds;
import org.apache.cassandra.dht.IPartitioner;
import org.apache.cassandra.dht.Range;
import org.apache.cassandra.dht.Token;
@ -116,7 +117,7 @@ public class PrepareMessage extends RepairMessage
out.writeUTF(message.partitioner.getClass().getCanonicalName());
out.writeInt(message.ranges.size());
for (Range<Token> r : message.ranges)
Range.tokenSerializer.serialize(r, out, version);
AbstractBounds.tokenSerializer.serialize(r, out, version);
out.writeBoolean(message.isIncremental);
out.writeLong(message.repairedAt);
out.writeBoolean(message.isGlobal);
@ -140,7 +141,7 @@ public class PrepareMessage extends RepairMessage
int rangeCount = in.readInt();
List<Range<Token>> ranges = new ArrayList<>(rangeCount);
for (int i = 0; i < rangeCount; i++)
ranges.add((Range<Token>) Range.tokenSerializer.deserialize(in, partitioner, version));
ranges.add((Range<Token>) AbstractBounds.tokenSerializer.deserialize(in, partitioner, version));
boolean isIncremental = in.readBoolean();
long timestamp = in.readLong();
boolean isGlobal = in.readBoolean();
@ -162,7 +163,7 @@ public class PrepareMessage extends RepairMessage
size += TypeSizes.sizeof(message.partitioner.getClass().getCanonicalName());
size += TypeSizes.sizeof(message.ranges.size());
for (Range<Token> r : message.ranges)
size += Range.tokenSerializer.serializedSize(r, version);
size += AbstractBounds.tokenSerializer.serializedSize(r, version);
size += TypeSizes.sizeof(message.isIncremental);
size += TypeSizes.sizeof(message.repairedAt);
size += TypeSizes.sizeof(message.isGlobal);

View File

@ -100,7 +100,7 @@ public class SyncRequest extends RepairMessage
return Objects.hash(desc, initiator, src, dst, ranges, previewKind, transferId);
}
public static final IVersionedSerializer<SyncRequest> serializer = new IVersionedSerializer<SyncRequest>()
public static final IVersionedSerializer<SyncRequest> serializer = new IVersionedSerializer<>()
{
public void serialize(SyncRequest message, DataOutputPlus out, int version) throws IOException
{
@ -118,7 +118,7 @@ public class SyncRequest extends RepairMessage
{
out.writeBoolean(message.transferId != null);
if (message.transferId != null)
ShortMutationId.serializer.serialize(message.transferId, out, version);
ShortMutationId.serializer.serialize(message.transferId, out);
}
}
@ -137,7 +137,7 @@ public class SyncRequest extends RepairMessage
boolean asymmetric = in.readBoolean();
ShortMutationId transferId = version >= MessagingService.Version.VERSION_61.value && in.readBoolean()
? ShortMutationId.serializer.deserialize(in, version)
? ShortMutationId.serializer.deserialize(in)
: null;
return new SyncRequest(desc, initiator, src, dst, ranges, previewKind, asymmetric, transferId);
@ -159,7 +159,7 @@ public class SyncRequest extends RepairMessage
{
size += TypeSizes.sizeof(false);
if (message.transferId != null)
size += ShortMutationId.serializer.serializedSize(message.transferId, version);
size += ShortMutationId.serializer.serializedSize(message.transferId);
}
return size;

View File

@ -95,7 +95,7 @@ public class SyncResponse extends RepairMessage
return Objects.hash(desc, success, nodes, summaries, planId, transferId);
}
public static final IPartitionerDependentSerializer<SyncResponse> serializer = new IPartitionerDependentSerializer<SyncResponse>()
public static final IPartitionerDependentSerializer<SyncResponse> serializer = new IPartitionerDependentSerializer<>()
{
public void serialize(SyncResponse message, DataOutputPlus out, int version) throws IOException
{
@ -117,7 +117,7 @@ public class SyncResponse extends RepairMessage
out.writeBoolean(message.transferId != null);
if (message.transferId != null)
ShortMutationId.serializer.serialize(message.transferId, out, version);
ShortMutationId.serializer.serialize(message.transferId, out);
}
}
@ -139,7 +139,7 @@ public class SyncResponse extends RepairMessage
? TimeUUID.Serializer.instance.deserialize(in) : null;
ShortMutationId transferId = version >= MessagingService.Version.VERSION_61.value && in.readBoolean()
? ShortMutationId.serializer.deserialize(in, version) : null;
? ShortMutationId.serializer.deserialize(in) : null;
return new SyncResponse(desc, nodes, success, summaries, planId, transferId);
}
@ -164,7 +164,7 @@ public class SyncResponse extends RepairMessage
size += TypeSizes.sizeof(false);
if (message.transferId != null)
size += ShortMutationId.serializer.serializedSize(message.transferId, version);
size += ShortMutationId.serializer.serializedSize(message.transferId);
}
return size;

View File

@ -15,7 +15,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cassandra.replication;
import java.io.IOException;
@ -38,7 +37,6 @@ import org.apache.cassandra.dht.AbstractBounds;
import org.apache.cassandra.dht.Bounds;
import org.apache.cassandra.dht.Range;
import org.apache.cassandra.dht.Token;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.sstable.format.SSTableReader;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
@ -87,32 +85,32 @@ public class ActivatedTransfers implements Iterable<ShortMutationId>
this.bounds = bounds;
}
public static final IVersionedSerializer<ActivatedTransfer> serializer = new IVersionedSerializer<>()
public static final VersionedSerializer<ActivatedTransfer> serializer = new VersionedSerializer<>()
{
@Override
public void serialize(ActivatedTransfer transfer, DataOutputPlus out, int version) throws IOException
public void serialize(ActivatedTransfer transfer, DataOutputPlus out, Version version) throws IOException
{
ShortMutationId.serializer.serialize(transfer.id, out, version);
Token.serializer.serialize(transfer.bounds.left, out, version);
Token.serializer.serialize(transfer.bounds.right, out, version);
ShortMutationId.serializer.serialize(transfer.id, out);
Token.serializer.serialize(transfer.bounds.left, out, version.messagingVersion());
Token.serializer.serialize(transfer.bounds.right, out, version.messagingVersion());
}
@Override
public ActivatedTransfer deserialize(DataInputPlus in, int version) throws IOException
public ActivatedTransfer deserialize(DataInputPlus in, Version version) throws IOException
{
ShortMutationId id = ShortMutationId.serializer.deserialize(in, version);
Token left = Token.serializer.deserialize(in, version);
Token right = Token.serializer.deserialize(in, version);
return new ActivatedTransfer(id, new Bounds<Token>(left, right));
ShortMutationId id = ShortMutationId.serializer.deserialize(in);
Token left = Token.serializer.deserialize(in, version.messagingVersion());
Token right = Token.serializer.deserialize(in, version.messagingVersion());
return new ActivatedTransfer(id, new Bounds<>(left, right));
}
@Override
public long serializedSize(ActivatedTransfer transfer, int version)
public long serializedSize(ActivatedTransfer transfer, Version version)
{
long size = 0;
size += ShortMutationId.serializer.serializedSize(transfer.id, version);
size += Token.serializer.serializedSize(transfer.bounds.left, version);
size += Token.serializer.serializedSize(transfer.bounds.right, version);
size += ShortMutationId.serializer.serializedSize(transfer.id);
size += Token.serializer.serializedSize(transfer.bounds.left, version.messagingVersion());
size += Token.serializer.serializedSize(transfer.bounds.right, version.messagingVersion());
return size;
}
};
@ -258,22 +256,22 @@ public class ActivatedTransfers implements Iterable<ShortMutationId>
'}';
}
public static final IVersionedSerializer<ActivatedTransfers> serializer = new IVersionedSerializer<>()
public static final VersionedSerializer<ActivatedTransfers> serializer = new VersionedSerializer<>()
{
@Override
public void serialize(ActivatedTransfers transfers, DataOutputPlus out, int version) throws IOException
public void serialize(ActivatedTransfers transfers, DataOutputPlus out, Version version) throws IOException
{
CollectionSerializers.serializeCollection(transfers.transfers, out, version, ActivatedTransfer.serializer);
}
@Override
public ActivatedTransfers deserialize(DataInputPlus in, int version) throws IOException
public ActivatedTransfers deserialize(DataInputPlus in, Version version) throws IOException
{
return new ActivatedTransfers(CollectionSerializers.deserializeSet(in, version, ActivatedTransfer.serializer));
}
@Override
public long serializedSize(ActivatedTransfers transfers, int version)
public long serializedSize(ActivatedTransfers transfers, Version version)
{
return CollectionSerializers.serializedCollectionSize(transfers.transfers, version, ActivatedTransfer.serializer);
}

View File

@ -32,7 +32,6 @@ import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.dht.Range;
import org.apache.cassandra.dht.Token;
import org.apache.cassandra.exceptions.RequestFailureReason;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.locator.InetAddressAndPort;
@ -138,72 +137,62 @@ public class ActivationRequest
MutationTrackingService.instance().activateLocal(this);
}
public static final Serializer serializer = new Serializer();
public static class Serializer implements IVersionedSerializer<ActivationRequest>
public static final VersionedSerializer<ActivationRequest> serializer = new VersionedSerializer<>()
{
@Override
public void serialize(ActivationRequest request, DataOutputPlus out, int version) throws IOException
public void serialize(ActivationRequest request, DataOutputPlus out, Version version) throws IOException
{
out.writeUTF(request.operation.getDescription());
InetAddressAndPort.Serializer.inetAddressAndPortSerializer.serialize(request.pair.left, out, version);
InetAddressAndPort.Serializer.inetAddressAndPortSerializer.serialize(request.pair.right, out, version);
InetAddressAndPort.Serializer.inetAddressAndPortSerializer.serialize(request.pair.left, out, version.messagingVersion());
InetAddressAndPort.Serializer.inetAddressAndPortSerializer.serialize(request.pair.right, out, version.messagingVersion());
ShortMutationId.serializer.serialize(request.id(), out, version);
NodeId.messagingSerializer.serialize(request.coordinatorId, out, version);
ShortMutationId.serializer.serialize(request.id(), out);
NodeId.messagingSerializer.serialize(request.coordinatorId, out, version.messagingVersion());
out.writeByte(request.phase.id);
out.writeUTF(request.keyspace);
Range.serializer.serialize(request.range, out, null);
out.writeBoolean(request.planId != null);
if (request.planId != null)
TimeUUID.Serializer.instance.serialize(request.planId, out, version);
TimeUUID.Serializer.nullable.serialize(request.planId, out);
}
@Override
public ActivationRequest deserialize(DataInputPlus in, int version) throws IOException
public ActivationRequest deserialize(DataInputPlus in, Version version) throws IOException
{
StreamOperation operation = StreamOperation.fromString(in.readUTF());
InetAddressAndPort sender = InetAddressAndPort.Serializer.inetAddressAndPortSerializer.deserialize(in, version);
InetAddressAndPort receiver = InetAddressAndPort.Serializer.inetAddressAndPortSerializer.deserialize(in, version);
InetAddressAndPort sender = InetAddressAndPort.Serializer.inetAddressAndPortSerializer.deserialize(in, version.messagingVersion());
InetAddressAndPort receiver = InetAddressAndPort.Serializer.inetAddressAndPortSerializer.deserialize(in, version.messagingVersion());
ShortMutationId id = ShortMutationId.serializer.deserialize(in, version);
NodeId coordinatorId = NodeId.messagingSerializer.deserialize(in, version);
ShortMutationId id = ShortMutationId.serializer.deserialize(in);
NodeId coordinatorId = NodeId.messagingSerializer.deserialize(in, version.messagingVersion());
Phase phase = Phase.from(in.readByte());
String keyspace = in.readUTF();
Range<Token> range = Range.serializer.deserialize(in, null);
TimeUUID planId = in.readBoolean() ? TimeUUID.Serializer.instance.deserialize(in, version) : null;
TimeUUID planId = TimeUUID.Serializer.nullable.deserialize(in);
return new ActivationRequest(operation, Pair.create(sender, receiver), phase, id, coordinatorId, range, keyspace, planId);
}
@Override
public long serializedSize(ActivationRequest request, int version)
public long serializedSize(ActivationRequest request, Version version)
{
long size = 0;
size += TypeSizes.sizeof(request.operation.getDescription());
size += InetAddressAndPort.Serializer.inetAddressAndPortSerializer.serializedSize(request.pair.left, version);
size += InetAddressAndPort.Serializer.inetAddressAndPortSerializer.serializedSize(request.pair.right, version);
size += InetAddressAndPort.Serializer.inetAddressAndPortSerializer.serializedSize(request.pair.left, version.messagingVersion());
size += InetAddressAndPort.Serializer.inetAddressAndPortSerializer.serializedSize(request.pair.right, version.messagingVersion());
size += ShortMutationId.serializer.serializedSize(request.id(), version);
size += NodeId.messagingSerializer.serializedSize(request.coordinatorId, version);
size += ShortMutationId.serializer.serializedSize(request.id());
size += NodeId.messagingSerializer.serializedSize(request.coordinatorId, version.messagingVersion());
size += TypeSizes.BYTE_SIZE; // Enum ordinal
size += TypeSizes.sizeof(request.keyspace);
size += Range.serializer.serializedSize(request.range, null);
size += TypeSizes.BOOL_SIZE;
if (request.planId != null)
size += TimeUUID.Serializer.instance.serializedSize(request.planId, version);
size += TimeUUID.Serializer.nullable.serializedSize(request.planId);
return size;
}
}
};
public static class VerbHandler implements IVerbHandler<ActivationRequest>
{

View File

@ -23,7 +23,6 @@ import java.util.Objects;
import com.google.common.base.Preconditions;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.locator.InetAddressAndPort;
@ -40,8 +39,6 @@ public class ActivationResponse
this.syncPair = syncPair;
}
public static final Serializer serializer = new Serializer();
@Override
public String toString()
{
@ -64,31 +61,31 @@ public class ActivationResponse
return Objects.hash(syncPair);
}
public static class Serializer implements IVersionedSerializer<ActivationResponse>
public static final VersionedSerializer<ActivationResponse> serializer = new VersionedSerializer<>()
{
@Override
public void serialize(ActivationResponse activate, DataOutputPlus out, int version) throws IOException
public void serialize(ActivationResponse activate, DataOutputPlus out, Version version) throws IOException
{
InetAddressAndPort.Serializer.inetAddressAndPortSerializer.serialize(activate.syncPair.left, out, version);
InetAddressAndPort.Serializer.inetAddressAndPortSerializer.serialize(activate.syncPair.right, out, version);
InetAddressAndPort.Serializer.inetAddressAndPortSerializer.serialize(activate.syncPair.left, out, version.messagingVersion());
InetAddressAndPort.Serializer.inetAddressAndPortSerializer.serialize(activate.syncPair.right, out, version.messagingVersion());
}
@SuppressWarnings("SuspiciousNameCombination")
@Override
public ActivationResponse deserialize(DataInputPlus in, int version) throws IOException
public ActivationResponse deserialize(DataInputPlus in, Version version) throws IOException
{
InetAddressAndPort left = InetAddressAndPort.Serializer.inetAddressAndPortSerializer.deserialize(in, version);
InetAddressAndPort right = InetAddressAndPort.Serializer.inetAddressAndPortSerializer.deserialize(in, version);
InetAddressAndPort left = InetAddressAndPort.Serializer.inetAddressAndPortSerializer.deserialize(in, version.messagingVersion());
InetAddressAndPort right = InetAddressAndPort.Serializer.inetAddressAndPortSerializer.deserialize(in, version.messagingVersion());
return new ActivationResponse(Pair.create(left, right));
}
@Override
public long serializedSize(ActivationResponse activate, int version)
public long serializedSize(ActivationResponse activate, Version version)
{
long size = 0;
size += InetAddressAndPort.Serializer.inetAddressAndPortSerializer.serializedSize(activate.syncPair.left, version);
size += InetAddressAndPort.Serializer.inetAddressAndPortSerializer.serializedSize(activate.syncPair.right, version);
size += InetAddressAndPort.Serializer.inetAddressAndPortSerializer.serializedSize(activate.syncPair.left, version.messagingVersion());
size += InetAddressAndPort.Serializer.inetAddressAndPortSerializer.serializedSize(activate.syncPair.right, version.messagingVersion());
return size;
}
}
};
}

View File

@ -184,7 +184,7 @@ public final class ActiveLogReconciler implements Shutdownable
try (DataInputBuffer in = new DataInputBuffer(buffer, true))
{
ClusterMetadata metadata = ClusterMetadata.current();
TableId tableId = Mutation.serializer.deserializeTableId(in, version, DeserializationHelper.Flag.LOCAL);
TableId tableId = Mutation.serializer.deserializeFirstTableId(in, version, DeserializationHelper.Flag.LOCAL);
TableMetadata tableMetadata = metadata.schema.getTableMetadata(tableId);
if (tableMetadata == null)
@ -201,7 +201,7 @@ public final class ActiveLogReconciler implements Shutdownable
}
Message<PushMutationRequest> message =
Message.outWithFlag(Verb.PUSH_MUTATION_REQ,
Message.outWithFlag(Verb.MT_PUSH_MUTATION_REQ,
new PushMutationRequest.Buffer(version, buffer),
MessageFlag.CALL_BACK_ON_FAILURE);
MessagingService.instance().sendWithCallback(message, toHost, this);

View File

@ -18,7 +18,6 @@
package org.apache.cassandra.replication;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.cassandra.db.TypeSizes;
@ -26,10 +25,10 @@ import org.apache.cassandra.dht.AbstractBounds;
import org.apache.cassandra.dht.IPartitioner;
import org.apache.cassandra.dht.Range;
import org.apache.cassandra.dht.Token;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.net.IVerbHandler;
import org.apache.cassandra.utils.CollectionSerializers;
public class BroadcastLogOffsets
{
@ -76,41 +75,34 @@ public class BroadcastLogOffsets
message.from());
};
public static final IVersionedSerializer<BroadcastLogOffsets> serializer = new IVersionedSerializer<>()
public static final VersionedSerializer<BroadcastLogOffsets> serializer = new VersionedSerializer<>()
{
@Override
public void serialize(BroadcastLogOffsets status, DataOutputPlus out, int version) throws IOException
public void serialize(BroadcastLogOffsets status, DataOutputPlus out, Version version) throws IOException
{
out.writeUTF(status.keyspace);
AbstractBounds.tokenSerializer.serialize(status.range, out, version);
out.writeInt(status.replicatedOffsets.size());
for (Offsets.Immutable logOffsets : status.replicatedOffsets)
Offsets.serializer.serialize(logOffsets, out, version);
AbstractBounds.tokenSerializer.serialize(status.range, out, version.messagingVersion());
CollectionSerializers.serializeList(status.replicatedOffsets, out, Offsets.serializer);
out.writeBoolean(status.durable);
}
@Override
public BroadcastLogOffsets deserialize(DataInputPlus in, int version) throws IOException
public BroadcastLogOffsets deserialize(DataInputPlus in, Version version) throws IOException
{
String keyspace = in.readUTF();
Range<Token> range = (Range<Token>) AbstractBounds.tokenSerializer.deserialize(in, IPartitioner.global(), version);
int count = in.readInt();
List<Offsets.Immutable> replicatedOffsets = new ArrayList<>(count);
for (int i = 0; i < count; ++i)
replicatedOffsets.add(Offsets.serializer.deserialize(in, version));
Range<Token> range = (Range<Token>) AbstractBounds.tokenSerializer.deserialize(in, IPartitioner.global(), version.messagingVersion());
List<Offsets.Immutable> replicatedOffsets = CollectionSerializers.deserializeList(in, Offsets.serializer);
boolean durable = in.readBoolean();
return new BroadcastLogOffsets(keyspace, range, replicatedOffsets, durable);
}
@Override
public long serializedSize(BroadcastLogOffsets replicatedOffsets, int version)
public long serializedSize(BroadcastLogOffsets replicatedOffsets, Version version)
{
long size = 0;
size += TypeSizes.sizeof(replicatedOffsets.keyspace);
size += AbstractBounds.tokenSerializer.serializedSize(replicatedOffsets.range, version);
size += TypeSizes.sizeof(replicatedOffsets.replicatedOffsets.size());
for (Offsets.Immutable logOffsets : replicatedOffsets.replicatedOffsets)
size += Offsets.serializer.serializedSize(logOffsets, version);
size += AbstractBounds.tokenSerializer.serializedSize(replicatedOffsets.range, version.messagingVersion());
size += CollectionSerializers.serializedListSize(replicatedOffsets.replicatedOffsets, Offsets.serializer);
size += TypeSizes.sizeof(replicatedOffsets.durable);
return size;
}

View File

@ -212,7 +212,7 @@ public abstract class CoordinatedTransfer
for (Pair<InetAddressAndPort, InetAddressAndPort> target : targets)
{
ActivationRequest activation = createActivation(target, Phase.COMMIT);
Message<ActivationRequest> msg = Message.out(Verb.TRACKED_TRANSFER_ACTIVATE_REQ, activation);
Message<ActivationRequest> msg = Message.out(Verb.MT_TRANSFER_ACTIVATE_REQ, activation);
logger.debug("{} Sending commit {} to peer {}", logPrefix(), activation, target.right);
MessagingService.instance().sendWithCallback(msg, target.right, commit);
@ -285,7 +285,7 @@ public abstract class CoordinatedTransfer
logger.debug("{} Notifying {} of transfer failure for plan {}", logPrefix(), to, result.planId());
notifyFailure.responses.incrementAndGet();
Message<TransferFailed> msg = Message.out(Verb.TRACKED_TRANSFER_FAILED_REQ, new TransferFailed(result.planId()));
Message<TransferFailed> msg = Message.out(Verb.MT_TRANSFER_FAILED_REQ, new TransferFailed(result.planId()));
MessagingService.instance().sendWithCallback(msg, to, notifyFailure);
}

View File

@ -24,7 +24,7 @@ import java.util.Comparator;
import com.google.common.annotations.VisibleForTesting;
import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.UnversionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
@ -125,17 +125,23 @@ public class CoordinatorLogId implements Serializable
public static final Comparator<CoordinatorLogId> comparator = (l, r) -> Long.compareUnsigned(l.asLong(), r.asLong());
public static final class Serializer implements IVersionedSerializer<CoordinatorLogId>
public static final class Serializer implements UnversionedSerializer<CoordinatorLogId>
{
@Override
public void serialize(CoordinatorLogId logId, DataOutputPlus out, int version) throws IOException
public void serialize(CoordinatorLogId logId, DataOutputPlus out) throws IOException
{
out.writeInt(logId.hostId);
out.writeInt(logId.hostLogId);
}
public void serialize(long logId, DataOutputPlus out) throws IOException
{
out.writeInt(hostId(logId));
out.writeInt(hostLogId(logId));
}
@Override
public CoordinatorLogId deserialize(DataInputPlus in, int version) throws IOException
public CoordinatorLogId deserialize(DataInputPlus in) throws IOException
{
int hostId = in.readInt();
int hostLogId = in.readInt();
@ -143,10 +149,15 @@ public class CoordinatorLogId implements Serializable
}
@Override
public long serializedSize(CoordinatorLogId logId, int version)
public long serializedSize(CoordinatorLogId logId)
{
return TypeSizes.sizeof(logId.hostId) + TypeSizes.sizeof(logId.hostLogId);
}
public long serializedSize(long logId)
{
return TypeSizes.sizeof(logId);
}
}
public static final Serializer serializer = new Serializer();

View File

@ -27,7 +27,6 @@ import java.util.Set;
import java.util.function.Consumer;
import com.google.common.base.Preconditions;
import com.google.common.collect.Sets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -66,6 +65,7 @@ import org.apache.cassandra.tcm.ClusterMetadata;
import org.apache.cassandra.tcm.membership.NodeId;
import org.apache.cassandra.tracing.Tracing;
import org.apache.cassandra.transport.Dispatcher;
import org.apache.cassandra.utils.CollectionSerializers;
import org.apache.cassandra.utils.FBUtilities;
import static java.util.concurrent.TimeUnit.NANOSECONDS;
@ -329,7 +329,7 @@ public class ForwardedWrite
AbstractWriteResponseHandler<Object> handler = strategy.getWriteResponseHandler(plan, onComplete, WriteType.SIMPLE, null, requestTime);
// Add callbacks for replicas to respond directly to coordinator
Message<MutationRequest> toLeader = Message.outWithRequestTime(Verb.FORWARD_WRITE_REQ, new MutationRequest(mutation, plan), requestTime);
Message<MutationRequest> toLeader = Message.outWithRequestTime(Verb.MT_FORWARD_WRITE_REQ, new MutationRequest(mutation, plan), requestTime);
for (Replica endpoint : endpoints)
{
if (plan.isAlive(endpoint))
@ -504,35 +504,28 @@ public class ForwardedWrite
logger.trace("Tracked counter mutation {} processed, local application and replication initiated", id);
}
public static final IVersionedSerializer<MutationRequest> serializer = new IVersionedSerializer<>()
public static final VersionedSerializer<MutationRequest> serializer = new VersionedSerializer<>()
{
@Override
public void serialize(MutationRequest request, DataOutputPlus out, int version) throws IOException
public void serialize(MutationRequest request, DataOutputPlus out, Version version) throws IOException
{
Mutation.serializer.serialize(request.mutation, out, version);
out.writeInt(request.recipients.size());
for (NodeId recipient : request.recipients)
NodeId.messagingSerializer.serialize(recipient, out, version);
Mutation.serializer.serialize(request.mutation, out, version.messagingVersion());
CollectionSerializers.serializeCollection(request.recipients, out, version.messagingVersion(), NodeId.messagingSerializer);
}
@Override
public MutationRequest deserialize(DataInputPlus in, int version) throws IOException
public MutationRequest deserialize(DataInputPlus in, Version version) throws IOException
{
Mutation mutation = Mutation.serializer.deserialize(in, version);
int numRecipients = in.readInt();
Set<NodeId> recipients = Sets.newHashSetWithExpectedSize(numRecipients);
for (int i = 0; i < numRecipients; i++)
recipients.add(NodeId.messagingSerializer.deserialize(in, version));
Mutation mutation = Mutation.serializer.deserialize(in, version.messagingVersion());
Set<NodeId> recipients = CollectionSerializers.deserializeSet(in, version.messagingVersion(), NodeId.messagingSerializer);
return new MutationRequest(mutation, recipients);
}
@Override
public long serializedSize(MutationRequest request, int version)
public long serializedSize(MutationRequest request, Version version)
{
long size = Mutation.serializer.serializedSize(request.mutation, version);
size += TypeSizes.INT_SIZE;
for (NodeId recipient : request.recipients)
size += NodeId.messagingSerializer.serializedSize(recipient, version);
long size = Mutation.serializer.serializedSize(request.mutation, version.messagingVersion());
size += CollectionSerializers.serializedCollectionSize(request.recipients, version.messagingVersion(), NodeId.messagingSerializer);
return size;
}
};

View File

@ -34,10 +34,11 @@ import org.slf4j.LoggerFactory;
import org.apache.cassandra.dht.Bounds;
import org.apache.cassandra.dht.Token;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.EmbeddedAsymmetricVersionedSerializer;
import org.apache.cassandra.io.IVersionedAsymmetricSerializer;
import org.apache.cassandra.io.UnversionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.net.MessagingService;
import org.apache.cassandra.utils.vint.VIntCoding;
public class ImmutableCoordinatorLogOffsets implements CoordinatorLogOffsets<Offsets.Immutable>
@ -210,24 +211,20 @@ public class ImmutableCoordinatorLogOffsets implements CoordinatorLogOffsets<Off
}
}
public static class Serializer implements IVersionedSerializer<ImmutableCoordinatorLogOffsets>
public static final VersionedSerializer<ImmutableCoordinatorLogOffsets> serializer = new VersionedSerializer<>()
{
@Override
public void serialize(ImmutableCoordinatorLogOffsets logOffsets, DataOutputPlus out, int version) throws IOException
public void serialize(ImmutableCoordinatorLogOffsets logOffsets, DataOutputPlus out, Version version) throws IOException
{
if (version < MessagingService.VERSION_61)
return;
ImmutableMutations.serializer.serialize(logOffsets.mutations, out, version);
ImmutableMutations.serializer.serialize(logOffsets.mutations, out);
ActivatedTransfers.serializer.serialize(logOffsets.transfers(), out, version);
}
@Override
public ImmutableCoordinatorLogOffsets deserialize(DataInputPlus in, int version) throws IOException
public ImmutableCoordinatorLogOffsets deserialize(DataInputPlus in, Version version) throws IOException
{
if (version < MessagingService.VERSION_61)
return ImmutableCoordinatorLogOffsets.NONE;
Builder builder = new Builder();
ImmutableMutations mutations = ImmutableMutations.serializer.deserialize(in, version);
ImmutableMutations mutations = ImmutableMutations.serializer.deserialize(in);
mutations.ids.forEach((id, offsets) -> builder.addAll(offsets));
ActivatedTransfers transfers = ActivatedTransfers.serializer.deserialize(in, version);
if (!transfers.isEmpty())
@ -236,18 +233,17 @@ public class ImmutableCoordinatorLogOffsets implements CoordinatorLogOffsets<Off
}
@Override
public long serializedSize(ImmutableCoordinatorLogOffsets logOffsets, int version)
public long serializedSize(ImmutableCoordinatorLogOffsets logOffsets, Version version)
{
if (version < MessagingService.VERSION_61)
return 0;
long size = 0;
size += ImmutableMutations.serializer.serializedSize(logOffsets.mutations, version);
size += ImmutableMutations.serializer.serializedSize(logOffsets.mutations);
size += ActivatedTransfers.serializer.serializedSize(logOffsets.transfers(), version);
return size;
}
}
};
public static final Serializer serializer = new Serializer();
public static final IVersionedAsymmetricSerializer<ImmutableCoordinatorLogOffsets, ImmutableCoordinatorLogOffsets> embedded =
EmbeddedAsymmetricVersionedSerializer.mtEmbedded(serializer);
public static class ImmutableMutations implements Mutations<Offsets.Immutable>
{
@ -301,35 +297,35 @@ public class ImmutableCoordinatorLogOffsets implements CoordinatorLogOffsets<Off
'}';
}
private static final IVersionedSerializer<ImmutableMutations> serializer = new IVersionedSerializer<>()
public static final UnversionedSerializer<ImmutableMutations> serializer = new UnversionedSerializer<>()
{
@Override
public void serialize(ImmutableMutations mutations, DataOutputPlus out, int version) throws IOException
public void serialize(ImmutableMutations mutations, DataOutputPlus out) throws IOException
{
out.writeUnsignedVInt32(mutations.size());
for (long logId : mutations)
Offsets.serializer.serialize(mutations.offsets(logId), out, version);
Offsets.serializer.serialize(mutations.offsets(logId), out);
}
@Override
public ImmutableMutations deserialize(DataInputPlus in, int version) throws IOException
public ImmutableMutations deserialize(DataInputPlus in) throws IOException
{
int size = in.readUnsignedVInt32();
Long2ObjectHashMap<Offsets.Immutable> ids = new Long2ObjectHashMap<>(size, 0.9f, false);
for (int i = 0; i < size; i++)
{
Offsets.Immutable offsets = Offsets.serializer.deserialize(in, version);
Offsets.Immutable offsets = Offsets.serializer.deserialize(in);
ids.put(offsets.logId.asLong(), offsets);
}
return new ImmutableMutations(ids);
}
@Override
public long serializedSize(ImmutableMutations mutations, int version)
public long serializedSize(ImmutableMutations mutations)
{
long size = VIntCoding.computeUnsignedVIntSize(mutations.size());
for (long logId : mutations)
size += Offsets.serializer.serializedSize(mutations.offsets(logId), version);
size += Offsets.serializer.serializedSize(mutations.offsets(logId));
return size;
}
};

View File

@ -18,20 +18,14 @@
package org.apache.cassandra.replication;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import com.google.common.base.Preconditions;
import com.google.common.collect.Iterables;
import org.agrona.collections.Long2ObjectHashMap;
import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.replication.MutationSummary.CoordinatorSummary;
public abstract class Log2OffsetsMap<T extends Offsets> implements Iterable<ShortMutationId>
@ -276,40 +270,5 @@ public abstract class Log2OffsetsMap<T extends Offsets> implements Iterable<Shor
return new Immutable(result);
}
}
public static final IVersionedSerializer<Log2OffsetsMap.Immutable> serializer = new IVersionedSerializer<>()
{
@Override
public void serialize(Log2OffsetsMap.Immutable mo, DataOutputPlus out, int version) throws IOException
{
out.writeInt(mo.offsetMap.size());
for (Offsets.Immutable offsets : mo.asMap().values())
Offsets.serializer.serialize(offsets, out, version);
}
@Override
public Log2OffsetsMap.Immutable deserialize(DataInputPlus in, int version) throws IOException
{
Long2ObjectHashMap<Offsets.Immutable> offsetMap = new Long2ObjectHashMap<>();
int size = in.readInt();
for (int i=0; i<size; i++)
{
Offsets.Immutable offsets = Offsets.serializer.deserialize(in, version);
long key = offsets.logId().asLong();
Preconditions.checkState(!offsetMap.containsKey(key));
offsetMap.put(key, offsets);
}
return new Immutable(offsetMap);
}
@Override
public long serializedSize(Log2OffsetsMap.Immutable mo, int version)
{
long size = TypeSizes.INT_SIZE;
for (Offsets.Immutable offsets : mo.offsetMap.values())
size += Offsets.serializer.serializedSize(offsets, version);
return size;
}
};
}
}

View File

@ -22,7 +22,7 @@ import java.nio.ByteBuffer;
import java.util.Comparator;
import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.UnversionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
@ -136,17 +136,17 @@ public class MutationId extends ShortMutationId
: new MutationId(logId, sequenceId);
}
public static class Serializer implements IVersionedSerializer<MutationId>
public static class Serializer implements UnversionedSerializer<MutationId>
{
@Override
public void serialize(MutationId id, DataOutputPlus out, int version) throws IOException
public void serialize(MutationId id, DataOutputPlus out) throws IOException
{
out.writeLong(id.logId());
out.writeLong(id.sequenceId());
}
@Override
public MutationId deserialize(DataInputPlus in, int version) throws IOException
public MutationId deserialize(DataInputPlus in) throws IOException
{
long logId = in.readLong();
long sequenceId = in.readLong();
@ -156,17 +156,17 @@ public class MutationId extends ShortMutationId
}
@Override
public long serializedSize(MutationId id, int version)
public long serializedSize(MutationId id)
{
return TypeSizes.sizeof(id.logId()) + TypeSizes.sizeof(id.sequenceId());
}
public void skip(DataInputPlus in, int version) throws IOException
public void skip(DataInputPlus in) throws IOException
{
in.readLong();
in.readLong();
}
}
public static Serializer serializer = new Serializer();
public static final Serializer serializer = new Serializer();
}

View File

@ -30,12 +30,12 @@ import com.google.common.base.Preconditions;
import org.agrona.collections.Long2ObjectHashMap;
import org.apache.cassandra.db.Digest;
import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.UnversionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.schema.TableId;
import org.apache.cassandra.utils.AbstractIterator;
import org.apache.cassandra.utils.CollectionSerializers;
public class MutationSummary
{
@ -129,27 +129,26 @@ public class MutationSummary
}
}
public static final IVersionedSerializer<CoordinatorSummary> serializer = new IVersionedSerializer<>()
public static final UnversionedSerializer<CoordinatorSummary> serializer = new UnversionedSerializer<>()
{
@Override
public void serialize(CoordinatorSummary t, DataOutputPlus out, int version) throws IOException
public void serialize(CoordinatorSummary t, DataOutputPlus out) throws IOException
{
Offsets.serializer.serialize(t.reconciled, out, version);
Offsets.serializer.serialize(t.unreconciled, out, version);
Offsets.serializer.serialize(t.reconciled, out);
Offsets.serializer.serialize(t.unreconciled, out);
}
@Override
public CoordinatorSummary deserialize(DataInputPlus in, int version) throws IOException
public CoordinatorSummary deserialize(DataInputPlus in) throws IOException
{
return new CoordinatorSummary(Offsets.serializer.deserialize(in, version),
Offsets.serializer.deserialize(in, version));
return new CoordinatorSummary(Offsets.serializer.deserialize(in), Offsets.serializer.deserialize(in));
}
@Override
public long serializedSize(CoordinatorSummary t, int version)
public long serializedSize(CoordinatorSummary t)
{
return Offsets.serializer.serializedSize(t.reconciled, version)
+ Offsets.serializer.serializedSize(t.unreconciled, version);
return Offsets.serializer.serializedSize(t.reconciled)
+ Offsets.serializer.serializedSize(t.unreconciled);
}
};
}
@ -347,36 +346,28 @@ public class MutationSummary
};
}
public static final IVersionedSerializer<MutationSummary> serializer = new IVersionedSerializer<>()
public static final UnversionedSerializer<MutationSummary> serializer = new UnversionedSerializer<>()
{
@Override
public void serialize(MutationSummary summary, DataOutputPlus out, int version) throws IOException
public void serialize(MutationSummary summary, DataOutputPlus out) throws IOException
{
summary.tableId.serialize(out);
out.writeInt(summary.summaries.size());
for (int i=0,mi=summary.summaries.size(); i<mi; i++)
CoordinatorSummary.serializer.serialize(summary.summaries.get(i), out, version);
summary.tableId.serializeCompact(out);
CollectionSerializers.serializeList(summary.summaries, out, CoordinatorSummary.serializer);
}
@Override
public MutationSummary deserialize(DataInputPlus in, int version) throws IOException
public MutationSummary deserialize(DataInputPlus in) throws IOException
{
TableId tableId = TableId.deserialize(in);
int size = in.readInt();
List<CoordinatorSummary> summaries = new ArrayList<>(size);
for (int i = 0; i < size; i++)
summaries.add(CoordinatorSummary.serializer.deserialize(in, version));
TableId tableId = TableId.deserializeCompact(in);
List<CoordinatorSummary> summaries = CollectionSerializers.deserializeList(in, CoordinatorSummary.serializer);
return new MutationSummary(tableId, summaries);
}
@Override
public long serializedSize(MutationSummary summary, int version)
public long serializedSize(MutationSummary summary)
{
long size = summary.tableId.serializedSize();
size += TypeSizes.sizeof(summary.summaries.size());
for (int i=0,mi=summary.summaries.size(); i<mi; i++)
size += CoordinatorSummary.serializer.serializedSize(summary.summaries.get(i), version);
long size = summary.tableId.serializedCompactSize();
size += CollectionSerializers.serializedListSize(summary.summaries, CoordinatorSummary.serializer);
return size;
}
};

View File

@ -1418,7 +1418,7 @@ public class MutationTrackingService
if (replicatedOffsets.isEmpty())
return;
Message<BroadcastLogOffsets> message = Message.out(Verb.BROADCAST_LOG_OFFSETS, replicatedOffsets);
Message<BroadcastLogOffsets> message = Message.out(Verb.MT_BROADCAST_LOG_OFFSETS, replicatedOffsets);
for (InetAddressAndPort target : shard.remoteReplicas())
if (FailureDetector.instance.isAlive(target))

View File

@ -28,19 +28,16 @@ import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
import org.agrona.collections.IntArrayList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.cassandra.db.Digest;
import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.UnversionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.utils.AbstractIterator;
public abstract class Offsets implements Iterable<ShortMutationId>
{
private static final Logger logger = LoggerFactory.getLogger(Offsets.class);
private static final int INITIAL_CAPACITY = 16;
protected final CoordinatorLogId logId;
@ -1567,21 +1564,21 @@ public abstract class Offsets implements Iterable<ShortMutationId>
}
// TODO (consider): delta-encoding + vints
public static final IVersionedSerializer<Offsets.Immutable> serializer = new IVersionedSerializer<>()
public static final UnversionedSerializer<Immutable> serializer = new UnversionedSerializer<>()
{
@Override
public void serialize(Offsets.Immutable offsets, DataOutputPlus out, int version) throws IOException
public void serialize(Offsets.Immutable offsets, DataOutputPlus out) throws IOException
{
CoordinatorLogId.serializer.serialize(offsets.logId, out, version);
CoordinatorLogId.serializer.serialize(offsets.logId, out);
out.writeInt(offsets.size);
for (int i = 0; i < offsets.size; i++)
out.writeInt(offsets.bounds[i]);
}
@Override
public Offsets.Immutable deserialize(DataInputPlus in, int version) throws IOException
public Offsets.Immutable deserialize(DataInputPlus in) throws IOException
{
CoordinatorLogId logId = CoordinatorLogId.serializer.deserialize(in, version);
CoordinatorLogId logId = CoordinatorLogId.serializer.deserialize(in);
int size = in.readInt();
Preconditions.checkArgument(size >= 0 && size % 2 == 0);
int[] bounds = new int[size];
@ -1591,9 +1588,9 @@ public abstract class Offsets implements Iterable<ShortMutationId>
}
@Override
public long serializedSize(Offsets.Immutable offsets, int version)
public long serializedSize(Offsets.Immutable offsets)
{
long size = CoordinatorLogId.serializer.serializedSize(offsets.logId, version);
long size = CoordinatorLogId.serializer.serializedSize(offsets.logId);
size += TypeSizes.sizeof(offsets.size);
size += (long) TypeSizes.INT_SIZE * offsets.size;
return size;

View File

@ -22,12 +22,11 @@ import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.UnversionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.locator.InetAddressAndPort;
import org.apache.cassandra.net.IVerbHandler;
import org.apache.cassandra.net.Message;
public final class PullMutationsRequest
{
@ -40,38 +39,33 @@ public final class PullMutationsRequest
this.offsets = offsets;
}
public static IVersionedSerializer<PullMutationsRequest> serializer = new IVersionedSerializer<>()
public static final UnversionedSerializer<PullMutationsRequest> serializer = new UnversionedSerializer<>()
{
@Override
public void serialize(PullMutationsRequest pull, DataOutputPlus out, int version) throws IOException
public void serialize(PullMutationsRequest pull, DataOutputPlus out) throws IOException
{
Offsets.serializer.serialize(pull.offsets, out, version);
Offsets.serializer.serialize(pull.offsets, out);
}
@Override
public PullMutationsRequest deserialize(DataInputPlus in, int version) throws IOException
public PullMutationsRequest deserialize(DataInputPlus in) throws IOException
{
return new PullMutationsRequest(Offsets.serializer.deserialize(in, version));
return new PullMutationsRequest(Offsets.serializer.deserialize(in));
}
@Override
public long serializedSize(PullMutationsRequest pull, int version)
public long serializedSize(PullMutationsRequest pull)
{
return Offsets.serializer.serializedSize(pull.offsets, version);
return Offsets.serializer.serializedSize(pull.offsets);
}
};
public static IVerbHandler<PullMutationsRequest> verbHandler = new IVerbHandler<>()
{
@Override
public void doVerb(Message<PullMutationsRequest> message)
{
MutationTrackingService.ensureEnabled();
InetAddressAndPort forHost = message.from();
Offsets offsets = message.payload.offsets;
logger.trace("Received pull mutations request from {} for {}", forHost, offsets);
MutationTrackingService.instance().requestMissingMutations(offsets, forHost);
}
public static IVerbHandler<PullMutationsRequest> verbHandler = message -> {
MutationTrackingService.ensureEnabled();
InetAddressAndPort forHost = message.from();
Offsets offsets = message.payload.offsets;
logger.trace("Received pull mutations request from {} for {}", forHost, offsets);
MutationTrackingService.instance().requestMissingMutations(offsets, forHost);
};
@Override

View File

@ -27,7 +27,6 @@ import org.slf4j.LoggerFactory;
import org.apache.cassandra.db.Mutation;
import org.apache.cassandra.exceptions.WriteTimeoutException;
import org.apache.cassandra.io.IVersionedAsymmetricSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.journal.RecordPointer;
@ -142,24 +141,24 @@ public interface PushMutationRequest
}
}
IVersionedAsymmetricSerializer<PushMutationRequest, Materialized> serializer = new IVersionedAsymmetricSerializer<>()
VersionedAsymmetricSerializer<PushMutationRequest, Materialized> serializer = new VersionedAsymmetricSerializer<>()
{
@Override
public long serializedSize(PushMutationRequest mutation, int version)
public long serializedSize(PushMutationRequest mutation, Version version)
{
return mutation.serializedSize(version);
return mutation.serializedSize(version.messagingVersion());
}
@Override
public void serialize(PushMutationRequest mutation, DataOutputPlus out, int version) throws IOException
public void serialize(PushMutationRequest mutation, DataOutputPlus out, Version version) throws IOException
{
mutation.serialize(out, version);
mutation.serialize(out, version.messagingVersion());
}
@Override
public Materialized deserialize(DataInputPlus in, int version) throws IOException
public Materialized deserialize(DataInputPlus in, Version version) throws IOException
{
return Materialized.deserialize(in, version);
return Materialized.deserialize(in, version.messagingVersion());
}
};

View File

@ -25,19 +25,17 @@ import java.util.function.BiConsumer;
import org.agrona.collections.Long2ObjectHashMap;
import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.dht.AbstractBounds;
import org.apache.cassandra.dht.IPartitioner;
import org.apache.cassandra.dht.Range;
import org.apache.cassandra.dht.Token;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.utils.CollectionSerializers;
import org.apache.cassandra.utils.Int64Serializer;
public class ReconciledKeyspaceOffsets
{
public static final IVersionedSerializer<ReconciledKeyspaceOffsets> serializer = new Serializer();
/**
* Simple data holder for offsets and their associated range
*/
@ -214,57 +212,52 @@ public class ReconciledKeyspaceOffsets
return new Builder();
}
public static class Serializer implements IVersionedSerializer<ReconciledKeyspaceOffsets>
private static final VersionedSerializer<Entry> entrySerializer = new VersionedSerializer<>()
{
@Override
public void serialize(ReconciledKeyspaceOffsets keyspaceOffsets, DataOutputPlus out, int version) throws IOException
public void serialize(Entry e, DataOutputPlus out, Version version) throws IOException
{
out.writeInt(keyspaceOffsets.logEntries.size());
keyspaceOffsets.logEntries.forEachLong((logId, entry) -> {
try
{
out.writeLong(logId);
Offsets.serializer.serialize(entry.offsets, out, version);
AbstractBounds.tokenSerializer.serialize(entry.range, out, version);
}
catch (IOException e)
{
throw new RuntimeException(e);
}
});
Offsets.serializer.serialize(e.offsets, out);
AbstractBounds.tokenSerializer.serialize(e.range, out, version.messagingVersion());
}
@Override
public ReconciledKeyspaceOffsets deserialize(DataInputPlus in, int version) throws IOException
public Entry deserialize(DataInputPlus in, Version version) throws IOException
{
int logCount = in.readInt();
Long2ObjectHashMap<Entry> logEntries = new Long2ObjectHashMap<>();
Offsets.Immutable offsets = Offsets.serializer.deserialize(in);
Range<Token> range = (Range<Token>) AbstractBounds.tokenSerializer.deserialize(in, IPartitioner.global(), version.messagingVersion());
return new Entry(offsets, range);
}
for (int j = 0; j < logCount; j++)
{
long logId = in.readLong();
Offsets.Immutable offsets = Offsets.serializer.deserialize(in, version);
Range<Token> range = (Range<Token>) AbstractBounds.tokenSerializer.deserialize(in, IPartitioner.global(), version);
logEntries.put(logId, new Entry(offsets, range));
}
@Override
public long serializedSize(Entry e, Version version)
{
return Offsets.serializer.serializedSize(e.offsets) + AbstractBounds.tokenSerializer.serializedSize(e.range, version.messagingVersion());
}
};
public static final VersionedSerializer<ReconciledKeyspaceOffsets> serializer = new VersionedSerializer<>()
{
@Override
public void serialize(ReconciledKeyspaceOffsets keyspaceOffsets, DataOutputPlus out, Version version) throws IOException
{
CollectionSerializers.serializeMap(
keyspaceOffsets.logEntries, out, version, Int64Serializer.serializer, entrySerializer
);
}
@Override
public ReconciledKeyspaceOffsets deserialize(DataInputPlus in, Version version) throws IOException
{
Long2ObjectHashMap<Entry> logEntries =
CollectionSerializers.deserializeMap(in, version, Int64Serializer.serializer, entrySerializer, i -> new Long2ObjectHashMap<>());
return new ReconciledKeyspaceOffsets(logEntries);
}
@Override
public long serializedSize(ReconciledKeyspaceOffsets keyspaceOffsets, int version)
public long serializedSize(ReconciledKeyspaceOffsets keyspaceOffsets, Version version)
{
long size = TypeSizes.sizeof(keyspaceOffsets.logEntries.size());
final long[] totalSize = { size };
keyspaceOffsets.logEntries.forEachLong((logId, entry) -> {
totalSize[0] += TypeSizes.sizeof(logId);
totalSize[0] += Offsets.serializer.serializedSize(entry.offsets, version);
totalSize[0] += AbstractBounds.tokenSerializer.serializedSize(entry.range, version);
});
return totalSize[0];
return CollectionSerializers.serializedMapSize(keyspaceOffsets.logEntries, version, Int64Serializer.serializer, entrySerializer);
}
}
};
}

View File

@ -26,12 +26,12 @@ import java.util.function.BiConsumer;
import com.google.common.collect.ImmutableMap;
import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.dht.Range;
import org.apache.cassandra.dht.Token;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.utils.CollectionSerializers;
import org.apache.cassandra.utils.StringSerializer;
/**
* Container for reconciled offsets organized by keyspace and shard, including range information for each log.
@ -39,8 +39,6 @@ import org.apache.cassandra.io.util.DataOutputPlus;
*/
public class ReconciledLogSnapshot
{
public static final IVersionedSerializer<ReconciledLogSnapshot> serializer = new Serializer();
private final ImmutableMap<String, ReconciledKeyspaceOffsets> reconciled;
private ReconciledLogSnapshot(ImmutableMap<String, ReconciledKeyspaceOffsets> reconciled)
@ -177,48 +175,32 @@ public class ReconciledLogSnapshot
return new Builder();
}
public static class Serializer implements IVersionedSerializer<ReconciledLogSnapshot>
public static final VersionedSerializer<ReconciledLogSnapshot> serializer = new VersionedSerializer<>()
{
@Override
public void serialize(ReconciledLogSnapshot offsets, DataOutputPlus out, int version) throws IOException
public void serialize(ReconciledLogSnapshot offsets, DataOutputPlus out, Version version) throws IOException
{
out.writeInt(offsets.reconciled.size());
for (Map.Entry<String, ReconciledKeyspaceOffsets> keyspaceEntry : offsets.reconciled.entrySet())
{
out.writeUTF(keyspaceEntry.getKey());
ReconciledKeyspaceOffsets.serializer.serialize(keyspaceEntry.getValue(), out, version);
}
CollectionSerializers.serializeMap(
offsets.reconciled, out, version, StringSerializer.instance, ReconciledKeyspaceOffsets.serializer
);
}
@Override
public ReconciledLogSnapshot deserialize(DataInputPlus in, int version) throws IOException
public ReconciledLogSnapshot deserialize(DataInputPlus in, Version version) throws IOException
{
int keyspaceCount = in.readInt();
ImmutableMap.Builder<String, ReconciledKeyspaceOffsets> builder = ImmutableMap.builder();
for (int i = 0; i < keyspaceCount; i++)
{
String keyspace = in.readUTF();
ReconciledKeyspaceOffsets keyspaceOffsets = ReconciledKeyspaceOffsets.serializer.deserialize(in, version);
builder.put(keyspace, keyspaceOffsets);
}
CollectionSerializers.deserializeMapToConsumer(
in, version, StringSerializer.instance, ReconciledKeyspaceOffsets.serializer, builder::put
);
return new ReconciledLogSnapshot(builder.build());
}
@Override
public long serializedSize(ReconciledLogSnapshot offsets, int version)
public long serializedSize(ReconciledLogSnapshot offsets, Version version)
{
long size = TypeSizes.sizeof(offsets.reconciled.size());
for (Map.Entry<String, ReconciledKeyspaceOffsets> keyspaceEntry : offsets.reconciled.entrySet())
{
size += TypeSizes.sizeof(keyspaceEntry.getKey());
size += ReconciledKeyspaceOffsets.serializer.serializedSize(keyspaceEntry.getValue(), version);
}
return size;
return CollectionSerializers.serializedMapSize(
offsets.reconciled, version, StringSerializer.instance, ReconciledKeyspaceOffsets.serializer
);
}
}
}
};
}

View File

@ -22,7 +22,7 @@ import java.io.Serializable;
import java.util.Comparator;
import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.UnversionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
@ -135,17 +135,17 @@ public class ShortMutationId implements Serializable
return cmp != 0 ? cmp : Integer.compare(l.offset, r.offset);
};
public static final IVersionedSerializer<ShortMutationId> serializer = new IVersionedSerializer<>()
public static final UnversionedSerializer<ShortMutationId> serializer = new UnversionedSerializer<>()
{
@Override
public void serialize(ShortMutationId id, DataOutputPlus out, int version) throws IOException
public void serialize(ShortMutationId id, DataOutputPlus out) throws IOException
{
out.writeLong(id.logId());
out.writeInt(id.offset());
}
@Override
public ShortMutationId deserialize(DataInputPlus in, int version) throws IOException
public ShortMutationId deserialize(DataInputPlus in) throws IOException
{
long logId = in.readLong();
int offset = in.readInt();
@ -156,7 +156,7 @@ public class ShortMutationId implements Serializable
}
@Override
public long serializedSize(ShortMutationId id, int version)
public long serializedSize(ShortMutationId id)
{
return TypeSizes.sizeof(id.logId()) + TypeSizes.sizeof(id.offset());
}

View File

@ -329,7 +329,7 @@ public class TrackedImportTransfer extends CoordinatedTransfer
for (Pair<InetAddressAndPort, InetAddressAndPort> target : targets)
{
ActivationRequest activation = createActivation(target, Phase.PREPARE);
Message<ActivationRequest> msg = Message.out(Verb.TRACKED_TRANSFER_ACTIVATE_REQ, activation);
Message<ActivationRequest> msg = Message.out(Verb.MT_TRANSFER_ACTIVATE_REQ, activation);
logger.debug("{} Sending prepare {} to peer {}", logPrefix(), activation, target.right);
MessagingService.instance().sendWithCallback(msg, target.right, prepare);
streamResults.computeIfPresent(target, (peer0, result) -> result.preparing());

View File

@ -20,7 +20,6 @@ package org.apache.cassandra.replication;
import java.io.IOException;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.utils.TimeUUID;
@ -40,25 +39,24 @@ public class TransferFailed
this.planId = planId;
}
public static final IVersionedSerializer<TransferFailed> serializer = new IVersionedSerializer<TransferFailed>()
public static final VersionedSerializer<TransferFailed> serializer = new VersionedSerializer<>()
{
@Override
public void serialize(TransferFailed t, DataOutputPlus out, int version) throws IOException
public void serialize(TransferFailed t, DataOutputPlus out, Version version) throws IOException
{
TimeUUID.Serializer.instance.serialize(t.planId, out, version);
TimeUUID.Serializer.instance.serialize(t.planId, out, version.messagingVersion());
}
@Override
public TransferFailed deserialize(DataInputPlus in, int version) throws IOException
public TransferFailed deserialize(DataInputPlus in, Version version) throws IOException
{
TimeUUID planId = TimeUUID.Serializer.instance.deserialize(in, version);
return new TransferFailed(planId);
return new TransferFailed(TimeUUID.Serializer.instance.deserialize(in, version.messagingVersion()));
}
@Override
public long serializedSize(TransferFailed t, int version)
public long serializedSize(TransferFailed t, Version version)
{
return TimeUUID.Serializer.instance.serializedSize(t.planId, version);
return TimeUUID.Serializer.instance.serializedSize(t.planId, version.messagingVersion());
}
};

View File

@ -0,0 +1,131 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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
*
* http://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 org.apache.cassandra.replication;
import java.io.IOException;
import com.google.common.base.Preconditions;
import org.apache.cassandra.config.CassandraRelevantProperties;
import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.io.UnversionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.net.MessagingService;
/**
* The enum used for versioning mutation-tracking-specific messages
* and their nested data structures (plus certain on-disk structures).
* <p>
* This exists so that we can evolve Mutation Tracking (MT) serialization
* without having to bump the {@link MessagingService} (MS) version,
* as 1) that is somewhat a big deal, and 2) MT is still actively evolving.
* <p>
* Today, only the MS version is negotiated between nodes, so for serializing
* messages we need to infer the appropriate MT version somehow when serializing,
* and include the version that was used with the payload. When deserializing,
* we'll read the MT version from the payload and use it explicitly to decode the message.
* <p>
* The current approach is to manually specify the cluster safe MT version
* (see {@code CLUSTER_SAFE_VERSION}). If and when a new MT version is
* introduced, once all the nodes have been upgraded to C* versions
* that support it, {@code CLUSTER_SAFE_VERSION} can be bumped.
*/
public enum Version
{
V1(1, MessagingService.VERSION_61);
static final Version CURRENT = V1;
private static final Version[] versionMap;
static
{
Version[] values = values();
int max = -1;
for (Version version : values)
max = Integer.max(version.version, max);
Version[] intToVersionMap = new Version[max + 1];
for (Version version : values)
intToVersionMap[version.version] = version;
versionMap = intToVersionMap;
for (int i = 1; i < values.length; i++)
{
Version prev = values[i - 1];
Version version = values[i];
Preconditions.checkState(version.version > prev.version);
Preconditions.checkState(version.messagingVersion >= prev.messagingVersion);
}
}
/**
* Version that should be used for messaging serialization where mixed versions may be possible.
* As of this writing only 1 version exists, so this is the same as CURRENT.
* Once v2 comes into the picture we need this version to be the oldest version needed for downgrade
* If you upgrade from 7.0 to 8.0 (assuming this adds a v2) you need a version that works with 7.0 here.
*/
public static final Version CLUSTER_SAFE_VERSION;
static
{
CLUSTER_SAFE_VERSION = fromInt(CassandraRelevantProperties.MT_CLUSTER_SAFE_VERSION.getInt(CURRENT.version));
}
private final int version;
private final int messagingVersion;
Version(int version, int messagingVersion)
{
this.version = version;
this.messagingVersion = messagingVersion;
}
public int messagingVersion()
{
return messagingVersion;
}
private static Version fromInt(int v)
{
if (v < 1 || v >= versionMap.length || versionMap[v] == null)
throw new IllegalArgumentException("version " + v + " is not recognized");
return versionMap[v];
}
public static final UnversionedSerializer<Version> serializer = new UnversionedSerializer<>()
{
@Override
public void serialize(Version v, DataOutputPlus out) throws IOException
{
out.writeUnsignedVInt32(v.version);
}
@Override
public Version deserialize(DataInputPlus in) throws IOException
{
return fromInt(in.readUnsignedVInt32());
}
@Override
public long serializedSize(Version v)
{
return TypeSizes.sizeofUnsignedVInt(v.version);
}
};
}

View File

@ -15,9 +15,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cassandra.replication;
package org.apache.cassandra.service.accord.serializers;
import org.apache.cassandra.io.AsymmetricVersionedSerializer;
public interface AsymmetricVersionedSerializer<In, Out> extends org.apache.cassandra.io.AsymmetricVersionedSerializer<In, Out, Version>
public interface VersionedAsymmetricSerializer<In, Out> extends AsymmetricVersionedSerializer<In, Out, Version>
{
}

View File

@ -15,10 +15,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cassandra.replication;
package org.apache.cassandra.io;
public interface MessageVersionProvider
public interface VersionedSerializer<T> extends org.apache.cassandra.io.VersionedSerializer<T, Version>
{
int messageVersion();
}

View File

@ -35,8 +35,6 @@ import org.apache.cassandra.db.marshal.ListType;
import org.apache.cassandra.db.marshal.MapType;
import org.apache.cassandra.db.marshal.SetType;
import org.apache.cassandra.db.marshal.ValueAccessor;
import org.apache.cassandra.io.AsymmetricVersionedSerializer;
import org.apache.cassandra.io.EmbeddedAsymmetricVersionedSerializer;
import org.apache.cassandra.io.ParameterisedUnversionedSerializer;
import org.apache.cassandra.io.UnversionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
@ -56,11 +54,6 @@ import static org.apache.cassandra.db.marshal.CollectionType.Kind.SET;
public class AccordSerializers
{
public static <A, B> EmbeddedAsymmetricVersionedSerializer<A, B, Version> embedded(Version version, AsymmetricVersionedSerializer<A, B, Version> serializer)
{
return new EmbeddedAsymmetricVersionedSerializer<>(version, Version.Serializer.instance, serializer);
}
public static Term.Terminal deserializeCqlCollectionAsTerm(ByteBuffer buffer, AbstractType<?> type)
{
CollectionType<?> collectionType = (CollectionType<?>) type;

View File

@ -15,7 +15,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cassandra.service.accord.serializers;
import java.io.IOException;
@ -27,30 +26,6 @@ import org.apache.cassandra.io.util.DataOutputPlus;
public interface IVersionedSerializer<T> extends VersionedSerializer<T, Version>
{
static <T> IVersionedSerializer<T> fromMessaging(org.apache.cassandra.io.IVersionedSerializer<T> delegate)
{
return new IVersionedSerializer<T>()
{
@Override
public void serialize(T t, DataOutputPlus out, Version version) throws IOException
{
delegate.serialize(t, out, version.messageVersion());
}
@Override
public T deserialize(DataInputPlus in, Version version) throws IOException
{
return delegate.deserialize(in, version.messageVersion());
}
@Override
public long serializedSize(T t, Version version)
{
return delegate.serializedSize(t, version.messageVersion());
}
};
}
static <T> IVersionedSerializer<T> fromSerializer(UnversionedSerializer<T> delegate)
{
return new IVersionedSerializer<T>()

View File

@ -24,13 +24,12 @@ import java.util.Collections;
import java.util.List;
import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.io.MessageVersionProvider;
import org.apache.cassandra.io.UnversionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.net.MessagingService;
public enum Version implements MessageVersionProvider
public enum Version
{
// If MessagingService version bumps, this mapping does not need to be updated; only updates needed are those that
// include accord serializer changes.
@ -92,7 +91,6 @@ public enum Version implements MessageVersionProvider
throw new IllegalArgumentException("Attempted to use message version " + messagingVersion + " which is smaller than " + versions[0] + " can handle (" + versions[0].messageVersion() + ")");
}
@Override
public int messageVersion()
{
return messagingVersion.value;

View File

@ -40,6 +40,7 @@ import org.apache.cassandra.schema.Schema;
import org.apache.cassandra.schema.TableId;
import org.apache.cassandra.schema.TableMetadata;
import org.apache.cassandra.utils.CollectionSerializers;
import org.apache.cassandra.utils.StringSerializer;
import static org.apache.cassandra.db.SerializationHeader.StableHeaderSerializer.STABLE;
import static org.apache.cassandra.db.rows.DeserializationHelper.Flag.FROM_REMOTE;
@ -123,7 +124,7 @@ public class CasForwardResponse
CassandraException.serializer.serialize(response.exception, out, version);
if (!response.warnings.isEmpty())
CollectionSerializers.serializeList(response.warnings, out, version, CollectionSerializers.STRING_SERIALIZER);
CollectionSerializers.serializeList(response.warnings, out, version, StringSerializer.instance);
}
@Override
@ -151,7 +152,7 @@ public class CasForwardResponse
List<String> warnings = Collections.emptyList();
if (hasWarnings)
warnings = CollectionSerializers.deserializeList(in, version, CollectionSerializers.STRING_SERIALIZER);
warnings = CollectionSerializers.deserializeList(in, version, StringSerializer.instance);
return new CasForwardResponse(result, exception, warnings);
}
@ -175,7 +176,7 @@ public class CasForwardResponse
size += CassandraException.serializer.serializedSize(response.exception, version);
if (!response.warnings.isEmpty())
size += CollectionSerializers.serializedListSize(response.warnings, version, CollectionSerializers.STRING_SERIALIZER);
size += CollectionSerializers.serializedListSize(response.warnings, version, StringSerializer.instance);
return size;
}

View File

@ -22,7 +22,7 @@ import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.UnversionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.net.IVerbHandler;
@ -57,25 +57,24 @@ public class ReadReconcileAck
ReadReconciliations.instance.acceptSyncAck(message.from(), notify.readId);
};
public static final IVersionedSerializer<ReadReconcileAck> serializer = new IVersionedSerializer<>()
public static final UnversionedSerializer<ReadReconcileAck> serializer = new UnversionedSerializer<>()
{
@Override
public void serialize(ReadReconcileAck notify, DataOutputPlus out, int version) throws IOException
public void serialize(ReadReconcileAck notify, DataOutputPlus out) throws IOException
{
TrackedRead.Id.serializer.serialize(notify.readId, out, version);
TrackedRead.Id.serializer.serialize(notify.readId, out);
}
@Override
public ReadReconcileAck deserialize(DataInputPlus in, int version) throws IOException
public ReadReconcileAck deserialize(DataInputPlus in) throws IOException
{
TrackedRead.Id readId = TrackedRead.Id.serializer.deserialize(in, version);
return new ReadReconcileAck(readId);
return new ReadReconcileAck(TrackedRead.Id.serializer.deserialize(in));
}
@Override
public long serializedSize(ReadReconcileAck notify, int version)
public long serializedSize(ReadReconcileAck notify)
{
return TrackedRead.Id.serializer.serializedSize(notify.readId, version);
return TrackedRead.Id.serializer.serializedSize(notify.readId);
}
};
}

View File

@ -208,7 +208,7 @@ public class ReadReconciliations implements ExpiredStatePurger.Expireable
{
// send the summary to all peers, so that they can initiate reconciling their gaps ASAP
TrackedSummaryResponse response = new TrackedSummaryResponse(id, summary, dataNode, summaryNodes);
Message<TrackedSummaryResponse> message = Message.out(Verb.TRACKED_SUMMARY_RSP, response);
Message<TrackedSummaryResponse> message = Message.out(Verb.MT_SUMMARY_RSP, response);
for (int node : remoteNodes)
MessagingService.instance().send(message, host(node));
}
@ -365,7 +365,7 @@ public class ReadReconciliations implements ExpiredStatePurger.Expireable
if (isDataNode())
MutationTrackingService.instance().localReads().acknowledgeReconcile(id, augmentingOffsets());
else
MessagingService.instance().send(Message.out(Verb.READ_RECONCILE_ACK, new ReadReconcileAck(id)), host(dataNode));
MessagingService.instance().send(Message.out(Verb.MT_READ_RECONCILE_ACK, new ReadReconcileAck(id)), host(dataNode));
return true;
}
@ -399,7 +399,7 @@ public class ReadReconciliations implements ExpiredStatePurger.Expireable
{
PullMutationsRequest pull = new PullMutationsRequest(Offsets.Immutable.copy(toPull));
logger.debug("Pulling {} from {}", pull, pullFrom);
MessagingService.instance().send(Message.out(Verb.PULL_MUTATIONS_REQ, pull), pullFrom);
MessagingService.instance().send(Message.out(Verb.MT_PULL_MUTATIONS_REQ, pull), pullFrom);
}
}

View File

@ -15,7 +15,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cassandra.service.reads.tracked;
import java.io.IOException;
@ -29,33 +28,37 @@ import com.google.common.base.Preconditions;
import org.apache.cassandra.db.IReadResponse;
import org.apache.cassandra.db.ReadCommand;
import org.apache.cassandra.db.ReadKind;
import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.db.filter.ColumnFilter;
import org.apache.cassandra.db.filter.DataLimits;
import org.apache.cassandra.db.partitions.PartitionIterator;
import org.apache.cassandra.db.partitions.PartitionIterators;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.EmbeddedAsymmetricVersionedSerializer;
import org.apache.cassandra.io.IVersionedAsymmetricSerializer;
import org.apache.cassandra.io.util.DataInputBuffer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputBuffer;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.net.MessagingService;
import org.apache.cassandra.replication.Version;
import org.apache.cassandra.replication.VersionedSerializer;
import org.apache.cassandra.utils.ArraySerializers;
import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.CollectionSerializers;
public class TrackedDataResponse implements IReadResponse
{
private final int serializationVersion;
private final int[] versions;
private final List<ByteBuffer> data;
public TrackedDataResponse(int serializationVersion, ByteBuffer data)
public TrackedDataResponse(int version, ByteBuffer data)
{
this(serializationVersion, Collections.singletonList(data));
this(new int[] { version }, Collections.singletonList(data));
}
private TrackedDataResponse(int serializationVersion, List<ByteBuffer> data)
private TrackedDataResponse(int[] versions, List<ByteBuffer> data)
{
Preconditions.checkArgument(!data.isEmpty());
this.serializationVersion = serializationVersion;
Preconditions.checkArgument(versions.length == data.size());
this.versions = versions;
this.data = data;
}
@ -66,39 +69,44 @@ public class TrackedDataResponse implements IReadResponse
public static TrackedDataResponse merge(TrackedDataResponse l, TrackedDataResponse r)
{
Preconditions.checkArgument(l.serializationVersion == r.serializationVersion);
int[] newVersions = new int[l.versions.length + r.versions.length];
List<ByteBuffer> newData = new ArrayList<>(l.data.size() + r.data.size());
System.arraycopy(l.versions, 0, newVersions, 0, l.versions.length);
System.arraycopy(r.versions, 0, newVersions, l.versions.length, r.versions.length);
newData.addAll(l.data);
newData.addAll(r.data);
return new TrackedDataResponse(l.serializationVersion, newData);
return new TrackedDataResponse(newVersions, newData);
}
public static TrackedDataResponse merge(List<TrackedDataResponse> responses)
{
Preconditions.checkArgument(!responses.isEmpty());
int version = responses.get(0).serializationVersion;
int size = responses.get(0).data.size();
int size = 0;
for (TrackedDataResponse response : responses)
size += response.data.size();
for (int i=1,mi=responses.size(); i<mi; i++)
int[] newVersions = new int[size];
List<ByteBuffer> newData = new ArrayList<>(size);
int offset = 0;
for (TrackedDataResponse response : responses)
{
Preconditions.checkState(responses.get(i).serializationVersion == version);
size += responses.get(i).data.size();
System.arraycopy(response.versions, 0, newVersions, offset, response.versions.length);
offset += response.versions.length;
newData.addAll(response.data);
}
List<ByteBuffer> newData = new ArrayList<>(size);
for (int i=0,mi=responses.size(); i<mi; i++)
newData.addAll(responses.get(i).data);
return new TrackedDataResponse(version, newData);
return new TrackedDataResponse(newVersions, newData);
}
public static TrackedDataResponse create(PartitionIterator iter, ColumnFilter selection)
{
try (DataOutputBuffer buffer = new DataOutputBuffer())
{
PartitionIterators.Serializer.serialize(iter, selection, buffer, MessagingService.current_version);
return new TrackedDataResponse(MessagingService.current_version, buffer.buffer(false));
int version = Version.CLUSTER_SAFE_VERSION.messagingVersion();
PartitionIterators.Serializer.serialize(iter, selection, buffer, version);
return new TrackedDataResponse(version, buffer.buffer(false));
}
catch (IOException e)
{
@ -123,11 +131,10 @@ public class TrackedDataResponse implements IReadResponse
public PartitionIterator makeIteratorUnlimited(ReadCommand command)
{
if (data.size() == 1)
return makeIterator(serializationVersion, data.get(0), command);
return makeIterator(versions[0], data.get(0), command);
List<PartitionIterator> iterators = new ArrayList<>(data.size());
for (ByteBuffer buffer : data)
iterators.add(makeIterator(serializationVersion, buffer, command));
for (int i = 0; i < data.size(); i++)
iterators.add(makeIterator(versions[i], data.get(i), command));
return PartitionIterators.mergeNonOverlapping(iterators);
}
@ -140,38 +147,35 @@ public class TrackedDataResponse implements IReadResponse
return counter.applyTo(makeIteratorUnlimited(command));
}
public static final IVersionedSerializer<TrackedDataResponse> serializer = new IVersionedSerializer<>()
private static final VersionedSerializer<TrackedDataResponse> serializer = new VersionedSerializer<>()
{
@Override
public void serialize(TrackedDataResponse response, DataOutputPlus out, int version) throws IOException
public void serialize(TrackedDataResponse response, DataOutputPlus out, Version version) throws IOException
{
out.writeInt(response.serializationVersion);
out.writeInt(response.data.size());
for (ByteBuffer buffer : response.data)
ByteBufferUtil.writeWithVIntLength(buffer, out);
ArraySerializers.serializeVIntArray(response.versions, out);
CollectionSerializers.serializeList(response.data, out, ByteBufferUtil.byteBufferSerializer);
}
@Override
public TrackedDataResponse deserialize(DataInputPlus in, int version) throws IOException
public TrackedDataResponse deserialize(DataInputPlus in, Version version) throws IOException
{
int serializationVersion = in.readInt();
int size = in.readInt();
List<ByteBuffer> data = new ArrayList<>(size);
for (int i = 0; i < size; i++)
data.add(ByteBufferUtil.readWithVIntLength(in));
return new TrackedDataResponse(serializationVersion, data);
int[] versions = ArraySerializers.deserializeVIntArray(in);
List<ByteBuffer> data = CollectionSerializers.deserializeList(in, ByteBufferUtil.byteBufferSerializer);
return new TrackedDataResponse(versions, data);
}
@Override
public long serializedSize(TrackedDataResponse response, int version)
public long serializedSize(TrackedDataResponse response, Version version)
{
long size = TypeSizes.sizeof(response.serializationVersion) + TypeSizes.sizeof(response.data.size());
for (ByteBuffer buffer : response.data)
size += ByteBufferUtil.serializedSizeWithVIntLength(buffer);
long size = ArraySerializers.serializedVIntArraySize(response.versions);
size += CollectionSerializers.serializedListSize(response.data, ByteBufferUtil.byteBufferSerializer);
return size;
}
};
public static final IVersionedAsymmetricSerializer<TrackedDataResponse, TrackedDataResponse> embedded =
EmbeddedAsymmetricVersionedSerializer.mtEmbedded(serializer);
@Override
public ReadKind kind()
{

View File

@ -54,7 +54,9 @@ import org.apache.cassandra.exceptions.ReadTimeoutException;
import org.apache.cassandra.exceptions.RequestFailureReason;
import org.apache.cassandra.exceptions.UnavailableException;
import org.apache.cassandra.gms.FailureDetector;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.EmbeddedAsymmetricVersionedSerializer;
import org.apache.cassandra.io.IVersionedAsymmetricSerializer;
import org.apache.cassandra.io.UnversionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.locator.Endpoints;
@ -71,12 +73,15 @@ import org.apache.cassandra.net.MessagingService;
import org.apache.cassandra.net.RequestCallback;
import org.apache.cassandra.net.Verb;
import org.apache.cassandra.replication.MutationTrackingService;
import org.apache.cassandra.replication.Version;
import org.apache.cassandra.replication.VersionedSerializer;
import org.apache.cassandra.schema.TableMetadata;
import org.apache.cassandra.service.reads.ReadCoordinator;
import org.apache.cassandra.service.reads.SpeculativeRetryPolicy;
import org.apache.cassandra.tcm.ClusterMetadata;
import org.apache.cassandra.transport.Dispatcher;
import org.apache.cassandra.transport.Dispatcher.RequestTime;
import org.apache.cassandra.utils.ArraySerializers;
import org.apache.cassandra.utils.Clock;
import org.apache.cassandra.utils.FBUtilities;
import org.apache.cassandra.utils.concurrent.AsyncPromise;
@ -87,6 +92,7 @@ import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
import static java.util.concurrent.TimeUnit.NANOSECONDS;
import static org.apache.cassandra.db.ReadKind.TRACKED_DATA;
import static org.apache.cassandra.db.ReadKind.TRACKED_SUMMARY;
import static org.apache.cassandra.db.TypeSizes.sizeofUnsignedVInt;
import static org.apache.cassandra.metrics.ClientRequestsMetricsHolder.readMetrics;
public abstract class TrackedRead<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>> implements RequestCallback<TrackedDataResponse>
@ -127,17 +133,17 @@ public abstract class TrackedRead<E extends Endpoints<E>, P extends ReplicaPlan.
return "Id{" + node + ':' + hlc + '}';
}
public static final IVersionedSerializer<Id> serializer = new IVersionedSerializer<>()
public static final UnversionedSerializer<Id> serializer = new UnversionedSerializer<>()
{
@Override
public void serialize(Id id, DataOutputPlus out, int version) throws IOException
public void serialize(Id id, DataOutputPlus out) throws IOException
{
out.writeInt(id.node);
out.writeLong(id.hlc);
}
@Override
public Id deserialize(DataInputPlus in, int version) throws IOException
public Id deserialize(DataInputPlus in) throws IOException
{
int node = in.readInt();
long hlc = in.readLong();
@ -145,7 +151,7 @@ public abstract class TrackedRead<E extends Endpoints<E>, P extends ReplicaPlan.
}
@Override
public long serializedSize(Id id, int version)
public long serializedSize(Id id)
{
return TypeSizes.sizeof(id.node) + TypeSizes.sizeof(id.hlc);
}
@ -241,7 +247,7 @@ public abstract class TrackedRead<E extends Endpoints<E>, P extends ReplicaPlan.
@Override
protected Verb verb()
{
return Verb.TRACKED_PARTITION_READ_REQ;
return Verb.MT_PARTITION_READ_REQ;
}
}
@ -261,7 +267,7 @@ public abstract class TrackedRead<E extends Endpoints<E>, P extends ReplicaPlan.
@Override
protected Verb verb()
{
return Verb.TRACKED_RANGE_READ_REQ;
return Verb.MT_RANGE_READ_REQ;
}
}
@ -340,7 +346,7 @@ public abstract class TrackedRead<E extends Endpoints<E>, P extends ReplicaPlan.
return;
SummaryRequest summaryRequest = new SummaryRequest(readId, command, dataNode, summaryNodes);
Message<SummaryRequest> summaryMessage = Message.outWithRequestTime(Verb.TRACKED_SUMMARY_REQ, summaryRequest, requestTime);
Message<SummaryRequest> summaryMessage = Message.outWithRequestTime(Verb.MT_SUMMARY_REQ, summaryRequest, requestTime);
for (Replica replica : summaryReplicas)
{
if (localReplica == replica)
@ -519,45 +525,44 @@ public abstract class TrackedRead<E extends Endpoints<E>, P extends ReplicaPlan.
.beginRead(readId, metadata, command, consistencyLevel, summaryNodes, requestTime, TrackedLocalReads.Completer.DEFAULT);
}
public static final IVersionedSerializer<DataRequest> serializer = new IVersionedSerializer<>()
private static final VersionedSerializer<DataRequest> serializer = new VersionedSerializer<>()
{
@Override
public void serialize(DataRequest request, DataOutputPlus out, int version) throws IOException
public void serialize(DataRequest request, DataOutputPlus out, Version version) throws IOException
{
Id.serializer.serialize(request.readId, out, version);
ReadCommand.serializer.serialize(request.command, out, version);
out.writeInt(request.dataNode);
out.writeInt(request.summaryNodes.length);
for (int hostid : request.summaryNodes)
out.writeInt(hostid);
out.writeInt(request.consistencyLevel.code);
Id.serializer.serialize(request.readId, out);
ReadCommand.serializer.serialize(request.command, out, version.messagingVersion());
out.writeUnsignedVInt32(request.dataNode);
ArraySerializers.serializeVIntArray(request.summaryNodes, out);
out.writeUnsignedVInt32(request.consistencyLevel.code);
}
@Override
public DataRequest deserialize(DataInputPlus in, int version) throws IOException
public DataRequest deserialize(DataInputPlus in, Version version) throws IOException
{
Id readId = Id.serializer.deserialize(in, version);
ReadCommand command = ReadCommand.serializer.deserialize(in, version);
int dataNode = in.readInt();
int[] summaryNodes = new int[in.readInt()];
for (int i = 0; i < summaryNodes.length; i++)
summaryNodes[i] = in.readInt();
ConsistencyLevel consistencyLevel = ConsistencyLevel.fromCode(in.readInt());
Id readId = Id.serializer.deserialize(in);
ReadCommand command = ReadCommand.serializer.deserialize(in, version.messagingVersion());
int dataNode = in.readUnsignedVInt32();
int[] summaryNodes = ArraySerializers.deserializeVIntArray(in);
ConsistencyLevel consistencyLevel = ConsistencyLevel.fromCode(in.readUnsignedVInt32());
return new DataRequest(readId, command, dataNode, summaryNodes, consistencyLevel);
}
@Override
public long serializedSize(DataRequest request, int version)
public long serializedSize(DataRequest request, Version version)
{
return Id.serializer.serializedSize(request.readId, version) +
ReadCommand.serializer.serializedSize(request.command, version) +
TypeSizes.sizeof(request.dataNode) +
TypeSizes.sizeof(request.summaryNodes.length) +
((long) TypeSizes.INT_SIZE * request.summaryNodes.length) +
TypeSizes.sizeof(request.consistencyLevel.code);
long size = Id.serializer.serializedSize(request.readId);
size += ReadCommand.serializer.serializedSize(request.command, version.messagingVersion());
size += sizeofUnsignedVInt(request.dataNode);
size += ArraySerializers.serializedVIntArraySize(request.summaryNodes);
size += sizeofUnsignedVInt(request.consistencyLevel.code);
return size;
}
};
public static final IVersionedAsymmetricSerializer<DataRequest, DataRequest> embedded =
EmbeddedAsymmetricVersionedSerializer.mtEmbedded(serializer);
@Override
public ReadKind kind()
{
@ -585,42 +590,41 @@ public abstract class TrackedRead<E extends Endpoints<E>, P extends ReplicaPlan.
return ImmediateFuture.success(null);
}
public static final IVersionedSerializer<SummaryRequest> serializer = new IVersionedSerializer<>()
private static final VersionedSerializer<SummaryRequest> serializer = new VersionedSerializer<>()
{
@Override
public void serialize(SummaryRequest request, DataOutputPlus out, int version) throws IOException
public void serialize(SummaryRequest request, DataOutputPlus out, Version version) throws IOException
{
Id.serializer.serialize(request.readId, out, version);
ReadCommand.serializer.serialize(request.command, out, version);
out.writeInt(request.dataNode);
out.writeInt(request.summaryNodes.length);
for (int hostid : request.summaryNodes)
out.writeInt(hostid);
Id.serializer.serialize(request.readId, out);
ReadCommand.serializer.serialize(request.command, out, version.messagingVersion());
out.writeUnsignedVInt32(request.dataNode);
ArraySerializers.serializeVIntArray(request.summaryNodes, out);
}
@Override
public SummaryRequest deserialize(DataInputPlus in, int version) throws IOException
public SummaryRequest deserialize(DataInputPlus in, Version version) throws IOException
{
Id readId = Id.serializer.deserialize(in, version);
ReadCommand command = ReadCommand.serializer.deserialize(in, version);
int dataNode = in.readInt();
int[] summaryNodes = new int[in.readInt()];
for (int i = 0; i < summaryNodes.length; i++)
summaryNodes[i] = in.readInt();
Id readId = Id.serializer.deserialize(in);
ReadCommand command = ReadCommand.serializer.deserialize(in, version.messagingVersion());
int dataNode = in.readUnsignedVInt32();
int[] summaryNodes = ArraySerializers.deserializeVIntArray(in);
return new SummaryRequest(readId, command, dataNode, summaryNodes);
}
@Override
public long serializedSize(SummaryRequest request, int version)
public long serializedSize(SummaryRequest request, Version version)
{
return Id.serializer.serializedSize(request.readId, version) +
ReadCommand.serializer.serializedSize(request.command, version) +
TypeSizes.sizeof(request.dataNode) +
TypeSizes.sizeof(request.summaryNodes.length) +
((long) TypeSizes.INT_SIZE * request.summaryNodes.length);
long size = Id.serializer.serializedSize(request.readId);
size += ReadCommand.serializer.serializedSize(request.command, version.messagingVersion());
size += sizeofUnsignedVInt(request.dataNode);
size += ArraySerializers.serializedVIntArraySize(request.summaryNodes);
return size;
}
};
public static final IVersionedAsymmetricSerializer<SummaryRequest, SummaryRequest> embedded =
EmbeddedAsymmetricVersionedSerializer.mtEmbedded(serializer);
@Override
public ReadKind kind()
{

View File

@ -24,15 +24,18 @@ import org.slf4j.LoggerFactory;
import org.apache.cassandra.db.IReadResponse;
import org.apache.cassandra.db.ReadKind;
import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.EmbeddedAsymmetricVersionedSerializer;
import org.apache.cassandra.io.IVersionedAsymmetricSerializer;
import org.apache.cassandra.io.UnversionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.net.IVerbHandler;
import org.apache.cassandra.replication.MutationSummary;
import org.apache.cassandra.replication.MutationTrackingService;
import org.apache.cassandra.utils.ArraySerializers;
import static org.apache.cassandra.db.ReadKind.TRACKED_SUMMARY;
import static org.apache.cassandra.db.TypeSizes.sizeofUnsignedVInt;
public class TrackedSummaryResponse implements IReadResponse
{
@ -60,42 +63,41 @@ public class TrackedSummaryResponse implements IReadResponse
ReadReconciliations.instance.acceptRemoteSummary(message.from(), message.payload);
};
public static final IVersionedSerializer<TrackedSummaryResponse> serializer = new IVersionedSerializer<>()
public static final UnversionedSerializer<TrackedSummaryResponse> serializer = new UnversionedSerializer<>()
{
@Override
public void serialize(TrackedSummaryResponse summary, DataOutputPlus out, int version) throws IOException
public void serialize(TrackedSummaryResponse summary, DataOutputPlus out) throws IOException
{
TrackedRead.Id.serializer.serialize(summary.readId, out, version);
MutationSummary.serializer.serialize(summary.summary, out, version);
out.writeInt(summary.dataNode);
out.writeInt(summary.summaryNodes.length);
for (int hostid : summary.summaryNodes)
out.writeInt(hostid);
TrackedRead.Id.serializer.serialize(summary.readId, out);
MutationSummary.serializer.serialize(summary.summary, out);
out.writeUnsignedVInt32(summary.dataNode);
ArraySerializers.serializeVIntArray(summary.summaryNodes, out);
}
@Override
public TrackedSummaryResponse deserialize(DataInputPlus in, int version) throws IOException
public TrackedSummaryResponse deserialize(DataInputPlus in) throws IOException
{
TrackedRead.Id id = TrackedRead.Id.serializer.deserialize(in, version);
MutationSummary summary = MutationSummary.serializer.deserialize(in, version);
int dataNode = in.readInt();
int[] summaryNodes = new int[in.readInt()];
for (int i = 0; i < summaryNodes.length; i++)
summaryNodes[i] = in.readInt();
TrackedRead.Id id = TrackedRead.Id.serializer.deserialize(in);
MutationSummary summary = MutationSummary.serializer.deserialize(in);
int dataNode = in.readUnsignedVInt32();
int[] summaryNodes = ArraySerializers.deserializeVIntArray(in);
return new TrackedSummaryResponse(id, summary, dataNode, summaryNodes);
}
@Override
public long serializedSize(TrackedSummaryResponse summary, int version)
public long serializedSize(TrackedSummaryResponse summary)
{
return TrackedRead.Id.serializer.serializedSize(summary.readId, version) +
MutationSummary.serializer.serializedSize(summary.summary, version) +
TypeSizes.sizeof(summary.dataNode) +
TypeSizes.sizeof(summary.summaryNodes.length) +
TypeSizes.INT_SIZE * (long) summary.summaryNodes.length;
long size = TrackedRead.Id.serializer.serializedSize(summary.readId);
size += MutationSummary.serializer.serializedSize(summary.summary);
size += sizeofUnsignedVInt(summary.dataNode);
size += ArraySerializers.serializedVIntArraySize(summary.summaryNodes);
return size;
}
};
public static final IVersionedAsymmetricSerializer<TrackedSummaryResponse, TrackedSummaryResponse> embedded =
EmbeddedAsymmetricVersionedSerializer.mtEmbedded(serializer);
@Override
public ReadKind kind()
{

View File

@ -22,11 +22,12 @@ import java.io.IOException;
import java.util.Objects;
import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.locator.InetAddressAndPort;
import org.apache.cassandra.replication.ReconciledLogSnapshot;
import org.apache.cassandra.replication.Version;
import org.apache.cassandra.replication.VersionedSerializer;
import org.apache.cassandra.utils.TimeUUID;
import static org.apache.cassandra.locator.InetAddressAndPort.Serializer.inetAddressAndPortSerializer;
@ -58,41 +59,42 @@ public class LogStreamHeader
this.sendByFollower = sendByFollower;
}
public static class Serializer implements IVersionedSerializer<LogStreamHeader>
public static final VersionedSerializer<LogStreamHeader> serializer = new VersionedSerializer<>()
{
public void serialize(LogStreamHeader header, DataOutputPlus out, int version) throws IOException
@Override
public void serialize(LogStreamHeader header, DataOutputPlus out, Version version) throws IOException
{
LogStreamManifest.serializer.serialize(header.manifest, out, version);
ReconciledLogSnapshot.serializer.serialize(header.reconciled, out, version);
inetAddressAndPortSerializer.serialize(header.sender, out, version);
inetAddressAndPortSerializer.serialize(header.sender, out, version.messagingVersion());
header.planId.serialize(out);
out.writeInt(header.sessionIndex);
out.writeBoolean(header.sendByFollower);
}
public LogStreamHeader deserialize(DataInputPlus in, int version) throws IOException
@Override
public LogStreamHeader deserialize(DataInputPlus in, Version version) throws IOException
{
LogStreamManifest manifest = LogStreamManifest.serializer.deserialize(in, version);
ReconciledLogSnapshot reconciled = ReconciledLogSnapshot.serializer.deserialize(in, version);
InetAddressAndPort sender = inetAddressAndPortSerializer.deserialize(in, version);
InetAddressAndPort sender = inetAddressAndPortSerializer.deserialize(in, version.messagingVersion());
TimeUUID planId = TimeUUID.deserialize(in);
int sessionIndex = in.readInt();
boolean sendByFollower = in.readBoolean();
return new LogStreamHeader(manifest, reconciled, sender, planId, sessionIndex, sendByFollower);
}
public long serializedSize(LogStreamHeader header, int version)
@Override
public long serializedSize(LogStreamHeader header, Version version)
{
return LogStreamManifest.serializer.serializedSize(header.manifest, version)
+ ReconciledLogSnapshot.serializer.serializedSize(header.reconciled, version)
+ inetAddressAndPortSerializer.serializedSize(header.sender, version)
+ inetAddressAndPortSerializer.serializedSize(header.sender, version.messagingVersion())
+ TimeUUID.sizeInBytes()
+ TypeSizes.sizeof(header.sessionIndex)
+ TypeSizes.sizeof(header.sendByFollower);
}
}
public static final Serializer serializer = new Serializer();
};
@Override
public boolean equals(Object o)

View File

@ -26,12 +26,15 @@ import java.util.Set;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.dht.Range;
import org.apache.cassandra.dht.Token;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.EmbeddedAsymmetricVersionedSerializer;
import org.apache.cassandra.io.IVersionedAsymmetricSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
import org.apache.cassandra.replication.Version;
import org.apache.cassandra.replication.VersionedSerializer;
import org.apache.cassandra.utils.StringSerializer;
import static org.apache.cassandra.utils.CollectionSerializers.deserializeCollectionToConsumer;
import static org.apache.cassandra.utils.CollectionSerializers.deserializeMapToConsumer;
@ -56,62 +59,44 @@ public class LogStreamManifest
return new LogStreamManifest(builder.build());
}
public static class Serializer
public static class Serializer implements VersionedSerializer<LogStreamManifest>
{
private static final IVersionedSerializer<String> strSerializer = new IVersionedSerializer<>()
private static final VersionedSerializer<Range<Token>> rangeSerializer = new VersionedSerializer<>()
{
@Override
public void serialize(String str, DataOutputPlus out, int version) throws IOException
public void serialize(Range<Token> range, DataOutputPlus out, Version version) throws IOException
{
out.writeUTF(str);
Token.serializer.serialize(range.left, out, version.messagingVersion());
Token.serializer.serialize(range.right, out, version.messagingVersion());
}
@Override
public String deserialize(DataInputPlus in, int version) throws IOException
public Range<Token> deserialize(DataInputPlus in, Version version) throws IOException
{
return in.readUTF();
return new Range<>(
Token.serializer.deserialize(in, version.messagingVersion()),
Token.serializer.deserialize(in, version.messagingVersion())
);
}
@Override
public long serializedSize(String str, int version)
public long serializedSize(Range<Token> range, Version version)
{
return TypeSizes.sizeof(str);
return Token.serializer.serializedSize(range.left, version.messagingVersion())
+ Token.serializer.serializedSize(range.right, version.messagingVersion());
}
};
private static final IVersionedSerializer<Range<Token>> rangeSerializer = new IVersionedSerializer<Range<Token>>()
private static final VersionedSerializer<ImmutableSet<Range<Token>>> rangeSetSerializer = new VersionedSerializer<>()
{
@Override
public void serialize(Range<Token> range, DataOutputPlus out, int version) throws IOException
{
Token.serializer.serialize(range.left, out, version);
Token.serializer.serialize(range.right, out, version);
}
@Override
public Range<Token> deserialize(DataInputPlus in, int version) throws IOException
{
return new Range<>(Token.serializer.deserialize(in, version), Token.serializer.deserialize(in, version));
}
@Override
public long serializedSize(Range<Token> range, int version)
{
return Token.serializer.serializedSize(range.left, version)
+ Token.serializer.serializedSize(range.right, version);
}
};
private static final IVersionedSerializer<ImmutableSet<Range<Token>>> rangeSetSerializer = new IVersionedSerializer<>()
{
@Override
public void serialize(ImmutableSet<Range<Token>> t, DataOutputPlus out, int version) throws IOException
public void serialize(ImmutableSet<Range<Token>> t, DataOutputPlus out, Version version) throws IOException
{
serializeCollection(t, out, version, rangeSerializer);
}
@Override
public ImmutableSet<Range<Token>> deserialize(DataInputPlus in, int version) throws IOException
public ImmutableSet<Range<Token>> deserialize(DataInputPlus in, Version version) throws IOException
{
ImmutableSet.Builder<Range<Token>> builder = ImmutableSet.builder();
deserializeCollectionToConsumer(in, version, rangeSerializer, builder::add);
@ -119,32 +104,36 @@ public class LogStreamManifest
}
@Override
public long serializedSize(ImmutableSet<Range<Token>> t, int version)
public long serializedSize(ImmutableSet<Range<Token>> t, Version version)
{
return serializedCollectionSize(t, version, rangeSerializer);
}
};
public void serialize(LogStreamManifest header, DataOutputPlus out, int version) throws IOException
@Override
public void serialize(LogStreamManifest header, DataOutputPlus out, Version version) throws IOException
{
serializeMap(header.keyspaceRanges, out, version, strSerializer, rangeSetSerializer);
serializeMap(header.keyspaceRanges, out, version, StringSerializer.instance, rangeSetSerializer);
}
public LogStreamManifest deserialize(DataInputPlus in, int version) throws IOException
@Override
public LogStreamManifest deserialize(DataInputPlus in, Version version) throws IOException
{
ImmutableMap.Builder<String, ImmutableSet<Range<Token>>> builder = ImmutableMap.builder();
deserializeMapToConsumer(in, version, strSerializer, rangeSetSerializer, builder::put);
deserializeMapToConsumer(in, version, StringSerializer.instance, rangeSetSerializer, builder::put);
return new LogStreamManifest(builder.build());
}
public long serializedSize(LogStreamManifest header, int version)
@Override
public long serializedSize(LogStreamManifest header, Version version)
{
return serializedMapSize(header.keyspaceRanges, version, strSerializer, rangeSetSerializer);
return serializedMapSize(header.keyspaceRanges, version, StringSerializer.instance, rangeSetSerializer);
}
}
public static final Serializer serializer = new Serializer();
public static final IVersionedAsymmetricSerializer<LogStreamManifest, LogStreamManifest> embedded =
EmbeddedAsymmetricVersionedSerializer.mtEmbedded(serializer);
@Override
public boolean equals(Object o)

View File

@ -26,6 +26,7 @@ import org.slf4j.LoggerFactory;
import org.apache.cassandra.db.Mutation;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.replication.MutationTrackingService;
import org.apache.cassandra.replication.Version;
import org.apache.cassandra.streaming.LogStreamHeader;
import org.apache.cassandra.streaming.StreamManager;
import org.apache.cassandra.streaming.StreamReceiveException;
@ -63,9 +64,12 @@ public class IncomingMutationLogStreamMessage extends MutationLogStreamMessage
public static class IncomingMutationLogStreamMessageSerializer implements StreamMessage.Serializer<IncomingMutationLogStreamMessage>
{
public IncomingMutationLogStreamMessage deserialize(DataInputPlus in, int version) throws IOException
@Override
public IncomingMutationLogStreamMessage deserialize(DataInputPlus in, int messagingVersion) throws IOException
{
Version version = Version.serializer.deserialize(in);
LogStreamHeader header = LogStreamHeader.serializer.deserialize(in, version);
StreamSession session = StreamManager.instance.findSession(header.sender, header.planId, header.sessionIndex, header.sendByFollower);
if (session == null)
throw new IllegalStateException(String.format("unknown stream session: %s - %d", header.planId, header.sessionIndex));
@ -100,11 +104,13 @@ public class IncomingMutationLogStreamMessage extends MutationLogStreamMessage
}
}
@Override
public void serialize(IncomingMutationLogStreamMessage message, StreamingDataOutputPlus out, int version, StreamSession session)
{
throw new UnsupportedOperationException("Not allowed to call serialize on an incoming stream");
}
@Override
public long serializedSize(IncomingMutationLogStreamMessage message, int version)
{
throw new UnsupportedOperationException("Not allowed to call serializedSize on an incoming stream");

View File

@ -17,24 +17,34 @@
*/
package org.apache.cassandra.streaming.messages;
import java.io.IOException;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.replication.Version;
import org.apache.cassandra.streaming.StreamSession;
import org.apache.cassandra.streaming.StreamingDataOutputPlus;
public class MutationLogReceivedMessage extends StreamMessage
{
public static Serializer<MutationLogReceivedMessage> serializer = new Serializer<MutationLogReceivedMessage>()
public static Serializer<MutationLogReceivedMessage> serializer = new Serializer<>()
{
public MutationLogReceivedMessage deserialize(DataInputPlus in, int version)
@Override
public MutationLogReceivedMessage deserialize(DataInputPlus in, int version) throws IOException
{
Version ignore = Version.serializer.deserialize(in);
return new MutationLogReceivedMessage();
}
public void serialize(MutationLogReceivedMessage message, StreamingDataOutputPlus out, int version, StreamSession session) {}
@Override
public void serialize(MutationLogReceivedMessage message, StreamingDataOutputPlus out, int version, StreamSession session) throws IOException
{
Version.serializer.serialize(Version.CLUSTER_SAFE_VERSION, out);
}
@Override
public long serializedSize(MutationLogReceivedMessage message, int version)
{
return 0;
return Version.serializer.serializedSize(Version.CLUSTER_SAFE_VERSION);
}
};

View File

@ -31,6 +31,7 @@ import org.apache.cassandra.dht.Token;
import org.apache.cassandra.io.util.DataInputBuffer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.replication.MutationJournal;
import org.apache.cassandra.replication.Version;
import org.apache.cassandra.schema.TableMetadata;
import org.apache.cassandra.streaming.LogStreamHeader;
import org.apache.cassandra.streaming.StreamSession;
@ -54,7 +55,8 @@ public class OutgoingMutationLogStreamMessage extends MutationLogStreamMessage
public void serialize(StreamingDataOutputPlus out, int version, StreamSession session) throws IOException
{
LogStreamHeader.serializer.serialize(header, out, version);
Version.serializer.serialize(Version.CLUSTER_SAFE_VERSION, out);
LogStreamHeader.serializer.serialize(header, out, Version.CLUSTER_SAFE_VERSION);
try
{
@ -118,16 +120,19 @@ public class OutgoingMutationLogStreamMessage extends MutationLogStreamMessage
public static class OutgoingMutationLogStreamMessageSerializer implements StreamMessage.Serializer<OutgoingMutationLogStreamMessage>
{
@Override
public OutgoingMutationLogStreamMessage deserialize(DataInputPlus in, int version)
{
throw new UnsupportedOperationException("Not allowed to call deserialize on an outgoing stream");
}
@Override
public void serialize(OutgoingMutationLogStreamMessage message, StreamingDataOutputPlus out, int version, StreamSession session) throws IOException
{
message.serialize(out, version, session);
}
@Override
public long serializedSize(OutgoingMutationLogStreamMessage message, int version)
{
return message.serializedSize(version);

View File

@ -43,7 +43,7 @@ public class PrepareSynAckMessage extends StreamMessage
{
out.writeBoolean(message.logSummary != null);
if (message.logSummary != null)
LogStreamManifest.serializer.serialize(message.logSummary, out, version);
LogStreamManifest.embedded.serialize(message.logSummary, out, version);
}
}
@ -57,7 +57,7 @@ public class PrepareSynAckMessage extends StreamMessage
if (version >= MessagingService.VERSION_61)
{
if (input.readBoolean())
message.logSummary = LogStreamManifest.serializer.deserialize(input, version);
message.logSummary = LogStreamManifest.embedded.deserialize(input, version);
}
return message;
}
@ -72,7 +72,7 @@ public class PrepareSynAckMessage extends StreamMessage
{
size += 1; // boolean for logSummary presence
if (message.logSummary != null)
size += LogStreamManifest.serializer.serializedSize(message.logSummary, version);
size += LogStreamManifest.embedded.serializedSize(message.logSummary, version);
}
return size;
}

View File

@ -48,10 +48,10 @@ public class PrepareSynMessage extends StreamMessage
if (version >= MessagingService.VERSION_61)
{
if (input.readBoolean())
message.logRequest = LogStreamManifest.serializer.deserialize(input, version);
message.logRequest = LogStreamManifest.embedded.deserialize(input, version);
if (input.readBoolean())
message.logSummary = LogStreamManifest.serializer.deserialize(input, version);
message.logSummary = LogStreamManifest.embedded.deserialize(input, version);
}
return message;
@ -69,10 +69,10 @@ public class PrepareSynMessage extends StreamMessage
{
size += 1; // boolean for logRequest presence
if (message.logRequest != null)
size += LogStreamManifest.serializer.serializedSize(message.logRequest, version);
size += LogStreamManifest.embedded.serializedSize(message.logRequest, version);
size += 1; // boolean for logSummary presence
if (message.logSummary != null)
size += LogStreamManifest.serializer.serializedSize(message.logSummary, version);
size += LogStreamManifest.embedded.serializedSize(message.logSummary, version);
}
return size;
}
@ -92,10 +92,10 @@ public class PrepareSynMessage extends StreamMessage
{
out.writeBoolean(message.logRequest != null);
if (message.logRequest != null)
LogStreamManifest.serializer.serialize(message.logRequest, out, version);
LogStreamManifest.embedded.serialize(message.logRequest, out, version);
out.writeBoolean(message.logSummary != null);
if (message.logSummary != null)
LogStreamManifest.serializer.serialize(message.logSummary, out, version);
LogStreamManifest.embedded.serialize(message.logSummary, out, version);
}
}
};

View File

@ -123,7 +123,7 @@ public class StreamMessageHeader
{
header.pendingRepair.serialize(out);
}
ImmutableCoordinatorLogOffsets.serializer.serialize(header.coordinatorLogOffsets, out, version);
ImmutableCoordinatorLogOffsets.embedded.serialize(header.coordinatorLogOffsets, out, version);
}
public StreamMessageHeader deserialize(DataInputPlus in, int version) throws IOException
@ -136,7 +136,7 @@ public class StreamMessageHeader
int sequenceNumber = in.readInt();
long repairedAt = in.readLong();
TimeUUID pendingRepair = in.readBoolean() ? TimeUUID.deserialize(in) : null;
ImmutableCoordinatorLogOffsets coordinatorLogOffsets = ImmutableCoordinatorLogOffsets.serializer.deserialize(in, version);
ImmutableCoordinatorLogOffsets coordinatorLogOffsets = ImmutableCoordinatorLogOffsets.embedded.deserialize(in, version);
return new StreamMessageHeader(tableId, sender, planId, sendByFollower, sessionIndex, sequenceNumber, repairedAt, pendingRepair, coordinatorLogOffsets);
}
@ -152,7 +152,7 @@ public class StreamMessageHeader
size += TypeSizes.sizeof(header.repairedAt);
size += TypeSizes.sizeof(header.pendingRepair != null);
size += header.pendingRepair != null ? TimeUUID.sizeInBytes() : 0;
size += ImmutableCoordinatorLogOffsets.serializer.serializedSize(header.coordinatorLogOffsets, version);
size += ImmutableCoordinatorLogOffsets.embedded.serializedSize(header.coordinatorLogOffsets, version);
return size;
}

View File

@ -113,14 +113,14 @@ public class AdvanceMutationTrackingMigration implements Transformation
LockedRanges.AffectedRanges.EMPTY);
}
static class Serializer implements AsymmetricMetadataSerializer<Transformation, AdvanceMutationTrackingMigration>
public static class Serializer implements AsymmetricMetadataSerializer<Transformation, AdvanceMutationTrackingMigration>
{
@Override
public void serialize(Transformation t, DataOutputPlus out, Version version) throws IOException
{
AdvanceMutationTrackingMigration v = (AdvanceMutationTrackingMigration) t;
out.writeUTF(v.keyspace);
TableId.serializer.serialize(v.tableId, out, version.asInt());
v.tableId.serializeCompact(out);
serializeCollection(v.repairedRanges, out, version, Range.serializer);
}
@ -128,7 +128,7 @@ public class AdvanceMutationTrackingMigration implements Transformation
public AdvanceMutationTrackingMigration deserialize(DataInputPlus in, Version version) throws IOException
{
String keyspace = in.readUTF();
TableId tableId = TableId.serializer.deserialize(in, version.asInt());
TableId tableId = TableId.deserializeCompact(in);
Collection<Range<Token>> repairedRanges = deserializeList(in, version, Range.serializer);
return new AdvanceMutationTrackingMigration(keyspace, tableId, repairedRanges);
}
@ -138,7 +138,7 @@ public class AdvanceMutationTrackingMigration implements Transformation
{
AdvanceMutationTrackingMigration v = (AdvanceMutationTrackingMigration) t;
return TypeSizes.sizeof(v.keyspace)
+ TableId.serializer.serializedSize(v.tableId, version.asInt())
+ v.tableId.serializedCompactSize()
+ serializedCollectionSize(v.repairedRanges, version, Range.serializer);
}
}

View File

@ -33,6 +33,13 @@ import static org.apache.cassandra.db.TypeSizes.sizeofUnsignedVInt;
public class ArraySerializers
{
public static void serializeVIntArray(int[] items, DataOutputPlus out) throws IOException
{
out.writeUnsignedVInt32(items.length);
for (int i = 0; i < items.length; i++)
out.writeUnsignedVInt32(items[i]);
}
public static <T> void serializeArray(T[] items, DataOutputPlus out, UnversionedSerializer<T> serializer) throws IOException
{
out.writeUnsignedVInt32(items.length);
@ -68,6 +75,15 @@ public class ArraySerializers
serializer.serialize(item, p, out);
}
public static int[] deserializeVIntArray(DataInputPlus in) throws IOException
{
int length = in.readUnsignedVInt32();
int[] array = new int[length];
for (int i = 0; i < length; i++)
array[i] = in.readUnsignedVInt32();
return array;
}
public static <T> T[] deserializeArray(DataInputPlus in, UnversionedSerializer<T> serializer, IntFunction<T[]> arrayFactory) throws IOException
{
int size = in.readUnsignedVInt32();
@ -142,6 +158,14 @@ public class ArraySerializers
serializer.skip(p, in);
}
public static long serializedVIntArraySize(int[] array)
{
long size = sizeofUnsignedVInt(array.length);
for (int i : array)
size += sizeofUnsignedVInt(i);
return size;
}
public static <T> long serializedArraySize(T[] array, UnversionedSerializer<T> serializer)
{
long size = sizeofUnsignedVInt(array.length);

View File

@ -55,30 +55,6 @@ import static org.apache.cassandra.db.TypeSizes.sizeofUnsignedVInt;
public class CollectionSerializers
{
/**
* A simple UTF-8 string serializer for use with collection serialization methods.
*/
public static final IVersionedSerializer<String> STRING_SERIALIZER = new IVersionedSerializer<>()
{
@Override
public void serialize(String str, DataOutputPlus out, int version) throws IOException
{
out.writeUTF(str);
}
@Override
public String deserialize(DataInputPlus in, int version) throws IOException
{
return in.readUTF();
}
@Override
public long serializedSize(String str, int version)
{
return org.apache.cassandra.db.TypeSizes.sizeof(str);
}
};
public static final UnversionedSerializer<Set<Integer>> intSetSerializer = newSetSerializer(Int32Serializer.serializer);
public static final UnversionedSerializer<Set<Integer>> nullableIntSetSerializer = NullableSerializer.wrap(intSetSerializer);
@ -199,6 +175,16 @@ public class CollectionSerializers
}
}
public static <K, V, Version> void serializeMap(Map<K, V> map, DataOutputPlus out, Version version, UnversionedSerializer<K> keySerializer, VersionedSerializer<V, Version> valueSerializer) throws IOException
{
out.writeUnsignedVInt32(map.size());
for (Map.Entry<K, V> e : map.entrySet())
{
keySerializer.serialize(e.getKey(), out);
valueSerializer.serialize(e.getValue(), out, version);
}
}
public static <K, V> void serializeMap(Map<K, V> map, DataOutputPlus out, int version, IVersionedSerializer<K> keySerializer, IPartitionerDependentSerializer<V> valueSerializer) throws IOException
{
out.writeUnsignedVInt32(map.size());
@ -311,12 +297,12 @@ public class CollectionSerializers
return result;
}
public static <K, V> void deserializeMapToConsumer(DataInputPlus in, int version, IVersionedSerializer<K> keySerializer, IVersionedSerializer<V> valueSerializer, BiConsumer<K, V> consumer) throws IOException
public static <K, V, Version> void deserializeMapToConsumer(DataInputPlus in, Version version, UnversionedSerializer<K> keySerializer, VersionedSerializer<V, Version> valueSerializer, BiConsumer<K, V> consumer) throws IOException
{
int size = in.readUnsignedVInt32();
while (size-- > 0)
{
K key = keySerializer.deserialize(in, version);
K key = keySerializer.deserialize(in);
V value = valueSerializer.deserialize(in, version);
consumer.accept(key, value);
}
@ -335,6 +321,19 @@ public class CollectionSerializers
return result;
}
public static <K, V, Version, M extends Map<K, V>> M deserializeMap(DataInputPlus in, Version version, UnversionedSerializer<K> keySerializer, VersionedSerializer<V, Version> valueSerializer, IntFunction<M> factory) throws IOException
{
int size = in.readUnsignedVInt32();
M result = factory.apply(size);
while (size-- > 0)
{
K key = keySerializer.deserialize(in);
V value = valueSerializer.deserialize(in, version);
result.put(key, value);
}
return result;
}
public static <K, V> Map<K,V> deserializeMap(DataInputPlus in, IPartitioner partitioner, int version, IVersionedSerializer<K> keySerializer, IPartitionerDependentSerializer<V> valueSerializer, IntFunction<Map<K,V>> factory) throws IOException
{
int size = in.readUnsignedVInt32();
@ -522,6 +521,15 @@ public class CollectionSerializers
return size;
}
public static <K, V, Version> long serializedMapSize(Map<K, V> map, Version version, UnversionedSerializer<K> keySerializer, VersionedSerializer<V, Version> valueSerializer)
{
long size = sizeofUnsignedVInt(map.size());
for (Map.Entry<K, V> e : map.entrySet())
size += keySerializer.serializedSize(e.getKey())
+ valueSerializer.serializedSize(e.getValue(), version);
return size;
}
public static <K, V> long serializedMapSize(Map<K, V> map, int version, IVersionedSerializer<K> keySerializer, IPartitionerDependentSerializer<V> valueSerializer)
{
long size = sizeofUnsignedVInt(map.size());
@ -589,6 +597,13 @@ public class CollectionSerializers
consumer.accept(serializer.deserialize(in, version));
}
public static <V, Version> void deserializeCollectionToConsumer(DataInputPlus in, Version version, VersionedSerializer<V, Version> serializer, Consumer<V> consumer) throws IOException
{
int size = in.readUnsignedVInt32();
while (size-- > 0)
consumer.accept(serializer.deserialize(in, version));
}
/*
* Private to push auto-complete to the convenience methods
* Feel free to make public if there is a weird collection you want to use
@ -695,26 +710,26 @@ public class CollectionSerializers
};
}
public static <K, V> IVersionedSerializer<Map<K, V>> newMapSerializer(IVersionedSerializer<K> keySerializer, IVersionedSerializer<V> valueSerializer)
public static <K, V> UnversionedSerializer<Map<K, V>> newMapSerializer(UnversionedSerializer<K> keySerializer, UnversionedSerializer<V> valueSerializer)
{
return new IVersionedSerializer<Map<K, V>>()
return new UnversionedSerializer<>()
{
@Override
public void serialize(Map<K, V> map, DataOutputPlus out, int version) throws IOException
public void serialize(Map<K, V> map, DataOutputPlus out) throws IOException
{
serializeMap(map, out, version, keySerializer, valueSerializer);
serializeMap(map, out, keySerializer, valueSerializer);
}
@Override
public Map<K, V> deserialize(DataInputPlus in, int version) throws IOException
public Map<K, V> deserialize(DataInputPlus in) throws IOException
{
return deserializeMap(in, version, keySerializer, valueSerializer);
return deserializeMap(in, keySerializer, valueSerializer);
}
@Override
public long serializedSize(Map<K, V> map, int version)
public long serializedSize(Map<K, V> map)
{
return serializedMapSize(map, version, keySerializer, valueSerializer);
return serializedMapSize(map, keySerializer, valueSerializer);
}
};
}

View File

@ -15,34 +15,52 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cassandra.utils;
import java.io.IOException;
import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.UnversionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
public class Int64Serializer implements IVersionedSerializer<Long>
public class Int64Serializer implements IVersionedSerializer<Long>, UnversionedSerializer<Long>
{
public static final Int64Serializer serializer = new Int64Serializer();
@Override
public void serialize(Long t, DataOutputPlus out, int version) throws IOException
{
serialize(t, out);
}
@Override
public void serialize(Long t, DataOutputPlus out) throws IOException
{
out.writeLong(t);
}
@Override
public Long deserialize(DataInputPlus in, int version) throws IOException
{
return deserialize(in);
}
@Override
public Long deserialize(DataInputPlus in) throws IOException
{
return in.readLong();
}
@Override
public long serializedSize(Long t, int version)
{
return serializedSize(t);
}
@Override
public long serializedSize(Long t)
{
return TypeSizes.sizeof(t);
}

View File

@ -0,0 +1,70 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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
*
* http://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 org.apache.cassandra.utils;
import java.io.IOException;
import org.apache.cassandra.db.TypeSizes;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.UnversionedSerializer;
import org.apache.cassandra.io.util.DataInputPlus;
import org.apache.cassandra.io.util.DataOutputPlus;
/**
* A simple UTF-8 string serializer for use with (primarily) collection serialization methods.
*/
public final class StringSerializer implements IVersionedSerializer<String>, UnversionedSerializer<String>
{
public static final StringSerializer instance = new StringSerializer();
@Override
public void serialize(String str, DataOutputPlus out, int version) throws IOException
{
serialize(str, out);
}
@Override
public void serialize(String str, DataOutputPlus out) throws IOException
{
out.writeUTF(str);
}
@Override
public String deserialize(DataInputPlus in, int version) throws IOException
{
return deserialize(in);
}
@Override
public String deserialize(DataInputPlus in) throws IOException
{
return in.readUTF();
}
@Override
public long serializedSize(String str, int version)
{
return serializedSize(str);
}
@Override
public long serializedSize(String str)
{
return TypeSizes.sizeof(str);
}
}

View File

@ -365,6 +365,8 @@ public class TimeUUID implements Serializable, Comparable<TimeUUID>
public static class Serializer extends AbstractSerializer<TimeUUID> implements IVersionedSerializer<TimeUUID>, UnversionedSerializer<TimeUUID>
{
public static final Serializer instance = new Serializer();
public static final UnversionedSerializer<TimeUUID> nullable =
NullableSerializer.wrap((UnversionedSerializer<TimeUUID>) instance);
public <V> TimeUUID deserialize(V value, ValueAccessor<V> accessor)
{

View File

@ -77,9 +77,9 @@ import static org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM;
import static org.apache.cassandra.distributed.shared.AssertUtils.assertEquals;
import static org.apache.cassandra.distributed.shared.AssertUtils.assertRows;
import static org.apache.cassandra.distributed.shared.AssertUtils.row;
import static org.apache.cassandra.net.Verb.PULL_MUTATIONS_REQ;
import static org.apache.cassandra.net.Verb.PUSH_MUTATION_REQ;
import static org.apache.cassandra.net.Verb.READ_RECONCILE_ACK;
import static org.apache.cassandra.net.Verb.MT_PULL_MUTATIONS_REQ;
import static org.apache.cassandra.net.Verb.MT_PUSH_MUTATION_REQ;
import static org.apache.cassandra.net.Verb.MT_READ_RECONCILE_ACK;
import static org.apache.cassandra.net.Verb.READ_REPAIR_REQ;
import static org.apache.cassandra.net.Verb.READ_REPAIR_RSP;
import static org.apache.cassandra.net.Verb.READ_REQ;
@ -183,7 +183,7 @@ public abstract class ReadRepairTestBase extends TestBaseImpl
cluster.get(1).executeInternal(withTable("INSERT INTO %s (pk, ck, v) VALUES (1, 1, 1)"));
cluster.get(2).executeInternal(withTable("INSERT INTO %s (pk, ck, v) VALUES (1, 1, 1)"));
assertRows(cluster.get(3).executeInternal(withTable("SELECT * FROM %s WHERE pk = 1")));
cluster.verbs(replicationType().isTracked() ? READ_RECONCILE_ACK : READ_REPAIR_RSP).to(1).drop();
cluster.verbs(replicationType().isTracked() ? MT_READ_RECONCILE_ACK : READ_REPAIR_RSP).to(1).drop();
final long start = currentTimeMillis();
try
{
@ -220,8 +220,8 @@ public abstract class ReadRepairTestBase extends TestBaseImpl
assertRows(cluster.get(3).executeInternal(withTable("SELECT * FROM %s WHERE pk = 1")));
cluster.filters().verbs(READ_REPAIR_REQ.id).to(3).drop();
cluster.filters().verbs(PULL_MUTATIONS_REQ.id).to(3).drop();
cluster.filters().verbs(PUSH_MUTATION_REQ.id).to(3).drop();
cluster.filters().verbs(MT_PULL_MUTATIONS_REQ.id).to(3).drop();
cluster.filters().verbs(MT_PUSH_MUTATION_REQ.id).to(3).drop();
assertRows(cluster.coordinator(1).execute(withTable("SELECT * FROM %s WHERE pk = 1"),
ConsistencyLevel.QUORUM),
row(1, 1, 1));
@ -270,8 +270,8 @@ public abstract class ReadRepairTestBase extends TestBaseImpl
cluster.filters().verbs(READ_REQ.id).from(4).to(3).drop();
if (replicationType().isTracked())
{
cluster.filters().verbs(PULL_MUTATIONS_REQ.id).from(4).to(3).drop();
cluster.filters().verbs(PUSH_MUTATION_REQ.id).from(4).to(3).drop();
cluster.filters().verbs(MT_PULL_MUTATIONS_REQ.id).from(4).to(3).drop();
cluster.filters().verbs(MT_PUSH_MUTATION_REQ.id).from(4).to(3).drop();
}
else
{

View File

@ -852,7 +852,7 @@ public class MutationTrackingRepairTest extends TestBaseImpl
// Drop only offset broadcasts so MT_SYNC_REQ/RSP can succeed but
// reconciliation never completes, triggering mutation_tracking_sync_timeout
CLUSTER.filters().verbs(Verb.BROADCAST_LOG_OFFSETS.id).drop();
CLUSTER.filters().verbs(Verb.MT_BROADCAST_LOG_OFFSETS.id).drop();
List<NodeToolResult> results = repairConcurrently(ALL_NODES, withPR(ksName));
assertAllFailure(results);
@ -884,7 +884,7 @@ public class MutationTrackingRepairTest extends TestBaseImpl
insertData("tbl", 0, 50);
// Block offset broadcasts so the sync coordinator stays alive waiting
IMessageFilters.Filter offsetFilter = CLUSTER.filters().verbs(Verb.BROADCAST_LOG_OFFSETS.id).drop();
IMessageFilters.Filter offsetFilter = CLUSTER.filters().verbs(Verb.MT_BROADCAST_LOG_OFFSETS.id).drop();
// Use a latch to detect when the sync request has been sent, meaning
// the sync coordinator is active and tracking shard references

View File

@ -43,7 +43,6 @@ import org.apache.cassandra.distributed.api.IInvokableInstance;
import org.apache.cassandra.io.util.DataInputBuffer;
import org.apache.cassandra.io.util.DataOutputBuffer;
import org.apache.cassandra.metrics.ReadRepairMetrics;
import org.apache.cassandra.net.MessagingService;
import org.apache.cassandra.replication.CoordinatorLogId;
import org.apache.cassandra.replication.MutationId;
import org.apache.cassandra.replication.MutationSummary;
@ -58,7 +57,6 @@ import org.apache.cassandra.utils.ByteBufferUtil;
public class MutationTrackingUtils
{
private static final Logger logger = LoggerFactory.getLogger(MutationTrackingUtils.class);
private static final int VERSION = MessagingService.current_version;
public static class IgnoreReasons
{
@ -66,42 +64,13 @@ public class MutationTrackingUtils
public static final String NO_PER_PARTITION_RANGE_READ_LIMITS = "NO_PER_PARTITION_RANGE_READ_LIMITS";
}
public static byte[] encodeId(MutationId id)
{
int size = Ints.checkedCast(MutationId.serializer.serializedSize(id, VERSION));
ByteBuffer buffer = ByteBuffer.allocate(size);
try (DataOutputBuffer dob = new DataOutputBuffer(buffer))
{
MutationId.serializer.serialize(id, dob, VERSION);
return buffer.array();
}
catch (IOException e)
{
throw new RuntimeException(e);
}
}
public static MutationId decodeId(byte[] bytes)
{
try (DataInputBuffer dib = new DataInputBuffer(bytes))
{
MutationId id = MutationId.serializer.deserialize(dib, VERSION);
Assert.assertEquals(MutationId.serializer.serializedSize(id, VERSION), bytes.length);
return id;
}
catch (IOException e)
{
throw new RuntimeException(e);
}
}
public static byte[] encodeSummary(MutationSummary summary)
{
int size = Ints.checkedCast(MutationSummary.serializer.serializedSize(summary, VERSION));
int size = Ints.checkedCast(MutationSummary.serializer.serializedSize(summary));
ByteBuffer buffer = ByteBuffer.allocate(size);
try (DataOutputBuffer dob = new DataOutputBuffer(buffer))
{
MutationSummary.serializer.serialize(summary, dob, VERSION);
MutationSummary.serializer.serialize(summary, dob);
Assert.assertEquals(size, buffer.position());
return buffer.array();
}
@ -115,8 +84,8 @@ public class MutationTrackingUtils
{
try (DataInputBuffer dib = new DataInputBuffer(bytes))
{
MutationSummary summary = MutationSummary.serializer.deserialize(dib, VERSION);
Assert.assertEquals(MutationSummary.serializer.serializedSize(summary, VERSION), bytes.length);
MutationSummary summary = MutationSummary.serializer.deserialize(dib);
Assert.assertEquals(MutationSummary.serializer.serializedSize(summary), bytes.length);
return summary;
}
catch (IOException e)

View File

@ -45,10 +45,9 @@ import org.apache.cassandra.distributed.shared.AssertUtils;
import org.apache.cassandra.distributed.shared.ClusterUtils;
import org.apache.cassandra.distributed.shared.Uninterruptibles;
import org.apache.cassandra.exceptions.ReadTimeoutException;
import org.apache.cassandra.io.IVersionedSerializer;
import org.apache.cassandra.io.UnversionedSerializer;
import org.apache.cassandra.io.sstable.format.SSTableReader;
import org.apache.cassandra.io.util.File;
import org.apache.cassandra.net.MessagingService;
import org.apache.cassandra.replication.ActivatedTransfers;
import org.apache.cassandra.replication.ActivationRequest;
import org.apache.cassandra.replication.ShortMutationId;
@ -382,23 +381,24 @@ public class TrackedImportFailureTest extends TrackedTransferTestBase
onRows.accept(rows);
}
private static <T> T callSerialized(IInvokableInstance instance, IIsolatedExecutor.SerializableSupplier<IVersionedSerializer<T>> serializer, IIsolatedExecutor.SerializableCallable<T> callable)
private static <T> T callSerialized(IInvokableInstance instance, IIsolatedExecutor.SerializableSupplier<UnversionedSerializer<T>> serializer, IIsolatedExecutor.SerializableCallable<T> callable)
{
ByteBuffer serialized = instance.callOnInstance(() -> {
T deserialized = callable.call();
IVersionedSerializer<T> serialize = serializer.get();
UnversionedSerializer<T> serialize = serializer.get();
try
{
return serialize.serialize(deserialized, MessagingService.current_version);
return serialize.serialize(deserialized);
}
catch (IOException e)
{
throw new RuntimeException(e);
}
});
try
{
return serializer.get().deserialize(serialized, MessagingService.current_version);
return serializer.get().deserialize(serialized);
}
catch (IOException e)
{

View File

@ -236,7 +236,6 @@ public class DatabaseDescriptorRefTest
"org.apache.cassandra.gms.IFailureDetector",
"org.apache.cassandra.io.FSError",
"org.apache.cassandra.io.FSWriteError",
"org.apache.cassandra.io.MessageVersionProvider",
"org.apache.cassandra.io.compress.ICompressor",
"org.apache.cassandra.io.compress.ICompressor$Uses",
"org.apache.cassandra.io.compress.LZ4Compressor",

View File

@ -15,7 +15,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cassandra.io;
import java.io.IOException;

View File

@ -0,0 +1,44 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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
*
* http://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 org.apache.cassandra.io.filesystem;
import java.io.IOException;
import org.assertj.core.api.Assertions;
import accord.utils.LazyToString;
import accord.utils.ReflectionUtils;
import org.apache.cassandra.io.UnversionedSerializer;
import org.apache.cassandra.io.util.DataInputBuffer;
import org.apache.cassandra.io.util.DataOutputBuffer;
public final class UnversionedSerializers
{
public static <T> void testSerde(DataOutputBuffer output, UnversionedSerializer<T> serializer, T input) throws IOException
{
output.clear();
long expectedSize = serializer.serializedSize(input);
serializer.serialize(input, output);
Assertions.assertThat(output.getLength()).describedAs("The serialized size and bytes written do not match").isEqualTo(expectedSize);
DataInputBuffer in = new DataInputBuffer(output.unsafeGetBufferAndFlip(), false);
T read = serializer.deserialize(in);
Assertions.assertThat(read).describedAs("The deserialized output does not match the serialized input; difference %s", new LazyToString(() -> ReflectionUtils.recursiveEquals(read, input).toString())).isEqualTo(input);
}
}

View File

@ -38,7 +38,6 @@ import org.apache.cassandra.dht.Range;
import org.apache.cassandra.dht.Token;
import org.apache.cassandra.io.util.DataInputBuffer;
import org.apache.cassandra.io.util.DataOutputBuffer;
import org.apache.cassandra.net.MessagingService;
import org.apache.cassandra.utils.AccordGenerators;
import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.CassandraGenerators;
@ -134,7 +133,7 @@ public class ActivatedTransfersTest
qt()
.forAll(activatedTransfersGen())
.check(transfers -> {
int version = MessagingService.current_version;
Version version = Version.CURRENT;
ActivatedTransfers deserialized;
try (DataOutputBuffer out = new DataOutputBuffer())
{

View File

@ -31,7 +31,6 @@ import org.apache.cassandra.distributed.test.log.ClusterMetadataTestHelper;
import org.apache.cassandra.io.Serializers;
import org.apache.cassandra.io.util.DataOutputBuffer;
import org.apache.cassandra.locator.InetAddressAndPort;
import org.apache.cassandra.net.MessagingService;
import org.apache.cassandra.streaming.StreamOperation;
import org.apache.cassandra.tcm.membership.NodeId;
import org.apache.cassandra.utils.Pair;
@ -41,7 +40,6 @@ import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
public class ActivationRequestSerializationTest extends CassandraTestBase
{
private static final int VERSION = MessagingService.current_version;
@BeforeClass
public static void setUpClass()
@ -65,7 +63,7 @@ public class ActivationRequestSerializationTest extends CassandraTestBase
try (DataOutputBuffer output = new DataOutputBuffer())
{
Serializers.testSerde(output, ActivationRequest.serializer, activation, VERSION);
Serializers.testSerde(output, ActivationRequest.serializer, activation, Version.CURRENT);
}
}
@ -84,7 +82,7 @@ public class ActivationRequestSerializationTest extends CassandraTestBase
try (DataOutputBuffer output = new DataOutputBuffer())
{
Serializers.testSerde(output, ActivationRequest.serializer, activation, VERSION);
Serializers.testSerde(output, ActivationRequest.serializer, activation, Version.CURRENT);
}
}
}

View File

@ -26,14 +26,12 @@ import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.io.Serializers;
import org.apache.cassandra.io.util.DataOutputBuffer;
import org.apache.cassandra.locator.InetAddressAndPort;
import org.apache.cassandra.net.MessagingService;
import org.apache.cassandra.utils.Pair;
import static org.assertj.core.api.Assertions.assertThat;
public class ActivationResponseSerializationTest
{
private static final int VERSION = MessagingService.current_version;
@BeforeClass
public static void setUpClass()
@ -49,7 +47,7 @@ public class ActivationResponseSerializationTest
try (DataOutputBuffer output = new DataOutputBuffer())
{
Serializers.testSerde(output, ActivationResponse.serializer, response, VERSION);
Serializers.testSerde(output, ActivationResponse.serializer, response, Version.CURRENT);
}
}
@ -63,7 +61,7 @@ public class ActivationResponseSerializationTest
try (DataOutputBuffer output = new DataOutputBuffer())
{
Serializers.testSerde(output, ActivationResponse.serializer, response, VERSION);
Serializers.testSerde(output, ActivationResponse.serializer, response, Version.CURRENT);
}
}

View File

@ -51,7 +51,6 @@ import org.apache.cassandra.distributed.test.tracking.MutationTrackingUtils;
import org.apache.cassandra.io.util.DataInputBuffer;
import org.apache.cassandra.io.util.DataOutputBuffer;
import org.apache.cassandra.locator.InetAddressAndPort;
import org.apache.cassandra.net.MessagingService;
import org.apache.cassandra.schema.DistributedSchema;
import org.apache.cassandra.schema.KeyspaceParams;
import org.apache.cassandra.schema.ReplicationType;
@ -107,15 +106,15 @@ public class CoordinatorLogOffsetsTest
.check(originals -> {
try (DataOutputBuffer outputBuffer = DataOutputBuffer.scratchBuffer.get())
{
ImmutableCoordinatorLogOffsets.serializer.serialize(originals, outputBuffer, MessagingService.current_version);
ImmutableCoordinatorLogOffsets.serializer.serialize(originals, outputBuffer, Version.CURRENT);
try (DataInputBuffer inputBuffer = new DataInputBuffer(outputBuffer.buffer(), true))
{
ImmutableCoordinatorLogOffsets deserialized = ImmutableCoordinatorLogOffsets.serializer.deserialize(inputBuffer, MessagingService.current_version);
ImmutableCoordinatorLogOffsets deserialized = ImmutableCoordinatorLogOffsets.serializer.deserialize(inputBuffer, Version.CURRENT);
CoordinatorLogOffsets.Mutations<Offsets.Immutable> mutations = deserialized.mutations();
Assertions.assertThat(Sets.newHashSet(mutations)).isEqualTo(Sets.newHashSet(originals.mutations().iterator()));
for (long logId : originals.mutations())
Assertions.assertThat(mutations.offsets(logId)).isEqualTo(originals.mutations().offsets(logId));
Assertions.assertThat(outputBuffer.getLength()).isEqualTo(ImmutableCoordinatorLogOffsets.serializer.serializedSize(originals, MessagingService.current_version));
Assertions.assertThat(outputBuffer.getLength()).isEqualTo(ImmutableCoordinatorLogOffsets.serializer.serializedSize(originals, Version.CURRENT));
}
}
});

View File

@ -26,9 +26,8 @@ import java.util.function.Supplier;
import org.junit.Assert;
import org.junit.Test;
import org.apache.cassandra.io.IVersionedSerializers;
import org.apache.cassandra.io.filesystem.UnversionedSerializers;
import org.apache.cassandra.io.util.DataOutputBuffer;
import org.apache.cassandra.net.MessagingService;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@ -757,7 +756,7 @@ public class OffsetsTest
{
DataOutputBuffer buffer = new DataOutputBuffer();
IVersionedSerializers.testSerde(buffer, Offsets.serializer, Offsets.Immutable.copy(offsets(0, 3, 7, 10, 15, 17)), MessagingService.current_version);
UnversionedSerializers.testSerde(buffer, Offsets.serializer, Offsets.Immutable.copy(offsets(0, 3, 7, 10, 15, 17)));
}
private static List<ShortMutationId> ids(int... offsets)