use of org.corfudb.protocols.wireprotocol.ILogData in project CorfuDB by CorfuDB.
the class AbstractReplicationProtocolTest method readOnlyCommitted.
/** Check to make sure reads never return empty in
* the case of an unwritten address.
*/
@Test
@SuppressWarnings("unchecked")
public void readOnlyCommitted() throws Exception {
setupNodes();
//begin tests
final CorfuRuntime r = getDefaultRuntime();
final IReplicationProtocol rp = getProtocol();
final Layout layout = r.getLayoutView().getLayout();
ILogData read = rp.read(layout, 0);
assertThat(read.getType()).isNotEqualTo(DataType.EMPTY);
read = rp.read(layout, 1);
assertThat(read.getType()).isNotEqualTo(DataType.EMPTY);
}
use of org.corfudb.protocols.wireprotocol.ILogData in project CorfuDB by CorfuDB.
the class ChainReplicationProtocolTest method failedWriteIsPropagated.
/** Check to see that a writer correctly
* completes a failed write from another client.
*/
@Test
public void failedWriteIsPropagated() throws Exception {
setupNodes();
//begin tests
final CorfuRuntime r = getDefaultRuntime();
final IReplicationProtocol rp = getProtocol();
final Layout layout = r.getLayoutView().getLayout();
LogData failedWrite = getLogData(0, "failed".getBytes());
LogData incompleteWrite = getLogData(0, "incomplete".getBytes());
// Write the incomplete write to the head of the chain
r.getRouter(SERVERS.ENDPOINT_0).getClient(LogUnitClient.class).write(incompleteWrite);
// Attempt to write using the replication protocol.
// Should result in an overwrite exception
assertThatThrownBy(() -> rp.write(layout, failedWrite)).isInstanceOf(OverwriteException.class);
// At this point, a direct read of the tail should
// reflect the -other- clients value
ILogData readResult = r.getRouter(SERVERS.ENDPOINT_0).getClient(LogUnitClient.class).read(0).get().getReadSet().get(0L);
assertThat(readResult.getPayload(r)).isEqualTo("incomplete".getBytes());
}
use of org.corfudb.protocols.wireprotocol.ILogData in project CorfuDB by CorfuDB.
the class QuorumReplicationProtocolAdditionalTests method canReadWrite.
@Test
@SuppressWarnings("unchecked")
public void canReadWrite() throws Exception {
CorfuRuntime r = getDefaultRuntime();
UUID streamA = UUID.nameUUIDFromBytes("stream A".getBytes());
byte[] testPayload = "hello world".getBytes();
r.getAddressSpaceView().write(new TokenResponse(0, r.getLayoutView().getLayout().getEpoch(), Collections.singletonMap(streamA, Address.NO_BACKPOINTER)), testPayload);
ILogData x = r.getAddressSpaceView().read(0);
assertNotNull(x.getRank());
assertThat(r.getAddressSpaceView().read(0L).getPayload(r)).isEqualTo("hello world".getBytes());
assertThat(r.getAddressSpaceView().read(0L).containsStream(streamA)).isTrue();
assertThat((IMetadata.DataRank) r.getAddressSpaceView().read(0L).getMetadataMap().get(IMetadata.LogUnitMetadataType.RANK)).isNotNull();
}
use of org.corfudb.protocols.wireprotocol.ILogData in project CorfuDB by CorfuDB.
the class ObjectsViewTest method abortedTransactionDoesNotConflict.
@Test
@SuppressWarnings("unchecked")
public void abortedTransactionDoesNotConflict() throws Exception {
final String mapA = "map a";
//Enbale transaction logging
CorfuRuntime r = getDefaultRuntime().setTransactionLogging(true);
SMRMap<String, String> map = getDefaultRuntime().getObjectsView().build().setStreamName(mapA).setTypeToken(new TypeToken<SMRMap<String, String>>() {
}).open();
// TODO: fix so this does not require mapCopy.
SMRMap<String, String> mapCopy = getDefaultRuntime().getObjectsView().build().setStreamName(mapA).setTypeToken(new TypeToken<SMRMap<String, String>>() {
}).addOption(ObjectOpenOptions.NO_CACHE).open();
map.put("initial", "value");
Semaphore s1 = new Semaphore(0);
Semaphore s2 = new Semaphore(0);
// Schedule two threads, the first starts a transaction and reads,
// then waits for the second thread to finish.
// the second starts a transaction, waits for the first tx to read
// and commits.
// The first thread then resumes and attempts to commit. It should abort.
scheduleConcurrently(1, t -> {
assertThatThrownBy(() -> {
getRuntime().getObjectsView().TXBegin();
map.get("k");
s1.release();
s2.acquire();
map.put("k", "v1");
getRuntime().getObjectsView().TXEnd();
}).isInstanceOf(TransactionAbortedException.class);
});
scheduleConcurrently(1, t -> {
s1.acquire();
getRuntime().getObjectsView().TXBegin();
mapCopy.put("k", "v2");
getRuntime().getObjectsView().TXEnd();
s2.release();
});
executeScheduled(2, PARAMETERS.TIMEOUT_LONG);
// The result should contain T2s modification.
assertThat(map).containsEntry("k", "v2");
IStreamView txStream = r.getStreamsView().get(ObjectsView.TRANSACTION_STREAM_ID);
List<ILogData> txns = txStream.remainingUpTo(Long.MAX_VALUE);
assertThat(txns).hasSize(1);
assertThat(txns.get(0).getLogEntry(getRuntime()).getType()).isEqualTo(LogEntry.LogEntryType.MULTIOBJSMR);
MultiObjectSMREntry tx1 = (MultiObjectSMREntry) txns.get(0).getLogEntry(getRuntime());
MultiSMREntry entryMap = tx1.getEntryMap().get(CorfuRuntime.getStreamID(mapA));
assertThat(entryMap).isNotNull();
assertThat(entryMap.getUpdates().size()).isEqualTo(1);
SMREntry smrEntry = entryMap.getUpdates().get(0);
Object[] args = smrEntry.getSMRArguments();
assertThat(smrEntry.getSMRMethod()).isEqualTo("put");
assertThat((String) args[0]).isEqualTo("k");
assertThat((String) args[1]).isEqualTo("v2");
}
use of org.corfudb.protocols.wireprotocol.ILogData in project CorfuDB by CorfuDB.
the class WriteAfterWriteTransactionContextTest method concurrentModificationsCauseAbort.
@Test
public void concurrentModificationsCauseAbort() {
getRuntime().setTransactionLogging(true);
getMap();
t(1, () -> write("k", "v1"));
t(1, this::WWTXBegin);
t(2, this::WWTXBegin);
t(1, () -> get("k"));
t(2, () -> get("k"));
t(1, () -> write("k", "v2"));
t(2, () -> write("k", "v3"));
t(1, this::TXEnd);
t(2, this::TXEnd).assertThrows().isInstanceOf(TransactionAbortedException.class);
assertThat(getMap()).containsEntry("k", "v2").doesNotContainEntry("k", "v3");
IStreamView txStream = getRuntime().getStreamsView().get(ObjectsView.TRANSACTION_STREAM_ID);
List<ILogData> txns = txStream.remainingUpTo(Long.MAX_VALUE);
assertThat(txns).hasSize(1);
assertThat(txns.get(0).getLogEntry(getRuntime()).getType()).isEqualTo(LogEntry.LogEntryType.MULTIOBJSMR);
MultiObjectSMREntry tx1 = (MultiObjectSMREntry) txns.get(0).getLogEntry(getRuntime());
assertThat(tx1.getEntryMap().size()).isEqualTo(1);
MultiSMREntry entryMap = tx1.getEntryMap().entrySet().iterator().next().getValue();
assertThat(entryMap).isNotNull();
assertThat(entryMap.getUpdates().size()).isEqualTo(1);
SMREntry smrEntry = entryMap.getUpdates().get(0);
Object[] args = smrEntry.getSMRArguments();
assertThat(smrEntry.getSMRMethod()).isEqualTo("put");
assertThat((String) args[0]).isEqualTo("k");
assertThat((String) args[1]).isEqualTo("v2");
}
Aggregations