Search in sources :

Example 31 with Layout

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);
}
Also used : Layout(org.corfudb.runtime.view.Layout) Test(org.junit.Test)

Example 32 with Layout

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);
}
Also used : Layout(org.corfudb.runtime.view.Layout) Test(org.junit.Test)

Example 33 with Layout

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);
}
Also used : LayoutMsg(org.corfudb.protocols.wireprotocol.LayoutMsg) Layout(org.corfudb.runtime.view.Layout) Test(org.junit.Test)

Example 34 with 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);
}
Also used : Layout(org.corfudb.runtime.view.Layout) Test(org.junit.Test)

Example 35 with Layout

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");
    }
}
Also used : Layout(org.corfudb.runtime.view.Layout) java.util(java.util) ByteBuf(io.netty.buffer.ByteBuf) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) JSONUtils(org.corfudb.util.JSONUtils) java.lang.invoke(java.lang.invoke) TypeToken(com.google.common.reflect.TypeToken) com.google.common.collect(com.google.common.collect) Constructor(java.lang.reflect.Constructor) StandardCharsets(java.nio.charset.StandardCharsets) CheckpointEntry(org.corfudb.protocols.logprotocol.CheckpointEntry) ByteBuf(io.netty.buffer.ByteBuf) CheckpointEntry(org.corfudb.protocols.logprotocol.CheckpointEntry) Layout(org.corfudb.runtime.view.Layout) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap)

Aggregations

Layout (org.corfudb.runtime.view.Layout)44 Test (org.junit.Test)29 CorfuRuntime (org.corfudb.runtime.CorfuRuntime)10 ILogData (org.corfudb.protocols.wireprotocol.ILogData)5 AbstractViewTest (org.corfudb.runtime.view.AbstractViewTest)5 LogData (org.corfudb.protocols.wireprotocol.LogData)4 HashSet (java.util.HashSet)3 ExecutionException (java.util.concurrent.ExecutionException)3 Gson (com.google.gson.Gson)2 GsonBuilder (com.google.gson.GsonBuilder)2 ArrayList (java.util.ArrayList)2 FailureDetectorMsg (org.corfudb.protocols.wireprotocol.FailureDetectorMsg)2 LayoutMsg (org.corfudb.protocols.wireprotocol.LayoutMsg)2 OutrankedException (org.corfudb.runtime.exceptions.OutrankedException)2 com.google.common.collect (com.google.common.collect)1 TypeToken (com.google.common.reflect.TypeToken)1 ThreadFactoryBuilder (com.google.common.util.concurrent.ThreadFactoryBuilder)1 ByteBuf (io.netty.buffer.ByteBuf)1 ChannelHandlerContext (io.netty.channel.ChannelHandlerContext)1 java.lang.invoke (java.lang.invoke)1