use of org.corfudb.runtime.view.Layout in project CorfuDB by CorfuDB.
the class LayoutServerTest method commitReturnsAck.
/**
* Verifies all phases set epoch, prepare, propose, commit.
* Note: this is in the scope of a single epoch.
*/
@Test
public void commitReturnsAck() {
Layout layout = TestLayoutBuilder.single(SERVERS.PORT_0);
bootstrapServer(layout);
long newEpoch = layout.getEpoch() + 1;
Layout newLayout = TestLayoutBuilder.single(SERVERS.PORT_0);
newLayout.setEpoch(newEpoch);
// set epoch on servers
setEpoch(newEpoch);
sendPrepare(newEpoch, HIGH_RANK);
Assertions.assertThat(getLastMessage().getMsgType()).isEqualTo(CorfuMsgType.LAYOUT_PREPARE_ACK);
sendPropose(newEpoch, HIGH_RANK, newLayout);
Assertions.assertThat(getLastMessage().getMsgType()).isEqualTo(CorfuMsgType.ACK);
sendCommitted(newEpoch, newLayout);
Assertions.assertThat(getLastMessage().getMsgType()).isEqualTo(CorfuMsgType.ACK);
}
use of org.corfudb.runtime.view.Layout in project CorfuDB by CorfuDB.
the class LayoutServerTest method prepareRejectsLowerRanks.
/**
* Verifies that once a prepare with a rank has been accepted,
* any subsequent prepares with lower ranks are rejected.
* Note: This is in the scope of same epoch.
*/
@Test
public void prepareRejectsLowerRanks() {
Layout layout = TestLayoutBuilder.single(SERVERS.PORT_0);
long epoch = layout.getEpoch();
bootstrapServer(layout);
sendPrepare(epoch, HIGH_RANK);
Assertions.assertThat(getLastMessage().getMsgType()).isEqualTo(CorfuMsgType.LAYOUT_PREPARE_ACK);
sendPrepare(epoch, LOW_RANK);
Assertions.assertThat(getLastMessage().getMsgType()).isEqualTo(CorfuMsgType.LAYOUT_PREPARE_REJECT);
}
use of org.corfudb.runtime.view.Layout in project CorfuDB by CorfuDB.
the class LayoutServerTest method bootstrapServerInstallsNewLayout.
/**
* Verifies that a server responds with a layout that the server was bootstrapped with.
* There are no layout changes between bootstrap and layout request.
*/
@Test
public void bootstrapServerInstallsNewLayout() {
Layout layout = TestLayoutBuilder.single(SERVERS.PORT_0);
bootstrapServer(layout);
requestLayout(layout.getEpoch());
Assertions.assertThat(getLastMessage().getMsgType()).isEqualTo(CorfuMsgType.LAYOUT_RESPONSE);
Assertions.assertThat(((LayoutMsg) getLastMessage()).getLayout()).isEqualTo(layout);
}
use of org.corfudb.runtime.view.Layout in project CorfuDB by CorfuDB.
the class LayoutServerTest method checkServerEpochDoesNotRegress.
/**
* Verifies that once set the epoch cannot regress.
* Note: it does not verify that epoch is a dense monotonically increasing integer
* sequence.
*/
@Test
public void checkServerEpochDoesNotRegress() {
Layout layout = TestLayoutBuilder.single(SERVERS.PORT_0);
long epoch = layout.getEpoch();
bootstrapServer(layout);
setEpoch(2);
Assertions.assertThat(getLastMessage().getMsgType()).isEqualTo(CorfuMsgType.ACK);
requestLayout(epoch);
Assertions.assertThat(getLastMessage().getMsgType()).isEqualTo(CorfuMsgType.LAYOUT_RESPONSE);
Assertions.assertThat(getLastMessage().getEpoch()).isEqualTo(2);
setEpoch(1);
Assertions.assertThat(getLastMessage().getMsgType()).isEqualTo(CorfuMsgType.WRONG_EPOCH);
}
use of org.corfudb.runtime.view.Layout in project CorfuDB by CorfuDB.
the class ICorfuPayload method serialize.
@SuppressWarnings("unchecked")
static <T> void serialize(ByteBuf buffer, T payload) {
// If it's an ICorfuPayload, use the defined serializer.
if (payload instanceof ICorfuPayload) {
((ICorfuPayload) payload).doSerialize(buffer);
} else // Otherwise serialize the primitive type.
if (payload instanceof Byte) {
buffer.writeByte((Byte) payload);
} else if (payload instanceof Short) {
buffer.writeShort((Short) payload);
} else if (payload instanceof Integer) {
buffer.writeInt((Integer) payload);
} else if (payload instanceof Long) {
buffer.writeLong((Long) payload);
} else if (payload instanceof Boolean) {
buffer.writeBoolean((Boolean) payload);
} else if (payload instanceof Double) {
buffer.writeDouble((Double) payload);
} else if (payload instanceof Float) {
buffer.writeFloat((Float) payload);
} else if (payload instanceof byte[]) {
buffer.writeInt(((byte[]) payload).length);
buffer.writeBytes((byte[]) payload);
} else // and some standard non prims as well
if (payload instanceof String) {
byte[] s = ((String) payload).getBytes();
buffer.writeInt(s.length);
buffer.writeBytes(s);
} else if (payload instanceof UUID) {
buffer.writeLong(((UUID) payload).getMostSignificantBits());
buffer.writeLong(((UUID) payload).getLeastSignificantBits());
} else // and some collection types
if (payload instanceof EnumMap) {
EnumMap<?, ?> map = (EnumMap<?, ?>) payload;
buffer.writeByte(map.size());
map.entrySet().stream().forEach(x -> {
serialize(buffer, x.getKey());
serialize(buffer, x.getValue());
});
} else if (payload instanceof RangeSet) {
Set<Range<?>> rs = (((RangeSet) payload).asRanges());
buffer.writeInt(rs.size());
rs.stream().forEach(x -> {
buffer.writeBoolean(x.upperBoundType() == BoundType.CLOSED);
serialize(buffer, x.upperEndpoint());
buffer.writeBoolean(x.upperBoundType() == BoundType.CLOSED);
serialize(buffer, x.lowerEndpoint());
});
} else if (payload instanceof Range) {
Range<?> r = (Range) payload;
buffer.writeBoolean(r.upperBoundType() == BoundType.CLOSED);
serialize(buffer, r.upperEndpoint());
buffer.writeBoolean(r.upperBoundType() == BoundType.CLOSED);
serialize(buffer, r.lowerEndpoint());
} else if (payload instanceof Map) {
Map<?, ?> map = (Map<?, ?>) payload;
buffer.writeInt(map.size());
map.entrySet().stream().forEach(x -> {
serialize(buffer, x.getKey());
serialize(buffer, x.getValue());
});
} else if (payload instanceof Set) {
Set<?> set = (Set<?>) payload;
buffer.writeInt(set.size());
set.stream().forEach(x -> {
serialize(buffer, x);
});
} else if (payload instanceof List) {
List<?> list = (List<?>) payload;
buffer.writeInt(list.size());
list.stream().forEach(x -> {
serialize(buffer, x);
});
} else if (payload instanceof Layout) {
byte[] b = JSONUtils.parser.toJson(payload).getBytes();
buffer.writeInt(b.length);
buffer.writeBytes(b);
} else // and if its a bytebuf
if (payload instanceof ByteBuf) {
ByteBuf b = ((ByteBuf) payload).slice();
b.resetReaderIndex();
int bytes = b.readableBytes();
buffer.writeInt(bytes);
buffer.writeBytes(b, bytes);
} else if (payload instanceof IMetadata.DataRank) {
IMetadata.DataRank rank = (IMetadata.DataRank) payload;
buffer.writeLong(rank.getRank());
buffer.writeLong(rank.getUuid().getMostSignificantBits());
buffer.writeLong(rank.getUuid().getLeastSignificantBits());
} else if (payload instanceof CheckpointEntry.CheckpointEntryType) {
buffer.writeByte(((CheckpointEntry.CheckpointEntryType) payload).asByte());
} else {
throw new RuntimeException("Unknown class " + payload.getClass() + " for serialization");
}
}
Aggregations