Search in sources :

Example 1 with KeyAttribute

use of cz.o2.proxima.transaction.KeyAttribute 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 KeyAttribute

use of cz.o2.proxima.transaction.KeyAttribute 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 KeyAttribute

use of cz.o2.proxima.transaction.KeyAttribute 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 KeyAttribute

use of cz.o2.proxima.transaction.KeyAttribute 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 KeyAttribute

use of cz.o2.proxima.transaction.KeyAttribute in project proxima-platform by O2-Czech-Republic.

the class TransactionLogObserverTest method testCreateTransactionCommitWithConflictInOutputs.

@Test(timeout = 10000)
public void testCreateTransactionCommitWithConflictInOutputs() throws InterruptedException {
    createObserver();
    ClientTransactionManager clientManager = direct.getClientTransactionManager();
    String t1 = UUID.randomUUID().toString();
    String t2 = UUID.randomUUID().toString();
    BlockingQueue<Pair<String, Response>> responseQueue = new ArrayBlockingQueue<>(1);
    clientManager.begin(t1, ExceptionUtils.uncheckedBiConsumer((k, v) -> responseQueue.put(Pair.of(k, v))), Collections.singletonList(KeyAttributes.ofAttributeDescriptor(user, "u1", userGateways, 1L, "1")));
    Pair<String, Response> t1OpenResponse = responseQueue.take();
    List<KeyAttribute> t1Outputs = Collections.singletonList(KeyAttributes.ofAttributeDescriptor(user, "user", userGateways, t1OpenResponse.getSecond().getSeqId(), "1"));
    clientManager.begin(t2, ExceptionUtils.uncheckedBiConsumer((k, v) -> responseQueue.put(Pair.of(k, v))), // not conflicting with the previous one
    Collections.singletonList(KeyAttributes.ofAttributeDescriptor(user, "u2", userGateways, 1L, "1")));
    Pair<String, Response> t2OpenResponse = responseQueue.take();
    List<KeyAttribute> t2Outputs = Collections.singletonList(KeyAttributes.ofAttributeDescriptor(user, "user", userGateways, t2OpenResponse.getSecond().getSeqId(), "1"));
    clientManager.commit(t2, t2Outputs);
    Pair<String, Response> response = responseQueue.take();
    assertEquals("commit", response.getFirst());
    assertEquals(Response.Flags.COMMITTED, response.getSecond().getFlags());
    clientManager.commit(t1, t1Outputs);
    response = responseQueue.take();
    assertEquals("commit", response.getFirst());
    assertEquals(Response.Flags.ABORTED, response.getSecond().getFlags());
}
Also used : Iterables(com.google.common.collect.Iterables) ServerTransactionManager(cz.o2.proxima.direct.transaction.ServerTransactionManager) EntityDescriptor(cz.o2.proxima.repository.EntityDescriptor) ConfigUtils(cz.o2.proxima.repository.config.ConfigUtils) Wildcard(cz.o2.proxima.repository.EntityAwareAttributeDescriptor.Wildcard) ExceptionUtils(cz.o2.proxima.util.ExceptionUtils) Lists(com.google.common.collect.Lists) ClientTransactionManager(cz.o2.proxima.direct.transaction.ClientTransactionManager) StreamElement(cz.o2.proxima.storage.StreamElement) Pair(cz.o2.proxima.util.Pair) TransformationRunner(cz.o2.proxima.util.TransformationRunner) After(org.junit.After) TransactionResourceManager(cz.o2.proxima.direct.transaction.TransactionResourceManager) ConfigFactory(com.typesafe.config.ConfigFactory) URI(java.net.URI) Before(org.junit.Before) Repository(cz.o2.proxima.repository.Repository) Config(com.typesafe.config.Config) Request(cz.o2.proxima.transaction.Request) AttributeDescriptor(cz.o2.proxima.repository.AttributeDescriptor) KeyAttribute(cz.o2.proxima.transaction.KeyAttribute) Set(java.util.Set) KeyAttributes(cz.o2.proxima.transaction.KeyAttributes) BlockingQueue(java.util.concurrent.BlockingQueue) Test(org.junit.Test) UUID(java.util.UUID) Sets(com.google.common.collect.Sets) TimeUnit(java.util.concurrent.TimeUnit) ArrayBlockingQueue(java.util.concurrent.ArrayBlockingQueue) AtomicLong(java.util.concurrent.atomic.AtomicLong) List(java.util.List) Response(cz.o2.proxima.transaction.Response) State(cz.o2.proxima.transaction.State) DirectDataOperator(cz.o2.proxima.direct.core.DirectDataOperator) Assert(org.junit.Assert) Collections(java.util.Collections) Response(cz.o2.proxima.transaction.Response) ArrayBlockingQueue(java.util.concurrent.ArrayBlockingQueue) ClientTransactionManager(cz.o2.proxima.direct.transaction.ClientTransactionManager) KeyAttribute(cz.o2.proxima.transaction.KeyAttribute) Pair(cz.o2.proxima.util.Pair) Test(org.junit.Test)

Aggregations

KeyAttribute (cz.o2.proxima.transaction.KeyAttribute)20 StreamElement (cz.o2.proxima.storage.StreamElement)17 Test (org.junit.Test)17 Transaction (cz.o2.proxima.direct.transaction.TransactionalOnlineAttributeWriter.Transaction)10 ArrayList (java.util.ArrayList)8 CountDownLatch (java.util.concurrent.CountDownLatch)8 EntityDescriptor (cz.o2.proxima.repository.EntityDescriptor)7 Repository (cz.o2.proxima.repository.Repository)7 Response (cz.o2.proxima.transaction.Response)7 Config (com.typesafe.config.Config)6 ConfigFactory (com.typesafe.config.ConfigFactory)6 DirectDataOperator (cz.o2.proxima.direct.core.DirectDataOperator)6 ClientTransactionManager (cz.o2.proxima.direct.transaction.ClientTransactionManager)6 TransactionResourceManager (cz.o2.proxima.direct.transaction.TransactionResourceManager)6 TransactionalOnlineAttributeWriter (cz.o2.proxima.direct.transaction.TransactionalOnlineAttributeWriter)6 TransactionRejectedException (cz.o2.proxima.direct.transaction.TransactionalOnlineAttributeWriter.TransactionRejectedException)6 Wildcard (cz.o2.proxima.repository.EntityAwareAttributeDescriptor.Wildcard)6 KeyAttributes (cz.o2.proxima.transaction.KeyAttributes)6 ExceptionUtils (cz.o2.proxima.util.ExceptionUtils)6 TransformationRunner (cz.o2.proxima.util.TransformationRunner)6