Search in sources :

Example 1 with Commit

use of io.atomix.primitive.service.Commit in project atomix by atomix.

the class PrimaryElectorService method enter.

/**
 * Applies an {@link PrimaryElectorOperations.Enter} commit.
 *
 * @param commit commit entry
 * @return topic leader. If no previous leader existed this is the node that just entered the race.
 */
protected PrimaryTerm enter(Commit<? extends PrimaryElectorOperations.Enter> commit) {
    try {
        PartitionId partitionId = commit.value().partitionId();
        PrimaryTerm oldTerm = term(partitionId);
        Registration registration = new Registration(commit.value().member(), commit.session().sessionId().id());
        PrimaryTerm newTerm = elections.compute(partitionId, (k, v) -> {
            if (v == null) {
                return new ElectionState(partitionId, registration, elections);
            } else {
                if (!v.isDuplicate(registration)) {
                    return new ElectionState(v).addRegistration(registration);
                } else {
                    return v;
                }
            }
        }).term();
        if (!Objects.equals(oldTerm, newTerm)) {
            notifyTermChange(partitionId, newTerm);
            scheduleRebalance();
        }
        return newTerm;
    } catch (Exception e) {
        getLogger().error("State machine operation failed", e);
        throw Throwables.propagate(e);
    }
}
Also used : ServiceExecutor(io.atomix.primitive.service.ServiceExecutor) Arrays(java.util.Arrays) BufferInput(io.atomix.storage.buffer.BufferInput) CHANGE(io.atomix.primitive.partition.impl.PrimaryElectorEvents.CHANGE) PrimaryElectionEvent(io.atomix.primitive.partition.PrimaryElectionEvent) HashMap(java.util.HashMap) PartitionId(io.atomix.primitive.partition.PartitionId) LinkedHashMap(java.util.LinkedHashMap) Lists(com.google.common.collect.Lists) Duration(java.time.Duration) Map(java.util.Map) PrimaryTerm(io.atomix.primitive.partition.PrimaryTerm) KryoNamespace(io.atomix.utils.serializer.KryoNamespace) Session(io.atomix.primitive.session.Session) Scheduled(io.atomix.utils.concurrent.Scheduled) LinkedList(java.util.LinkedList) Commit(io.atomix.primitive.service.Commit) MoreObjects(com.google.common.base.MoreObjects) Throwables(com.google.common.base.Throwables) Set(java.util.Set) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) Member(io.atomix.primitive.partition.Member) BufferOutput(io.atomix.storage.buffer.BufferOutput) Objects(java.util.Objects) List(java.util.List) AbstractPrimitiveService(io.atomix.primitive.service.AbstractPrimitiveService) Optional(java.util.Optional) Serializer(io.atomix.utils.serializer.Serializer) PartitionId(io.atomix.primitive.partition.PartitionId) PrimaryTerm(io.atomix.primitive.partition.PrimaryTerm)

Example 2 with Commit

use of io.atomix.primitive.service.Commit in project atomix by atomix.

the class ConsistentMapService method rollback.

/**
 * Handles an rollback commit (ha!).
 *
 * @param commit transaction rollback commit
 * @return rollback result
 */
protected RollbackResult rollback(Commit<? extends TransactionRollback> commit) {
    TransactionId transactionId = commit.value().transactionId();
    TransactionScope transactionScope = activeTransactions.remove(transactionId);
    if (transactionScope == null) {
        return RollbackResult.UNKNOWN_TRANSACTION_ID;
    } else if (!transactionScope.isPrepared()) {
        discardTombstones();
        return RollbackResult.OK;
    } else {
        try {
            transactionScope.transactionLog().records().forEach(record -> {
                if (record.type() != MapUpdate.Type.VERSION_MATCH) {
                    preparedKeys.remove(record.key());
                }
            });
            return RollbackResult.OK;
        } finally {
            discardTombstones();
        }
    }
}
Also used : TransactionId(io.atomix.core.transaction.TransactionId) ServiceExecutor(io.atomix.primitive.service.ServiceExecutor) Arrays(java.util.Arrays) TransactionBegin(io.atomix.core.map.impl.ConsistentMapOperations.TransactionBegin) REMOVE_LISTENER(io.atomix.core.map.impl.ConsistentMapOperations.REMOVE_LISTENER) TransactionPrepareAndCommit(io.atomix.core.map.impl.ConsistentMapOperations.TransactionPrepareAndCommit) IS_EMPTY(io.atomix.core.map.impl.ConsistentMapOperations.IS_EMPTY) Remove(io.atomix.core.map.impl.ConsistentMapOperations.Remove) Duration(java.time.Duration) Map(java.util.Map) KEY_SET(io.atomix.core.map.impl.ConsistentMapOperations.KEY_SET) Session(io.atomix.primitive.session.Session) BEGIN(io.atomix.core.map.impl.ConsistentMapOperations.BEGIN) COMMIT(io.atomix.core.map.impl.ConsistentMapOperations.COMMIT) ENTRY_SET(io.atomix.core.map.impl.ConsistentMapOperations.ENTRY_SET) REPLACE_VERSION(io.atomix.core.map.impl.ConsistentMapOperations.REPLACE_VERSION) ADD_LISTENER(io.atomix.core.map.impl.ConsistentMapOperations.ADD_LISTENER) ReplaceVersion(io.atomix.core.map.impl.ConsistentMapOperations.ReplaceVersion) Predicate(java.util.function.Predicate) Collection(java.util.Collection) REMOVE(io.atomix.core.map.impl.ConsistentMapOperations.REMOVE) RemoveValue(io.atomix.core.map.impl.ConsistentMapOperations.RemoveValue) Set(java.util.Set) CONTAINS_KEY(io.atomix.core.map.impl.ConsistentMapOperations.CONTAINS_KEY) PUT_AND_GET(io.atomix.core.map.impl.ConsistentMapOperations.PUT_AND_GET) Versioned(io.atomix.utils.time.Versioned) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) ContainsValue(io.atomix.core.map.impl.ConsistentMapOperations.ContainsValue) Preconditions.checkState(com.google.common.base.Preconditions.checkState) BufferOutput(io.atomix.storage.buffer.BufferOutput) List(java.util.List) CHANGE(io.atomix.core.map.impl.ConsistentMapEvents.CHANGE) GET_OR_DEFAULT(io.atomix.core.map.impl.ConsistentMapOperations.GET_OR_DEFAULT) KryoNamespaces(io.atomix.utils.serializer.KryoNamespaces) TransactionPrepare(io.atomix.core.map.impl.ConsistentMapOperations.TransactionPrepare) Get(io.atomix.core.map.impl.ConsistentMapOperations.Get) Serializer(io.atomix.utils.serializer.Serializer) GET(io.atomix.core.map.impl.ConsistentMapOperations.GET) GET_ALL_PRESENT(io.atomix.core.map.impl.ConsistentMapOperations.GET_ALL_PRESENT) REMOVE_VALUE(io.atomix.core.map.impl.ConsistentMapOperations.REMOVE_VALUE) GetOrDefault(io.atomix.core.map.impl.ConsistentMapOperations.GetOrDefault) PUT_IF_ABSENT(io.atomix.core.map.impl.ConsistentMapOperations.PUT_IF_ABSENT) BufferInput(io.atomix.storage.buffer.BufferInput) TransactionCommit(io.atomix.core.map.impl.ConsistentMapOperations.TransactionCommit) Type(io.atomix.core.map.impl.MapUpdate.Type) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) CLEAR(io.atomix.core.map.impl.ConsistentMapOperations.CLEAR) Lists(com.google.common.collect.Lists) MapEvent(io.atomix.core.map.MapEvent) Replace(io.atomix.core.map.impl.ConsistentMapOperations.Replace) KryoNamespace(io.atomix.utils.serializer.KryoNamespace) REPLACE_VALUE(io.atomix.core.map.impl.ConsistentMapOperations.REPLACE_VALUE) ROLLBACK(io.atomix.core.map.impl.ConsistentMapOperations.ROLLBACK) Scheduled(io.atomix.utils.concurrent.Scheduled) REMOVE_VERSION(io.atomix.core.map.impl.ConsistentMapOperations.REMOVE_VERSION) TransactionRollback(io.atomix.core.map.impl.ConsistentMapOperations.TransactionRollback) ContainsKey(io.atomix.core.map.impl.ConsistentMapOperations.ContainsKey) Iterator(java.util.Iterator) Commit(io.atomix.primitive.service.Commit) Throwables(com.google.common.base.Throwables) RemoveVersion(io.atomix.core.map.impl.ConsistentMapOperations.RemoveVersion) SIZE(io.atomix.core.map.impl.ConsistentMapOperations.SIZE) Maps(com.google.common.collect.Maps) CONTAINS_VALUE(io.atomix.core.map.impl.ConsistentMapOperations.CONTAINS_VALUE) REPLACE(io.atomix.core.map.impl.ConsistentMapOperations.REPLACE) VALUES(io.atomix.core.map.impl.ConsistentMapOperations.VALUES) PREPARE(io.atomix.core.map.impl.ConsistentMapOperations.PREPARE) Put(io.atomix.core.map.impl.ConsistentMapOperations.Put) PUT(io.atomix.core.map.impl.ConsistentMapOperations.PUT) PREPARE_AND_COMMIT(io.atomix.core.map.impl.ConsistentMapOperations.PREPARE_AND_COMMIT) AbstractPrimitiveService(io.atomix.primitive.service.AbstractPrimitiveService) TransactionLog(io.atomix.core.transaction.TransactionLog) GetAllPresent(io.atomix.core.map.impl.ConsistentMapOperations.GetAllPresent) ReplaceValue(io.atomix.core.map.impl.ConsistentMapOperations.ReplaceValue) TransactionId(io.atomix.core.transaction.TransactionId)

Example 3 with Commit

use of io.atomix.primitive.service.Commit in project atomix by atomix.

the class DocumentTreeService method listen.

protected void listen(Commit<? extends Listen> commit) {
    Long sessionId = commit.session().sessionId().id();
    listeners.computeIfAbsent(sessionId, k -> new SessionListenCommits()).add(new Listener(commit.session(), commit.value().path()));
}
Also used : ServiceExecutor(io.atomix.primitive.service.ServiceExecutor) Arrays(java.util.Arrays) DocumentPath(io.atomix.core.tree.DocumentPath) CHANGE(io.atomix.core.tree.impl.DocumentTreeEvents.CHANGE) Kryo(com.esotericsoftware.kryo.Kryo) DocumentTree(io.atomix.core.tree.DocumentTree) Update(io.atomix.core.tree.impl.DocumentTreeOperations.Update) Type(io.atomix.core.tree.DocumentTreeEvent.Type) Status(io.atomix.core.tree.impl.DocumentTreeResult.Status) Map(java.util.Map) Get(io.atomix.core.tree.impl.DocumentTreeOperations.Get) GET(io.atomix.core.tree.impl.DocumentTreeOperations.GET) Session(io.atomix.primitive.session.Session) ADD_LISTENER(io.atomix.core.tree.impl.DocumentTreeOperations.ADD_LISTENER) Set(java.util.Set) Versioned(io.atomix.utils.time.Versioned) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) BufferOutput(io.atomix.storage.buffer.BufferOutput) Match(io.atomix.utils.Match) Queues(com.google.common.collect.Queues) List(java.util.List) Unlisten(io.atomix.core.tree.impl.DocumentTreeOperations.Unlisten) KryoNamespaces(io.atomix.utils.serializer.KryoNamespaces) Optional(java.util.Optional) Queue(java.util.Queue) Serializer(io.atomix.utils.serializer.Serializer) REMOVE_LISTENER(io.atomix.core.tree.impl.DocumentTreeOperations.REMOVE_LISTENER) Output(com.esotericsoftware.kryo.io.Output) BufferInput(io.atomix.storage.buffer.BufferInput) Listen(io.atomix.core.tree.impl.DocumentTreeOperations.Listen) HashMap(java.util.HashMap) EventType(io.atomix.primitive.event.EventType) GET_CHILDREN(io.atomix.core.tree.impl.DocumentTreeOperations.GET_CHILDREN) LinkedHashMap(java.util.LinkedHashMap) Lists(com.google.common.collect.Lists) Input(com.esotericsoftware.kryo.io.Input) UPDATE(io.atomix.core.tree.impl.DocumentTreeOperations.UPDATE) KryoNamespace(io.atomix.utils.serializer.KryoNamespace) Ordering(io.atomix.primitive.Ordering) Iterator(java.util.Iterator) Commit(io.atomix.primitive.service.Commit) Throwables(com.google.common.base.Throwables) GetChildren(io.atomix.core.tree.impl.DocumentTreeOperations.GetChildren) IllegalDocumentModificationException(io.atomix.core.tree.IllegalDocumentModificationException) AtomicLong(java.util.concurrent.atomic.AtomicLong) AbstractPrimitiveService(io.atomix.primitive.service.AbstractPrimitiveService) TreeMap(java.util.TreeMap) CLEAR(io.atomix.core.tree.impl.DocumentTreeOperations.CLEAR) DocumentTreeEvent(io.atomix.core.tree.DocumentTreeEvent) NoSuchDocumentPathException(io.atomix.core.tree.NoSuchDocumentPathException) AtomicLong(java.util.concurrent.atomic.AtomicLong)

Aggregations

Throwables (com.google.common.base.Throwables)3 Lists (com.google.common.collect.Lists)3 Sets (com.google.common.collect.Sets)3 AbstractPrimitiveService (io.atomix.primitive.service.AbstractPrimitiveService)3 Commit (io.atomix.primitive.service.Commit)3 ServiceExecutor (io.atomix.primitive.service.ServiceExecutor)3 Session (io.atomix.primitive.session.Session)3 BufferInput (io.atomix.storage.buffer.BufferInput)3 BufferOutput (io.atomix.storage.buffer.BufferOutput)3 KryoNamespace (io.atomix.utils.serializer.KryoNamespace)3 Serializer (io.atomix.utils.serializer.Serializer)3 Arrays (java.util.Arrays)3 HashMap (java.util.HashMap)3 LinkedHashMap (java.util.LinkedHashMap)3 List (java.util.List)3 Map (java.util.Map)3 Set (java.util.Set)3 Collectors (java.util.stream.Collectors)3 KryoNamespaces (io.atomix.utils.serializer.KryoNamespaces)2 Versioned (io.atomix.utils.time.Versioned)2