Search in sources :

Example 1 with KeyAttributes

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);
}
Also used : Arrays(java.util.Arrays) Transaction(cz.o2.proxima.direct.transaction.TransactionalOnlineAttributeWriter.Transaction) ConfigConstants(cz.o2.proxima.repository.ConfigConstants) EntityDescriptor(cz.o2.proxima.repository.EntityDescriptor) Random(java.util.Random) ByteBuffer(java.nio.ByteBuffer) Wildcard(cz.o2.proxima.repository.EntityAwareAttributeDescriptor.Wildcard) ExceptionUtils(cz.o2.proxima.util.ExceptionUtils) CachedView(cz.o2.proxima.direct.view.CachedView) StreamElement(cz.o2.proxima.storage.StreamElement) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) TransformationRunner(cz.o2.proxima.util.TransformationRunner) Map(java.util.Map) After(org.junit.After) TransactionResourceManager(cz.o2.proxima.direct.transaction.TransactionResourceManager) Optionals(cz.o2.proxima.util.Optionals) Flags(cz.o2.proxima.transaction.Response.Flags) BlockingQueue(java.util.concurrent.BlockingQueue) ObserveHandle(cz.o2.proxima.direct.commitlog.ObserveHandle) UUID(java.util.UUID) CommitCallback(cz.o2.proxima.direct.core.CommitCallback) Collectors(java.util.stream.Collectors) ArrayBlockingQueue(java.util.concurrent.ArrayBlockingQueue) CountDownLatch(java.util.concurrent.CountDownLatch) List(java.util.List) Slf4j(lombok.extern.slf4j.Slf4j) KeyValue(cz.o2.proxima.direct.randomaccess.KeyValue) Response(cz.o2.proxima.transaction.Response) Optional(java.util.Optional) DirectDataOperator(cz.o2.proxima.direct.core.DirectDataOperator) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) OnlineAttributeWriter(cz.o2.proxima.direct.core.OnlineAttributeWriter) AtomicReference(java.util.concurrent.atomic.AtomicReference) ArrayList(java.util.ArrayList) ClientTransactionManager(cz.o2.proxima.direct.transaction.ClientTransactionManager) Regular(cz.o2.proxima.repository.EntityAwareAttributeDescriptor.Regular) ConfigFactory(com.typesafe.config.ConfigFactory) ExecutorService(java.util.concurrent.ExecutorService) DeclaredThreadSafe(cz.o2.proxima.annotations.DeclaredThreadSafe) TransactionalOnlineAttributeWriter(cz.o2.proxima.direct.transaction.TransactionalOnlineAttributeWriter) Before(org.junit.Before) Repository(cz.o2.proxima.repository.Repository) Config(com.typesafe.config.Config) Assert.assertTrue(org.junit.Assert.assertTrue) KeyAttribute(cz.o2.proxima.transaction.KeyAttribute) KeyAttributes(cz.o2.proxima.transaction.KeyAttributes) Test(org.junit.Test) TimeUnit(java.util.concurrent.TimeUnit) TransactionRejectedException(cz.o2.proxima.direct.transaction.TransactionalOnlineAttributeWriter.TransactionRejectedException) Collections(java.util.Collections) Assert.assertEquals(org.junit.Assert.assertEquals) KeyValue(cz.o2.proxima.direct.randomaccess.KeyValue) KeyAttributes(cz.o2.proxima.transaction.KeyAttributes) StreamElement(cz.o2.proxima.storage.StreamElement) KeyAttribute(cz.o2.proxima.transaction.KeyAttribute) CommitCallback(cz.o2.proxima.direct.core.CommitCallback) CountDownLatch(java.util.concurrent.CountDownLatch) Response(cz.o2.proxima.transaction.Response) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) ArrayBlockingQueue(java.util.concurrent.ArrayBlockingQueue)

Example 2 with KeyAttributes

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);
}
Also used : Transaction(cz.o2.proxima.direct.transaction.TransactionalOnlineAttributeWriter.Transaction) TransactionalOnlineAttributeWriter(cz.o2.proxima.direct.transaction.TransactionalOnlineAttributeWriter) TransactionRejectedException(cz.o2.proxima.direct.transaction.TransactionalOnlineAttributeWriter.TransactionRejectedException) ArrayList(java.util.ArrayList) StreamElement(cz.o2.proxima.storage.StreamElement) KeyAttribute(cz.o2.proxima.transaction.KeyAttribute) CountDownLatch(java.util.concurrent.CountDownLatch)

Example 3 with KeyAttributes

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);
}
Also used : TransactionalOnlineAttributeWriter(cz.o2.proxima.direct.transaction.TransactionalOnlineAttributeWriter) ArrayList(java.util.ArrayList) StreamElement(cz.o2.proxima.storage.StreamElement) KeyAttribute(cz.o2.proxima.transaction.KeyAttribute) CountDownLatch(java.util.concurrent.CountDownLatch) Transaction(cz.o2.proxima.direct.transaction.TransactionalOnlineAttributeWriter.Transaction) TransactionRejectedException(cz.o2.proxima.direct.transaction.TransactionalOnlineAttributeWriter.TransactionRejectedException)

Example 4 with KeyAttributes

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);
}
Also used : Arrays(java.util.Arrays) Transaction(cz.o2.proxima.direct.transaction.TransactionalOnlineAttributeWriter.Transaction) ConfigConstants(cz.o2.proxima.repository.ConfigConstants) EntityDescriptor(cz.o2.proxima.repository.EntityDescriptor) Random(java.util.Random) ByteBuffer(java.nio.ByteBuffer) Wildcard(cz.o2.proxima.repository.EntityAwareAttributeDescriptor.Wildcard) ExceptionUtils(cz.o2.proxima.util.ExceptionUtils) CachedView(cz.o2.proxima.direct.view.CachedView) StreamElement(cz.o2.proxima.storage.StreamElement) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) TransformationRunner(cz.o2.proxima.util.TransformationRunner) Map(java.util.Map) After(org.junit.After) TransactionResourceManager(cz.o2.proxima.direct.transaction.TransactionResourceManager) Optionals(cz.o2.proxima.util.Optionals) Flags(cz.o2.proxima.transaction.Response.Flags) BlockingQueue(java.util.concurrent.BlockingQueue) ObserveHandle(cz.o2.proxima.direct.commitlog.ObserveHandle) UUID(java.util.UUID) CommitCallback(cz.o2.proxima.direct.core.CommitCallback) Collectors(java.util.stream.Collectors) ArrayBlockingQueue(java.util.concurrent.ArrayBlockingQueue) CountDownLatch(java.util.concurrent.CountDownLatch) List(java.util.List) Slf4j(lombok.extern.slf4j.Slf4j) KeyValue(cz.o2.proxima.direct.randomaccess.KeyValue) Response(cz.o2.proxima.transaction.Response) Optional(java.util.Optional) DirectDataOperator(cz.o2.proxima.direct.core.DirectDataOperator) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) OnlineAttributeWriter(cz.o2.proxima.direct.core.OnlineAttributeWriter) AtomicReference(java.util.concurrent.atomic.AtomicReference) ArrayList(java.util.ArrayList) ClientTransactionManager(cz.o2.proxima.direct.transaction.ClientTransactionManager) Regular(cz.o2.proxima.repository.EntityAwareAttributeDescriptor.Regular) ConfigFactory(com.typesafe.config.ConfigFactory) ExecutorService(java.util.concurrent.ExecutorService) DeclaredThreadSafe(cz.o2.proxima.annotations.DeclaredThreadSafe) TransactionalOnlineAttributeWriter(cz.o2.proxima.direct.transaction.TransactionalOnlineAttributeWriter) Before(org.junit.Before) Repository(cz.o2.proxima.repository.Repository) Config(com.typesafe.config.Config) Assert.assertTrue(org.junit.Assert.assertTrue) KeyAttribute(cz.o2.proxima.transaction.KeyAttribute) KeyAttributes(cz.o2.proxima.transaction.KeyAttributes) Test(org.junit.Test) TimeUnit(java.util.concurrent.TimeUnit) TransactionRejectedException(cz.o2.proxima.direct.transaction.TransactionalOnlineAttributeWriter.TransactionRejectedException) Collections(java.util.Collections) Assert.assertEquals(org.junit.Assert.assertEquals) KeyValue(cz.o2.proxima.direct.randomaccess.KeyValue) KeyAttributes(cz.o2.proxima.transaction.KeyAttributes) StreamElement(cz.o2.proxima.storage.StreamElement) KeyAttribute(cz.o2.proxima.transaction.KeyAttribute) CommitCallback(cz.o2.proxima.direct.core.CommitCallback) CountDownLatch(java.util.concurrent.CountDownLatch) Response(cz.o2.proxima.transaction.Response) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) ArrayBlockingQueue(java.util.concurrent.ArrayBlockingQueue)

Example 5 with KeyAttributes

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;
}
Also used : ArrayList(java.util.ArrayList) StreamElement(cz.o2.proxima.storage.StreamElement)

Aggregations

StreamElement (cz.o2.proxima.storage.StreamElement)7 ArrayList (java.util.ArrayList)7 TransactionalOnlineAttributeWriter (cz.o2.proxima.direct.transaction.TransactionalOnlineAttributeWriter)6 Transaction (cz.o2.proxima.direct.transaction.TransactionalOnlineAttributeWriter.Transaction)6 TransactionRejectedException (cz.o2.proxima.direct.transaction.TransactionalOnlineAttributeWriter.TransactionRejectedException)6 KeyAttribute (cz.o2.proxima.transaction.KeyAttribute)6 CountDownLatch (java.util.concurrent.CountDownLatch)6 Config (com.typesafe.config.Config)2 ConfigFactory (com.typesafe.config.ConfigFactory)2 DeclaredThreadSafe (cz.o2.proxima.annotations.DeclaredThreadSafe)2 ObserveHandle (cz.o2.proxima.direct.commitlog.ObserveHandle)2 CommitCallback (cz.o2.proxima.direct.core.CommitCallback)2 DirectDataOperator (cz.o2.proxima.direct.core.DirectDataOperator)2 OnlineAttributeWriter (cz.o2.proxima.direct.core.OnlineAttributeWriter)2 KeyValue (cz.o2.proxima.direct.randomaccess.KeyValue)2 ClientTransactionManager (cz.o2.proxima.direct.transaction.ClientTransactionManager)2 TransactionResourceManager (cz.o2.proxima.direct.transaction.TransactionResourceManager)2 CachedView (cz.o2.proxima.direct.view.CachedView)2 ConfigConstants (cz.o2.proxima.repository.ConfigConstants)2 Regular (cz.o2.proxima.repository.EntityAwareAttributeDescriptor.Regular)2