use of cz.o2.proxima.transaction.KeyAttributes 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.KeyAttributes in project proxima-platform by O2-Czech-Republic.
the class TransactionIT method removeSingleDevice.
private void removeSingleDevice(int numUsers) throws InterruptedException {
do {
TransactionalOnlineAttributeWriter writer = Optionals.get(direct.getWriter(device)).transactional();
try (Transaction t = writer.begin()) {
String userId = "user" + random.nextInt(numUsers);
List<StreamElement> devices = new ArrayList<>();
view.scanWildcard(userId, device, devices::add);
List<KeyAttribute> keyAttributes = KeyAttributes.ofWildcardQueryElements(user, userId, device, devices);
if (devices.isEmpty()) {
continue;
}
long stamp = System.currentTimeMillis();
t.update(keyAttributes);
String name = device.extractSuffix(devices.get(random.nextInt(devices.size())).getAttribute());
StreamElement deviceUpdate = device.delete(userId, name, stamp);
StreamElement numDevicesUpdate = numDevices.upsert(userId, "all", stamp, devices.size() - 1);
CountDownLatch latch = new CountDownLatch(1);
t.commitWrite(Arrays.asList(deviceUpdate, numDevicesUpdate), (succ, exc) -> latch.countDown());
latch.await();
break;
} catch (TransactionRejectedException e) {
// repeat
}
} while (true);
}
use of cz.o2.proxima.transaction.KeyAttributes in project proxima-platform by O2-Czech-Republic.
the class TransactionIT_Large method writeSingleDevice.
private void writeSingleDevice(int numUsers, boolean intoAll) throws InterruptedException {
String name = UUID.randomUUID().toString();
String userId = "user" + random.nextInt(numUsers);
do {
TransactionalOnlineAttributeWriter writer = Optionals.get(direct.getWriter(device)).transactional();
long stamp = System.currentTimeMillis();
try (Transaction t = writer.begin()) {
List<StreamElement> devices = new ArrayList<>();
view.scanWildcard(userId, device, devices::add);
List<KeyAttribute> keyAttributes = KeyAttributes.ofWildcardQueryElements(user, userId, device, devices);
t.update(keyAttributes);
StreamElement deviceUpdate = device.upsert(userId, name, stamp, new byte[] {});
final StreamElement numDevicesUpdate;
int count = devices.size() + 1;
if (intoAll) {
numDevicesUpdate = numDevices.upsert(userId, "all", stamp, count);
} else {
numDevicesUpdate = numDevices.upsert(userId, String.valueOf(count), stamp, count);
}
CountDownLatch latch = new CountDownLatch(1);
t.commitWrite(Arrays.asList(deviceUpdate, numDevicesUpdate), (succ, exc) -> latch.countDown());
latch.await();
break;
} catch (TransactionRejectedException e) {
// repeat
}
} while (true);
}
use of cz.o2.proxima.transaction.KeyAttributes 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.KeyAttributes in project proxima-platform by O2-Czech-Republic.
the class KeyAttributes method ofWildcardQueryElements.
/**
* Create a list of {@link KeyAttribute KeyAttributes} that represent a query for wildcard
* attribute and the returned
*
* @param <E> type parameter
* @param entity the entity descriptor
* @param key the key of the entity
* @param wildcardAttribute the descriptor of wildcard attribute
* @param elements the elements returned by query
* @return
*/
public static <E extends StreamElement> List<KeyAttribute> ofWildcardQueryElements(EntityDescriptor entity, String key, AttributeDescriptor<?> wildcardAttribute, Iterable<E> elements) {
List<KeyAttribute> ret = new ArrayList<>();
long minSeqId = Long.MAX_VALUE;
for (StreamElement e : elements) {
Preconditions.checkArgument(e.getAttributeDescriptor().equals(wildcardAttribute), "All passed attribute descriptors must match %s, got %s", wildcardAttribute, e.getAttributeDescriptor());
Preconditions.checkArgument(e.getKey().equals(key), "All passed attribute descriptors must match the same key %s, got %s", key, e.getKey());
ret.add(ofStreamElement(e));
minSeqId = Math.min(minSeqId, e.getSequentialId());
}
if (minSeqId == Long.MAX_VALUE) {
minSeqId = 1L;
}
ret.add(new KeyAttribute(entity, key, wildcardAttribute, minSeqId, false, null));
return ret;
}
Aggregations