use of org.apache.cassandra.io.IVersionedAsymmetricSerializer in project cassandra by apache.
the class Instance method serializeMessage.
public static IMessage serializeMessage(InetAddressAndPort from, InetAddressAndPort to, Message<?> messageOut) {
int fromVersion = MessagingService.instance().versions.get(from);
int toVersion = MessagingService.instance().versions.get(to);
// See CASSANDRA-16157 for details.
if (fromVersion < MessagingService.current_version && ((messageOut.verb().serializer() == ((IVersionedAsymmetricSerializer) NoPayload.serializer) || messageOut.payload == null))) {
return new MessageImpl(messageOut.verb().id, ByteArrayUtil.EMPTY_BYTE_ARRAY, messageOut.id(), toVersion, fromCassandraInetAddressAndPort(from));
}
try (DataOutputBuffer out = new DataOutputBuffer(1024)) {
// we use a special procedure here that "re-serializes" a "remote" batch to build the message.
if (fromVersion >= MessagingService.VERSION_40 && messageOut.verb().id == BATCH_STORE_REQ.id) {
Object maybeBatch = messageOut.payload;
if (maybeBatch instanceof Batch) {
Batch batch = (Batch) maybeBatch;
// If the batch is local, it can be serialized along the normal path.
if (!batch.isLocal()) {
reserialize(batch, out, toVersion);
byte[] bytes = out.toByteArray();
return new MessageImpl(messageOut.verb().id, bytes, messageOut.id(), toVersion, fromCassandraInetAddressAndPort(from));
}
}
}
Message.serializer.serialize(messageOut, out, toVersion);
byte[] bytes = out.toByteArray();
if (messageOut.serializedSize(toVersion) != bytes.length)
throw new AssertionError(String.format("Message serializedSize(%s) does not match what was written with serialize(out, %s) for verb %s and serializer %s; " + "expected %s, actual %s", toVersion, toVersion, messageOut.verb(), Message.serializer.getClass(), messageOut.serializedSize(toVersion), bytes.length));
return new MessageImpl(messageOut.verb().id, bytes, messageOut.id(), toVersion, fromCassandraInetAddressAndPort(from));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
use of org.apache.cassandra.io.IVersionedAsymmetricSerializer in project cassandra by apache.
the class MessageSerializationPropertyTest method testMessageSerialization.
/**
* Message and payload don't define equals, so have to rely on another way to define equality; serialized bytes!
* The assumption is that serialize(deserialize(serialize(message))) == serialize(message)
*/
@Test
public void testMessageSerialization() throws Exception {
SchemaProvider schema = Mockito.mock(SchemaProvider.class, Mockito.CALLS_REAL_METHODS);
ReadCommand.Serializer readCommandSerializer = new ReadCommand.Serializer(schema);
Supplier<? extends IVersionedAsymmetricSerializer<?, ?>> original = Verb.READ_REQ.unsafeSetSerializer(() -> readCommandSerializer);
try (DataOutputBuffer first = new DataOutputBuffer(1024);
DataOutputBuffer second = new DataOutputBuffer(1024)) {
qt().forAll(MESSAGE_GEN).checkAssert(orFail(message -> {
withTable(schema, message, orFail(ignore -> {
for (MessagingService.Version version : MessagingService.Version.values()) {
first.clear();
second.clear();
// sync the clock with the generated createdAtNanos
FixedMonotonicClock.setNowInNanos(message.createdAtNanos());
serializer.serialize(message, first, version.value);
Message<Object> read = serializer.deserialize(new DataInputBuffer(first.buffer(), true), FBUtilities.getBroadcastAddressAndPort(), version.value);
serializer.serialize(read, second, version.value);
// using hex as byte buffer equality kept failing, and was harder to debug difference
// using hex means the specific section of the string that is different will be shown
Assertions.assertThat(ByteBufferUtil.bytesToHex(second.buffer())).as("Property serialize(deserialize(serialize(message))) == serialize(message) " + "was violated for version %s and verb %s" + "\n first=%s" + "\nsecond=%s\n", version, message.header.verb, // toString methods are not relyable for messages, so use reflection to generate one
new Object() {
public String toString() {
return CassandraGenerators.toStringRecursive(message);
}
}, new Object() {
public String toString() {
return CassandraGenerators.toStringRecursive(read);
}
}).isEqualTo(ByteBufferUtil.bytesToHex(first.buffer()));
}
}));
}));
} finally {
Verb.READ_REQ.unsafeSetSerializer(original);
}
}
Aggregations