blob: 1d0d93b3ef2692a251af28f65f1ec35472dc175b [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.accumulo.fate;
import java.io.Serializable;
import java.util.EnumSet;
import java.util.List;
/**
* Read only access to a Transaction Store.
*
* A transaction consists of a number of operations. Instances of this class may check on the queue
* of outstanding transactions but may neither modify them nor create new ones.
*/
public interface ReadOnlyTStore<T> {
/**
* Possible operational status codes. Serialized by name within stores.
*/
enum TStatus {
/** Unseeded transaction */
NEW,
/** Transaction is eligible to be executing */
IN_PROGRESS,
/** Transaction has failed, and is in the process of being rolled back */
FAILED_IN_PROGRESS,
/** Transaction has failed and has been fully rolled back */
FAILED,
/** Transaction has succeeded */
SUCCESSFUL,
/** Unrecognized or unknown transaction state */
UNKNOWN
}
/**
* Reserve a transaction that is IN_PROGRESS or FAILED_IN_PROGRESS.
*
* Reserving a transaction id ensures that nothing else in-process interacting via the same
* instance will be operating on that transaction id.
*
* @return a transaction id that is safe to interact with, chosen by the store.
*/
long reserve();
/**
* Reserve the specific tid.
*
* Reserving a transaction id ensures that nothing else in-process interacting via the same
* instance will be operating on that transaction id.
*
*/
void reserve(long tid);
/**
* Return the given transaction to the store.
*
* upon successful return the store now controls the referenced transaction id. caller should no
* longer interact with it.
*
* @param tid
* transaction id, previously reserved.
* @param deferTime
* time in millis to keep this transaction out of the pool used in the {@link #reserve()
* reserve} method. must be non-negative.
*/
void unreserve(long tid, long deferTime);
/**
* Get the current operation for the given transaction id.
*
* Caller must have already reserved tid.
*
* @param tid
* transaction id, previously reserved.
* @return a read-only view of the operation
*/
ReadOnlyRepo<T> top(long tid);
/**
* Get all operations on a transactions stack. Element 0 contains the most recent operation pushed
* or the top.
*/
List<ReadOnlyRepo<T>> getStack(long tid);
/**
* Get the state of a given transaction.
*
* Caller must have already reserved tid.
*
* @param tid
* transaction id, previously reserved.
* @return execution status
*/
TStatus getStatus(long tid);
/**
* Wait for the status of a transaction to change
*
* @param tid
* transaction id, need not have been reserved.
* @param expected
* a set of possible statuses we are interested in being notified about. may not be null.
* @return execution status.
*/
TStatus waitForStatusChange(long tid, EnumSet<TStatus> expected);
/**
* Retrieve a transaction-specific property.
*
* Caller must have already reserved tid.
*
* @param tid
* transaction id, previously reserved.
* @param prop
* name of property to retrieve.
*/
Serializable getProperty(long tid, String prop);
/**
* list all transaction ids in store.
*
* @return all outstanding transactions, including those reserved by others.
*/
List<Long> list();
/**
* Retrieve the creation time of a FaTE transaction.
*
* @param tid
* Transaction id, previously reserved.
* @return creation time of transaction.
*/
long timeCreated(long tid);
}