| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.ignite.internal.processors.cache.transactions; |
| |
| import java.util.Collection; |
| import java.util.Map; |
| import java.util.Set; |
| import java.util.UUID; |
| import org.apache.ignite.internal.IgniteInternalFuture; |
| import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; |
| import org.apache.ignite.internal.processors.cache.CacheObject; |
| import org.apache.ignite.internal.processors.cache.GridCacheContext; |
| import org.apache.ignite.internal.processors.cache.GridCacheEntryEx; |
| import org.apache.ignite.internal.processors.cache.GridCacheEntryRemovedException; |
| import org.apache.ignite.internal.processors.cache.GridCacheFilterFailedException; |
| import org.apache.ignite.internal.processors.cache.GridCacheMvccCandidate; |
| import org.apache.ignite.internal.processors.cache.KeyCacheObject; |
| import org.apache.ignite.internal.processors.cache.mvcc.MvccSnapshot; |
| import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; |
| import org.apache.ignite.internal.transactions.IgniteTxTimeoutCheckedException; |
| import org.apache.ignite.internal.util.lang.GridTuple; |
| import org.apache.ignite.lang.IgniteUuid; |
| import org.apache.ignite.transactions.TransactionConcurrency; |
| import org.apache.ignite.transactions.TransactionIsolation; |
| import org.apache.ignite.transactions.TransactionState; |
| import org.jetbrains.annotations.Contract; |
| import org.jetbrains.annotations.Nullable; |
| |
| /** |
| * Transaction managed by cache ({@code 'Ex'} stands for external). |
| */ |
| public interface IgniteInternalTx { |
| /** |
| * |
| */ |
| @SuppressWarnings("PublicInnerClass") |
| public enum FinalizationStatus { |
| /** Transaction was not finalized yet. */ |
| NONE, |
| |
| /** Transaction is being finalized by user. */ |
| USER_FINISH, |
| |
| /** Transaction is being finalized by recovery procedure. */ |
| RECOVERY_FINISH |
| } |
| |
| /** |
| * @return {@code True} if transaction started on the node initiated cache operation. |
| */ |
| public boolean localResult(); |
| |
| /** |
| * Gets unique identifier for this transaction. |
| * |
| * @return Transaction UID. |
| */ |
| public IgniteUuid xid(); |
| |
| /** |
| * ID of the node on which this transaction started. |
| * |
| * @return Originating node ID. |
| */ |
| public UUID nodeId(); |
| |
| /** |
| * ID of the thread in which this transaction started. |
| * |
| * @return Thread ID. |
| */ |
| public long threadId(); |
| |
| /** |
| * Start time of this transaction. |
| * |
| * @return Start time of this transaction on this node. |
| */ |
| public long startTime(); |
| |
| /** |
| * Start time of this transaction in nanoseconds to measure duration. |
| * |
| * @return Start time of this transaction in nanoseconds. |
| */ |
| public long startTimeNanos(); |
| |
| /** |
| * Cache transaction isolation level. |
| * |
| * @return Isolation level. |
| */ |
| public TransactionIsolation isolation(); |
| |
| /** |
| * Cache transaction concurrency mode. |
| * |
| * @return Concurrency mode. |
| */ |
| public TransactionConcurrency concurrency(); |
| |
| /** |
| * Flag indicating whether transaction was started automatically by the |
| * system or not. System will start transactions implicitly whenever |
| * any cache {@code put(..)} or {@code remove(..)} operation is invoked |
| * outside of transaction. |
| * |
| * @return {@code True} if transaction was started implicitly. |
| */ |
| public boolean implicit(); |
| |
| /** |
| * Get invalidation flag for this transaction. If set to {@code true}, then |
| * remote values will be {@code invalidated} (set to {@code null}) instead |
| * of updated. |
| * <p> |
| * Invalidation messages don't carry new values, so they are a lot lighter |
| * than update messages. However, when a value is accessed on a node after |
| * it's been invalidated, it must be loaded from persistent store. |
| * |
| * @return Invalidation flag. |
| */ |
| public boolean isInvalidate(); |
| |
| /** |
| * Gets current transaction state value. |
| * |
| * @return Current transaction state. |
| */ |
| public TransactionState state(); |
| |
| /** |
| * Gets timeout value in milliseconds for this transaction. If transaction times |
| * out prior to it's completion, {@link org.apache.ignite.internal.transactions.IgniteTxTimeoutCheckedException} will be thrown. |
| * |
| * @return Transaction timeout value. |
| */ |
| public long timeout(); |
| |
| /** |
| * Sets transaction timeout value. This value can be set only before a first operation |
| * on transaction has been performed. |
| * |
| * @param timeout Transaction timeout value. |
| * @return Previous timeout. |
| */ |
| public long timeout(long timeout); |
| |
| /** |
| * Changes transaction state from COMMITTING to MARKED_ROLLBACK. |
| * Must be called only from thread committing transaction. |
| */ |
| public void errorWhenCommitting(); |
| |
| /** |
| * Modify the transaction associated with the current thread such that the |
| * only possible outcome of the transaction is to roll back the |
| * transaction. |
| * |
| * @return {@code True} if rollback-only flag was set as a result of this operation, |
| * {@code false} if it was already set prior to this call or could not be set |
| * because transaction is already finishing up committing or rolling back. |
| */ |
| public boolean setRollbackOnly(); |
| |
| /** |
| * If transaction was marked as rollback-only. |
| * |
| * @return {@code True} if transaction can only be rolled back. |
| */ |
| public boolean isRollbackOnly(); |
| |
| /** |
| * Removes metadata by key. |
| * |
| * @param key Key of the metadata to remove. |
| * @param <T> Type of the value. |
| * @return Value of removed metadata or {@code null}. |
| */ |
| @Nullable public <T> T removeMeta(int key); |
| |
| /** |
| * Gets metadata by key. |
| * |
| * @param key Metadata key. |
| * @param <T> Type of the value. |
| * @return Metadata value or {@code null}. |
| */ |
| @Nullable public <T> T meta(int key); |
| |
| /** |
| * Adds a new metadata. |
| * |
| * @param key Metadata key. |
| * @param val Metadata value. |
| * @param <T> Type of the value. |
| * @return Metadata previously associated with given name, or |
| * {@code null} if there was none. |
| */ |
| @Nullable public <T> T addMeta(int key, T val); |
| |
| /** |
| * @return Size of the transaction. |
| */ |
| public int size(); |
| |
| /** |
| * @return {@code True} if transaction is allowed to use store. |
| */ |
| public boolean storeEnabled(); |
| |
| /** |
| * @return {@code True} if transaction is allowed to use store and transactions spans one or more caches with |
| * store enabled. |
| */ |
| public boolean storeWriteThrough(); |
| |
| /** |
| * Checks if this is system cache transaction. System transactions are isolated from user transactions |
| * because some of the public API methods may be invoked inside user transactions and internally start |
| * system cache transactions. |
| * |
| * @return {@code True} if transaction is started for system cache. |
| */ |
| public boolean system(); |
| |
| /** |
| * @return Pool where message for the given transaction must be processed. |
| */ |
| public byte ioPolicy(); |
| |
| /** |
| * @return Last recorded topology version. |
| */ |
| public AffinityTopologyVersion topologyVersion(); |
| |
| /** |
| * @return Topology version snapshot. |
| */ |
| public AffinityTopologyVersion topologyVersionSnapshot(); |
| |
| /** |
| * @return Flag indicating whether transaction is implicit with only one key. |
| */ |
| public boolean implicitSingle(); |
| |
| /** |
| * @return Transaction state. |
| */ |
| public IgniteTxState txState(); |
| |
| /** |
| * @return {@code true} or {@code false} if the deployment is enabled or disabled for all active caches involved |
| * in this transaction. |
| */ |
| public boolean activeCachesDeploymentEnabled(); |
| |
| /** |
| * @param depEnabled Flag indicating whether deployment is enabled for caches from this transaction or not. |
| */ |
| public void activeCachesDeploymentEnabled(boolean depEnabled); |
| |
| /** |
| * Attempts to set topology version and returns the current value. |
| * If topology version was previously set, then it's value will |
| * be returned (but not updated). |
| * |
| * @param topVer Topology version. |
| * @return Recorded topology version. |
| */ |
| public AffinityTopologyVersion topologyVersion(AffinityTopologyVersion topVer); |
| |
| /** |
| * @return {@code True} if transaction is empty. |
| */ |
| public boolean empty(); |
| |
| /** |
| * @param status Finalization status to set. |
| * @return {@code True} if could mark was set. |
| */ |
| public boolean markFinalizing(FinalizationStatus status); |
| |
| /** |
| * @return Finalization status. |
| */ |
| public @Nullable FinalizationStatus finalizationStatus(); |
| |
| /** |
| * @param cacheId Cache id. |
| * @param part Invalid partition. |
| */ |
| public void addInvalidPartition(int cacheId, int part); |
| |
| /** |
| * @return Invalid partitions. |
| */ |
| public Map<Integer, Set<Integer>> invalidPartitions(); |
| |
| /** |
| * Gets owned version for near remote transaction. |
| * |
| * @param key Key to get version for. |
| * @return Owned version, if any. |
| */ |
| @Nullable public GridCacheVersion ownedVersion(IgniteTxKey key); |
| |
| /** |
| * Gets ID of additional node involved. For example, in DHT case, other node is |
| * near node ID. |
| * |
| * @return Parent node IDs. |
| */ |
| @Nullable public UUID otherNodeId(); |
| |
| /** |
| * @return Event node ID. |
| */ |
| public UUID eventNodeId(); |
| |
| /** |
| * Gets node ID which directly started this transaction. In case of DHT local transaction it will be |
| * near node ID, in case of DHT remote transaction it will be primary node ID. |
| * |
| * @return Originating node ID. |
| */ |
| public UUID originatingNodeId(); |
| |
| /** |
| * @return Master node IDs. |
| */ |
| public Collection<UUID> masterNodeIds(); |
| |
| /** |
| * @return Near transaction ID. |
| */ |
| @Nullable public GridCacheVersion nearXidVersion(); |
| |
| /** |
| * @return Transaction nodes mapping (primary node -> related backup nodes). |
| */ |
| @Nullable public Map<UUID, Collection<UUID>> transactionNodes(); |
| |
| /** |
| * @param entry Entry to check. |
| * @return {@code True} if lock is owned. |
| * @throws GridCacheEntryRemovedException If entry has been removed. |
| */ |
| public boolean ownsLock(GridCacheEntryEx entry) throws GridCacheEntryRemovedException; |
| |
| /** |
| * @param entry Entry to check. |
| * @return {@code True} if lock is owned. |
| */ |
| public boolean ownsLockUnsafe(GridCacheEntryEx entry); |
| |
| /** |
| * @return {@code True} if near transaction. |
| */ |
| public boolean near(); |
| |
| /** |
| * @return {@code True} if DHT transaction. |
| */ |
| public boolean dht(); |
| |
| /** |
| * @return {@code True} if dht colocated transaction. |
| */ |
| public boolean colocated(); |
| |
| /** |
| * @return {@code True} if transaction is local, {@code false} if it's remote. |
| */ |
| public boolean local(); |
| |
| /** |
| * @return Subject ID initiated this transaction. |
| */ |
| public UUID subjectId(); |
| |
| /** |
| * Task name hash in case if transaction was initiated within task execution. |
| * |
| * @return Task name hash. |
| */ |
| public int taskNameHash(); |
| |
| /** |
| * @return {@code True} if transaction is user transaction, which means: |
| * <ul> |
| * <li>Explicit</li> |
| * <li>Local</li> |
| * <li>Not DHT</li> |
| * </ul> |
| */ |
| public boolean user(); |
| |
| /** |
| * @param key Key to check. |
| * @return {@code True} if key is present. |
| */ |
| public boolean hasWriteKey(IgniteTxKey key); |
| |
| /** |
| * @return Read set. |
| */ |
| public Set<IgniteTxKey> readSet(); |
| |
| /** |
| * @return Write set. |
| */ |
| public Set<IgniteTxKey> writeSet(); |
| |
| /** |
| * @return All transaction entries. |
| */ |
| public Collection<IgniteTxEntry> allEntries(); |
| |
| /** |
| * @return Write entries. |
| */ |
| public Collection<IgniteTxEntry> writeEntries(); |
| |
| /** |
| * @return Read entries. |
| */ |
| public Collection<IgniteTxEntry> readEntries(); |
| |
| /** |
| * @return Transaction write map. |
| */ |
| public Map<IgniteTxKey, IgniteTxEntry> writeMap(); |
| |
| /** |
| * @return Transaction read map. |
| */ |
| public Map<IgniteTxKey, IgniteTxEntry> readMap(); |
| |
| /** |
| * Gets a list of entries that needs to be locked on the next step of prepare stage of |
| * optimistic transaction. |
| * |
| * @return List of tx entries for optimistic locking. |
| */ |
| public Collection<IgniteTxEntry> optimisticLockEntries(); |
| |
| /** |
| * Seals transaction for updates. |
| */ |
| public void seal(); |
| |
| /** |
| * @param key Key for the entry. |
| * @return Entry for the key (either from write set or read set). |
| */ |
| @Nullable public IgniteTxEntry entry(IgniteTxKey key); |
| |
| /** |
| * @param ctx Cache context. |
| * @param failFast Fail-fast flag. |
| * @param key Key to look up. |
| * @return Current value for the key within transaction. |
| * @throws GridCacheFilterFailedException If filter failed and failFast is {@code true}. |
| */ |
| @Nullable public GridTuple<CacheObject> peek( |
| GridCacheContext ctx, |
| boolean failFast, |
| KeyCacheObject key) throws GridCacheFilterFailedException; |
| |
| /** |
| * @return Transaction version. |
| */ |
| public GridCacheVersion xidVersion(); |
| |
| /** |
| * @return Version created at commit time. |
| */ |
| public GridCacheVersion commitVersion(); |
| |
| /** |
| * @param commitVer Commit version. |
| */ |
| public void commitVersion(GridCacheVersion commitVer); |
| |
| /** |
| * @return Future. |
| */ |
| @Nullable public IgniteInternalFuture<?> salvageTx(); |
| |
| /** |
| * @return Transaction write version. For all transactions except DHT transactions, will be equal to |
| * {@link #xidVersion()}. |
| */ |
| public GridCacheVersion writeVersion(); |
| |
| /** |
| * Sets write version. |
| * |
| * @param ver Write version. |
| */ |
| public void writeVersion(GridCacheVersion ver); |
| |
| /** |
| * @return Future for transaction completion. |
| */ |
| public IgniteInternalFuture<IgniteInternalTx> finishFuture(); |
| |
| /** |
| * @return Future for transaction prepare if prepare is in progress. |
| */ |
| @Nullable public IgniteInternalFuture<?> currentPrepareFuture(); |
| |
| /** |
| * @param state Transaction state. |
| * @return {@code True} if transition was valid, {@code false} otherwise. |
| */ |
| public boolean state(TransactionState state); |
| |
| /** |
| * @param invalidate Invalidate flag. |
| */ |
| public void invalidate(boolean invalidate); |
| |
| /** |
| * @param sysInvalidate System invalidate flag. |
| */ |
| public void systemInvalidate(boolean sysInvalidate); |
| |
| /** |
| * @return System invalidate flag. |
| */ |
| public boolean isSystemInvalidate(); |
| |
| /** |
| * Asynchronously rollback this transaction. |
| * |
| * @return Rollback future. |
| */ |
| public IgniteInternalFuture<IgniteInternalTx> rollbackAsync(); |
| |
| /** |
| * Asynchronously commits this transaction by initiating {@code two-phase-commit} process. |
| * |
| * @return Future for commit operation. |
| */ |
| public IgniteInternalFuture<IgniteInternalTx> commitAsync(); |
| |
| /** |
| * Callback invoked whenever there is a lock that has been acquired |
| * by this transaction for any of the participating entries. |
| * |
| * @param entry Cache entry. |
| * @param owner Lock candidate that won ownership of the lock. |
| * @return {@code True} if transaction cared about notification. |
| */ |
| public boolean onOwnerChanged(GridCacheEntryEx entry, GridCacheMvccCandidate owner); |
| |
| /** |
| * @return {@code True} if transaction timed out. |
| */ |
| public boolean timedOut(); |
| |
| /** |
| * @return {@code True} if transaction had completed successfully or unsuccessfully. |
| */ |
| public boolean done(); |
| |
| /** |
| * @return {@code True} for OPTIMISTIC transactions. |
| */ |
| public boolean optimistic(); |
| |
| /** |
| * @return {@code True} for PESSIMISTIC transactions. |
| */ |
| public boolean pessimistic(); |
| |
| /** |
| * @return {@code True} if read-committed. |
| */ |
| public boolean readCommitted(); |
| |
| /** |
| * @return {@code True} if repeatable-read. |
| */ |
| public boolean repeatableRead(); |
| |
| /** |
| * @return {@code True} if serializable. |
| */ |
| public boolean serializable(); |
| |
| /** |
| * Gets allowed remaining time for this transaction. |
| * |
| * @return Remaining time. |
| * @throws IgniteTxTimeoutCheckedException If transaction timed out. |
| */ |
| public long remainingTime() throws IgniteTxTimeoutCheckedException; |
| |
| /** |
| * @return Alternate transaction versions. |
| */ |
| public Collection<GridCacheVersion> alternateVersions(); |
| |
| /** |
| * @return {@code True} if transaction needs completed versions for processing. |
| */ |
| public boolean needsCompletedVersions(); |
| |
| /** |
| * @param base Base for committed versions. |
| * @param committed Committed transactions relative to base. |
| * @param rolledback Rolled back transactions relative to base. |
| */ |
| public void completedVersions(GridCacheVersion base, |
| Collection<GridCacheVersion> committed, |
| Collection<GridCacheVersion> rolledback); |
| |
| /** |
| * @return {@code True} if transaction has at least one internal entry. |
| */ |
| public boolean internal(); |
| |
| /** |
| * @return {@code True} if transaction is a one-phase-commit transaction. |
| */ |
| public boolean onePhaseCommit(); |
| |
| /** |
| * @param e Commit error. |
| */ |
| public void commitError(Throwable e); |
| |
| /** |
| * Returns label of transactions. |
| * |
| * @return Label of transaction or {@code null} if there was not set. |
| */ |
| @Nullable public String label(); |
| |
| /** |
| * @param mvccSnapshot Mvcc snapshot. |
| */ |
| public void mvccSnapshot(MvccSnapshot mvccSnapshot); |
| |
| /** |
| * @return Mvcc snapshot. |
| */ |
| public MvccSnapshot mvccSnapshot(); |
| |
| /** |
| * @return Transaction counters. |
| * @param createIfAbsent {@code True} if non-null instance is needed. |
| */ |
| @Nullable @Contract("true -> !null;") public TxCounters txCounters(boolean createIfAbsent); |
| } |