blob: 29fbe62a91373c1422d4a9d0a8917173af6036bc [file] [log] [blame]
/*
* 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.tephra;
import java.io.InputStream;
import java.util.Collection;
import java.util.Set;
/**
* Client talking to transaction system.
* See also {@link TransactionAware}.
* todo: explain Omid.
*/
public interface TransactionSystemClient {
/**
* Starts new short transaction.
* @return instance of {@link Transaction}
*/
// TODO: "short" and "long" are very misleading names. Use transaction attributes like "detect conflicts or not", etc.
Transaction startShort();
/**
* Starts new short transaction.
* @param timeout the timeout for the transaction
* @return instance of {@link Transaction}
* @throws IllegalArgumentException if the provided timeout is negative or exceeds the configured maximum
*/
Transaction startShort(int timeout);
/**
* Starts new long transaction.
* @return instance of {@link Transaction}
*/
Transaction startLong();
// this pre-commit detects conflicts with other transactions committed so far
// NOTE: the changes set should not change after this operation, this may help us do some extra optimizations
// NOTE: there should be time constraint on how long does it take to commit changes by the client after this operation
// is submitted so that we can cleanup related resources
// NOTE: as of now you can call this method multiple times, each time the changeSet of tx will be updated. Not sure
// if we can call it a feature or a side-affect of implementation. It makes more sense to append changeset, but
// before we really need it we don't do it because it will slow down tx manager throughput.
/**
* Checks if transaction with the set of changes can be committed. E.g. it can check conflicts with other changes and
* refuse commit if there are conflicts. It is assumed that no other changes will be done in between this method call
* and {@link #commitOrThrow(Transaction)} which will check conflicts again to avoid races.
* <p/>
* Since we do conflict detection at commit time as well, this may seem redundant. The idea is to check for conflicts
* before we persist changes to avoid rollback in case of conflicts as much as possible.
* NOTE: in some situations we may want to skip this step to save on RPC with a risk of many rollback ops. So by
* default we take safe path.
*
* @param tx transaction to verify
* @param changeIds ids of changes made by transaction
* @return true if transaction can be committed otherwise false
* @throws TransactionNotInProgressException if the transaction is not in progress; most likely it has timed out.
*
* @deprecated since 0.13-incubating; use {@link #canCommitOrThrow(Transaction, Collection)} instead
*/
@Deprecated
boolean canCommit(Transaction tx, Collection<byte[]> changeIds) throws TransactionNotInProgressException;
/**
* Checks if transaction with the set of changes can be committed. E.g. it can check conflicts with other changes and
* refuse commit if there are conflicts. It is assumed that no other changes will be done in between this method call
* and {@link #commitOrThrow(Transaction)} which will check conflicts again to avoid races.
* <p/>
* Since we do conflict detection at commit time as well, this may seem redundant. The idea is to check for conflicts
* before we persist changes to avoid rollback in case of conflicts as much as possible.
* NOTE: in some situations we may want to skip this step to save on RPC with a risk of many rollback ops. So by
* default we take safe path.
*
* @param tx transaction to verify
* @param changeIds ids of changes made by transaction
*
* @throws TransactionSizeException if the size of the change set exceeds the allowed limit
* @throws TransactionConflictException if the change set has a conflict with an overlapping transaction
* @throws TransactionNotInProgressException if the transaction is not in progress; most likely it has timed out
*/
void canCommitOrThrow(Transaction tx, Collection<byte[]> changeIds)
throws TransactionFailureException;
/**
* Makes transaction visible. It will again check conflicts of changes submitted previously with
* {@link #canCommitOrThrow(Transaction, java.util.Collection)}
*
* @param tx transaction to make visible.
* @return true if transaction can be committed otherwise false
*
* @deprecated as of 0.13-incubating. Use {@link #canCommitOrThrow(Transaction, Collection)} instead.
*/
@Deprecated
boolean commit(Transaction tx) throws TransactionNotInProgressException;
/**
* Makes transaction visible. It will again check conflicts of changes submitted previously with
* {@link #canCommitOrThrow(Transaction, java.util.Collection)}
*
* @param tx transaction to make visible.
*
* @throws TransactionConflictException if the transaction has a conflict with an overlapping transaction
* @throws TransactionNotInProgressException if the transaction is not in progress; most likely it has timed out
*/
void commitOrThrow(Transaction tx) throws TransactionFailureException;
/**
* Makes transaction visible. You should call it only when all changes of this tx are undone.
* NOTE: it will not throw {@link TransactionNotInProgressException} if transaction has timed out.
* @param tx transaction to make visible.
*/
void abort(Transaction tx);
/**
* Makes transaction invalid. You should call it if not all changes of this tx could be undone.
* NOTE: it will not throw {@link TransactionNotInProgressException} if transaction has timed out.
* @param tx transaction id to invalidate.
* @return true if transaction has been successfully invalidated
*/
boolean invalidate(long tx);
/**
* Performs a checkpoint operation on the current transaction, returning a new Transaction instance with the
* updated state. A checkpoint operation assigns a new write pointer for the current transaction.
* @param tx the current transaction to checkpoint
* @return an updated transaction instance with the new write pointer
*/
Transaction checkpoint(Transaction tx) throws TransactionNotInProgressException;
/**
* Retrieves the state of the transaction manager and send it as a stream. The snapshot will not be persisted.
* @return an input stream containing an encoded snapshot of the transaction manager
*/
InputStream getSnapshotInputStream() throws TransactionCouldNotTakeSnapshotException;
/**
* Return the status of the transaction Manager
* @return a String which denotes the status of txManager
*/
String status();
/**
* Resets the state of the transaction manager.
*/
void resetState();
/**
* Removes the given transaction ids from the invalid list.
* @param invalidTxIds transaction ids
* @return true if invalid list got changed, false otherwise
*/
boolean truncateInvalidTx(Set<Long> invalidTxIds);
/**
* Removes all transaction ids started before the given time from invalid list.
* @param time time in milliseconds
* @return true if invalid list got changed, false otherwise
* @throws InvalidTruncateTimeException if there are any in-progress transactions started before given time
*/
boolean truncateInvalidTxBefore(long time) throws InvalidTruncateTimeException;
/**
* @return the size of invalid list
*/
int getInvalidSize();
/**
* Trigger transaction pruning now.
*/
void pruneNow();
}