mirror of https://github.com/apache/cassandra
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:
parent
e982cf69b4
commit
16bb95fa15
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
@ -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>
|
||||
{
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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>()
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue