use of cz.o2.proxima.transaction.Response in project proxima-platform by O2-Czech-Republic.
the class TransactionIT method swapValueBetween.
private boolean swapValueBetween(String key, String attrA, String attrB, boolean canFailWrite) throws InterruptedException {
long retrySleep = 1;
do {
String transactionId = UUID.randomUUID().toString();
BlockingQueue<Response> responses = new ArrayBlockingQueue<>(1);
Optional<KeyValue<byte[]>> valA = view.get(key, attrA, device);
Optional<KeyValue<byte[]>> valB = view.get(key, attrB, device);
final List<KeyAttribute> fetched = Arrays.asList(valA.isPresent() ? KeyAttributes.ofStreamElement(valA.get()) : KeyAttributes.ofMissingAttribute(user, key, device, device.extractSuffix(attrA)), valB.isPresent() ? KeyAttributes.ofStreamElement(valB.get()) : KeyAttributes.ofMissingAttribute(user, key, device, device.extractSuffix(attrB)));
client.begin(transactionId, (id, resp) -> ExceptionUtils.unchecked(() -> responses.put(resp)), fetched);
Response response = responses.take();
if (response.getFlags() != Flags.OPEN) {
;
TimeUnit.MILLISECONDS.sleep(Math.min(8, retrySleep *= 2));
continue;
}
long sequentialId = response.getSeqId();
final List<StreamElement> updates;
if (valA.isPresent()) {
int currentVal = ByteBuffer.wrap(valA.get().getParsedRequired()).getInt();
updates = updateAttributeAndRemove(sequentialId, key, attrB, attrA, currentVal);
} else {
int currentVal = ByteBuffer.wrap(valB.get().getParsedRequired()).getInt();
updates = updateAttributeAndRemove(sequentialId, key, attrA, attrB, currentVal);
}
client.commit(transactionId, updates.stream().map(KeyAttributes::ofStreamElement).collect(Collectors.toList()));
response = responses.take();
if (response.getFlags() != Flags.COMMITTED) {
TimeUnit.MILLISECONDS.sleep(Math.min(8, retrySleep *= 2));
continue;
}
CountDownLatch latch = new CountDownLatch(1);
AtomicBoolean succeeded = new AtomicBoolean();
CommitCallback callback = (succ, exc) -> {
if (!succ) {
client.rollback(transactionId);
}
succeeded.set(succ);
latch.countDown();
};
if (canFailWrite && random.nextBoolean()) {
callback.commit(false, new RuntimeException("Failed!"));
} else {
CommitCallback multiCallback = CommitCallback.afterNumCommits(updates.size(), callback);
updates.forEach(u -> view.write(u, multiCallback));
}
latch.await();
return succeeded.get();
} while (true);
}
use of cz.o2.proxima.transaction.Response in project proxima-platform by O2-Czech-Republic.
the class TransactionIT_Large method swapValueBetween.
private boolean swapValueBetween(String key, String attrA, String attrB, boolean canFailWrite) throws InterruptedException {
long retrySleep = 1;
do {
String transactionId = UUID.randomUUID().toString();
BlockingQueue<Response> responses = new ArrayBlockingQueue<>(1);
Optional<KeyValue<byte[]>> valA = view.get(key, attrA, device);
Optional<KeyValue<byte[]>> valB = view.get(key, attrB, device);
final List<KeyAttribute> fetched = Arrays.asList(valA.isPresent() ? KeyAttributes.ofStreamElement(valA.get()) : KeyAttributes.ofMissingAttribute(user, key, device, device.extractSuffix(attrA)), valB.isPresent() ? KeyAttributes.ofStreamElement(valB.get()) : KeyAttributes.ofMissingAttribute(user, key, device, device.extractSuffix(attrB)));
client.begin(transactionId, (id, resp) -> ExceptionUtils.unchecked(() -> responses.put(resp)), fetched);
Response response = responses.take();
if (response.getFlags() != Flags.OPEN) {
;
TimeUnit.MILLISECONDS.sleep(Math.min(8, retrySleep *= 2));
continue;
}
long sequentialId = response.getSeqId();
final List<StreamElement> updates;
if (valA.isPresent()) {
int currentVal = ByteBuffer.wrap(valA.get().getParsedRequired()).getInt();
updates = updateAttributeAndRemove(sequentialId, key, attrB, attrA, currentVal);
} else {
int currentVal = ByteBuffer.wrap(valB.get().getParsedRequired()).getInt();
updates = updateAttributeAndRemove(sequentialId, key, attrA, attrB, currentVal);
}
client.commit(transactionId, updates.stream().map(KeyAttributes::ofStreamElement).collect(Collectors.toList()));
response = responses.take();
if (response.getFlags() != Flags.COMMITTED) {
TimeUnit.MILLISECONDS.sleep(Math.min(8, retrySleep *= 2));
continue;
}
CountDownLatch latch = new CountDownLatch(1);
AtomicBoolean succeeded = new AtomicBoolean();
CommitCallback callback = (succ, exc) -> {
if (!succ) {
client.rollback(transactionId);
}
succeeded.set(succ);
latch.countDown();
};
if (canFailWrite && random.nextBoolean()) {
callback.commit(false, new RuntimeException("Failed!"));
} else {
CommitCallback multiCallback = CommitCallback.afterNumCommits(updates.size(), callback);
updates.forEach(u -> view.write(u, multiCallback));
}
latch.await();
return succeeded.get();
} while (true);
}
use of cz.o2.proxima.transaction.Response in project proxima-platform by O2-Czech-Republic.
the class TransactionLogObserverTest method testCreateTransactionCommitAfterFailover.
@Test(timeout = 10000)
public void testCreateTransactionCommitAfterFailover() throws InterruptedException {
String transactionId = UUID.randomUUID().toString();
BlockingQueue<Pair<String, Response>> responseQueue = new ArrayBlockingQueue<>(1);
try (ClientTransactionManager clientManager = new TransactionResourceManager(direct, Collections.emptyMap())) {
createObserver();
clientManager.begin(transactionId, ExceptionUtils.uncheckedBiConsumer((k, v) -> responseQueue.put(Pair.of(k, v))), Collections.singletonList(KeyAttributes.ofAttributeDescriptor(user, "user", userGateways, 1L, "1")));
takeResponseFor(responseQueue, "open.1");
observer.getRawManager().close();
createObserver();
clientManager.commit(transactionId, Collections.singletonList(KeyAttributes.ofAttributeDescriptor(user, "user", userGateways, 2L, "1")));
Pair<String, Response> response = takeResponseFor(responseQueue, "commit");
assertEquals(Response.Flags.COMMITTED, response.getSecond().getFlags());
}
}
use of cz.o2.proxima.transaction.Response in project proxima-platform by O2-Czech-Republic.
the class TransactionLogObserverTest method testCreateTransactionRollbackAfterFailover.
@Test(timeout = 10000)
public void testCreateTransactionRollbackAfterFailover() throws InterruptedException {
String t1 = "t1-" + UUID.randomUUID();
String t2 = "t2-" + UUID.randomUUID();
BlockingQueue<Pair<String, Response>> responseQueue = new ArrayBlockingQueue<>(1);
try (ClientTransactionManager clientManager = new TransactionResourceManager(direct, Collections.emptyMap())) {
createObserver();
clientManager.begin(t1, ExceptionUtils.uncheckedBiConsumer((k, v) -> responseQueue.put(Pair.of(k, v))), Collections.singletonList(KeyAttributes.ofAttributeDescriptor(user, "user", userGateways, 1L, "1")));
Pair<String, Response> t1openResponse = takeResponseFor(responseQueue, "open.1");
clientManager.begin(t2, ExceptionUtils.uncheckedBiConsumer((k, v) -> responseQueue.put(Pair.of(k, v))), Collections.singletonList(KeyAttributes.ofAttributeDescriptor(user, "user", userGateways, 1L, "1")));
Pair<String, Response> t2openResponse = takeResponseFor(responseQueue, "open.1");
assertTrue(t2openResponse.getSecond().getSeqId() > t1openResponse.getSecond().getSeqId());
clientManager.commit(t2, Collections.singletonList(KeyAttributes.ofAttributeDescriptor(user, "user", userGateways, 2L, "1")));
Pair<String, Response> t2commitResponse = takeResponseFor(responseQueue, "commit");
assertEquals("commit", t2commitResponse.getFirst());
observer.getRawManager().close();
createObserver();
clientManager.commit(t1, Collections.singletonList(KeyAttributes.ofAttributeDescriptor(user, "user", userGateways, 2L, "1")));
Pair<String, Response> response = takeResponseFor(responseQueue, "commit");
assertTrue("Expected exactly one committed transaction, got " + t2commitResponse.getSecond() + " and " + response.getSecond(), t2commitResponse.getSecond().getFlags() == Response.Flags.COMMITTED ^ response.getSecond().getFlags() == Response.Flags.COMMITTED);
tearDown();
}
}
use of cz.o2.proxima.transaction.Response in project proxima-platform by O2-Czech-Republic.
the class TransactionLogObserverTest method testCreateTransactionRollbackRollback.
@Test(timeout = 10000)
public void testCreateTransactionRollbackRollback() throws InterruptedException {
createObserver();
try (ClientTransactionManager clientManager = direct.getClientTransactionManager()) {
String transactionId = UUID.randomUUID().toString();
BlockingQueue<Pair<String, Response>> responseQueue = new ArrayBlockingQueue<>(1);
clientManager.begin(transactionId, ExceptionUtils.uncheckedBiConsumer((k, v) -> responseQueue.put(Pair.of(k, v))), Collections.singletonList(KeyAttributes.ofAttributeDescriptor(user, "user", userGateways, 1L, "1")));
responseQueue.take();
clientManager.rollback(transactionId);
Pair<String, Response> rollbackResponse1 = responseQueue.take();
assertEquals(Response.Flags.ABORTED, rollbackResponse1.getSecond().getFlags());
clientManager.rollback(transactionId);
Pair<String, Response> rollbackResponse2 = responseQueue.take();
assertEquals(Response.Flags.ABORTED, rollbackResponse2.getSecond().getFlags());
}
}
Aggregations