com.bigdata.btree
Class ReadCommittedView

java.lang.Object
  extended by com.bigdata.btree.ReadCommittedView
All Implemented Interfaces:
IAutoboxBTree, IIndex, IIndexLocalCounter, ILocalBTreeView, IRangeQuery, ISimpleBTree, ICounterSetAccess

public class ReadCommittedView
extends Object
implements ILocalBTreeView

A view of a named index that replaces its view for each high-level request if there has been an intervening commit on the backing store. Each request, including each iterator request, will be read-consistent as of the commit point resolved for that request. However, subsequent requests will, of course, be read-consistent against then then current lastCommitTime.

This class is designed to work both with a Journal and with an IndexManager. For the latter, the live StoreManager.ManagedJournal will periodically be replaced by another StoreManager.ManagedJournal. This means that we need two levels of indirection. First, we need to be able to identify the current journal and read the lastCommitTime off of the current root block for that journal. Second, we need to replace the view of the BTree for the named index with the canonical read-only BTree instance loaded from the commit record corresponding to the lastCommitTime.

Note: We are not required to obtain a lock on the live journal since it will not be closed if it overflows, just closed for writes. Therefore this class will provide a read-committed view as of (a) the moment that it obtains the then current journal; and (b) checks the lastCommitTime on that journal. If there are intervening commits or an overflow event then the data will be "only slightly stale".

Note: This class has very little state of its own. The bulk of the state is on the BTree objects corresponding to the lastCommitTime. Those are thread-safe for readers and are shared across instances of this class.

Note: At any given moment, two instances of this class for the same named index MAY have a different view. However, the views will always reflect the lastCommitTime for each instance that is resolved when a method is invoked on its public API.

Version:
$Id: ReadCommittedView.java 4926 2011-07-15 19:34:25Z thompsonbry $
Author:
Bryan Thompson

Field Summary
 
Fields inherited from interface com.bigdata.btree.IRangeQuery
ALL, CURSOR, DEFAULT, DELETED, FIXED_LENGTH_SUCCESSOR, KEYS, NONE, PARALLEL, READONLY, REMOVEALL, REVERSE, VALS
 
Constructor Summary
ReadCommittedView(IResourceManager resourceManager, String name)
           
 
Method Summary
 boolean contains(byte[] key)
          Return true iff there is a (non-deleted) index entry for the key.
 boolean contains(Object key)
          Return true iff there is an entry for the key.
 IBloomFilter getBloomFilter()
          Return the bloom filter.
 BTreeCounters getBTreeCounters()
           
 ICounter getCounter()
          A restart-safe counter.
 CounterSet getCounters()
          Return performance counters.
 IndexMetadata getIndexMetadata()
          The metadata for the index.
 BTree getMutableBTree()
          The BTree that is absorbing writes for the view.
 IResourceMetadata[] getResourceMetadata()
          The description of the resources comprising the index view.
 int getSourceCount()
          The #of AbstractBTrees sources for the view.
 AbstractBTree[] getSources()
          An array containing the ordered sources in the view.
 byte[] insert(byte[] key, byte[] value)
          Insert or update a value under the key.
 Object insert(Object key, Object value)
          Insert with auto-magic handling of keys and value objects.
 byte[] lookup(byte[] key)
          Lookup a value for a key.
 Object lookup(Object key)
          Lookup a value for a key.
 long rangeCount()
          Return the #of tuples in the index.
 long rangeCount(byte[] fromKey, byte[] toKey)
          Return the #of tuples in a half-open key range.
 long rangeCountExact(byte[] fromKey, byte[] toKey)
          Return the exact #of tuples in a half-open key range.
 long rangeCountExactWithDeleted(byte[] fromKey, byte[] toKey)
          Return the exact #of tuples in a half-open key range, including any deleted tuples.
 ITupleIterator rangeIterator()
          Note: The iterators returned by this view will be read-consistent as of the lastCommitTime when they are created.
 ITupleIterator rangeIterator(byte[] fromKey, byte[] toKey)
          Return an iterator that visits the entries in a half-open key range.
 ITupleIterator rangeIterator(byte[] fromKey, byte[] toKey, int capacity, int flags, IFilter filterCtor)
          Designated variant (the one that gets overridden) for an iterator that visits the entries in a half-open key range.
 byte[] remove(byte[] key)
          Remove the key and its associated value.
 Object remove(Object key)
          Remove the key and its associated value.
 void submit(byte[] fromKey, byte[] toKey, IKeyRangeIndexProcedure proc, IResultHandler handler)
          The procedure will be transparently applied against each index partition spanned by the given key range.
 Object submit(byte[] key, ISimpleIndexProcedure proc)
          Submits an index procedure that operations on a single key to the appropriate index partition returning the result of that procedure.
 void submit(int fromIndex, int toIndex, byte[][] keys, byte[][] vals, AbstractKeyArrayIndexProcedureConstructor ctor, IResultHandler resultHandler)
          Runs a procedure against an index.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ReadCommittedView

public ReadCommittedView(IResourceManager resourceManager,
                         String name)
Parameters:
resourceManager - The object that will report to us the live journal.
name - The name of the index.
Method Detail

getCounter

public ICounter getCounter()
Description copied from interface: IIndexLocalCounter
A restart-safe counter. For an unpartitioned index, this a single counter for the entire index with an initial value of zero (0) and it is stored in the index Checkpoint record. For a partitioned index, there is a distinct counter for each index partition, the partition identifier is used as the high int32 bits of the counter, and the low int32 of the counter has an initial value of zero (0) in each index partition.

Specified by:
getCounter in interface IIndexLocalCounter

getCounters

public CounterSet getCounters()
Description copied from interface: IIndex
Return performance counters.

Interesting performance counters and other statistics about the index.

Specified by:
getCounters in interface IIndex
Specified by:
getCounters in interface ICounterSetAccess

getIndexMetadata

public IndexMetadata getIndexMetadata()
Description copied from interface: IIndex
The metadata for the index. This is full of good stuff about the index.

Specified by:
getIndexMetadata in interface IIndex

getResourceMetadata

public IResourceMetadata[] getResourceMetadata()
Description copied from interface: IIndex
The description of the resources comprising the index view.

Specified by:
getResourceMetadata in interface IIndex

contains

public boolean contains(byte[] key)
Description copied from interface: ISimpleBTree
Return true iff there is a (non-deleted) index entry for the key. An index entry with a null value will cause this method to return true. A deleted index entry will cause this method to return false.

Specified by:
contains in interface ISimpleBTree
Parameters:
key - The key.
Returns:
true if the index contains an (un-deleted) entry for that key.

contains

public boolean contains(Object key)
Description copied from interface: IAutoboxBTree
Return true iff there is an entry for the key.

Specified by:
contains in interface IAutoboxBTree
Parameters:
key - The key is implicitly converted to an unsigned byte[].
Returns:
True if the btree contains an entry for that key.

lookup

public byte[] lookup(byte[] key)
Description copied from interface: ISimpleBTree
Lookup a value for a key.

Specified by:
lookup in interface ISimpleBTree
Returns:
The value stored under that key or null if there is no entry for that key or if the entry under that key is marked as deleted.

lookup

public Object lookup(Object key)
Description copied from interface: IAutoboxBTree
Lookup a value for a key.

Specified by:
lookup in interface IAutoboxBTree
Parameters:
key - The key is implicitly converted to an unsigned byte[].
Returns:
The de-serialized value or null if there is no entry for that key.

remove

public byte[] remove(byte[] key)
Description copied from interface: ISimpleBTree
Remove the key and its associated value.

Specified by:
remove in interface ISimpleBTree
Parameters:
key - The key.
Returns:
The value stored under that key or null if the key was not found or if the previous entry under that key was marked as deleted.

remove

public Object remove(Object key)
Description copied from interface: IAutoboxBTree
Remove the key and its associated value.

Specified by:
remove in interface IAutoboxBTree
Parameters:
key - The key is implicitly converted to an unsigned byte[].
Returns:
The de-serialized value stored under that key or null if the key was not found.

insert

public byte[] insert(byte[] key,
                     byte[] value)
Description copied from interface: ISimpleBTree
Insert or update a value under the key.

Specified by:
insert in interface ISimpleBTree
Parameters:
key - The key.
value - The value (may be null).
Returns:
The previous value under that key or null if the key was not found or if the previous entry for that key was marked as deleted.

insert

public Object insert(Object key,
                     Object value)
Description copied from interface: IAutoboxBTree
Insert with auto-magic handling of keys and value objects.

Specified by:
insert in interface IAutoboxBTree
Parameters:
key - The key is implicitly converted to an unsigned byte[].
value - The value is implicitly converted to a byte[].
Returns:
The de-serialized old value -or- null if there was no value stored under that key.

rangeCount

public long rangeCount()
Description copied from interface: IRangeQuery
Return the #of tuples in the index.

Note: If the index supports deletion markers then the range count will be an upper bound and may double count tuples which have been overwritten, including the special case where the overwrite is a delete.

Specified by:
rangeCount in interface IRangeQuery
Returns:
The #of tuples in the index.

rangeCount

public long rangeCount(byte[] fromKey,
                       byte[] toKey)
Description copied from interface: IRangeQuery
Return the #of tuples in a half-open key range. The fromKey and toKey need not exist in the B+Tree.

Note: If the index supports deletion markers then the range count will be an upper bound and may double count tuples which have been overwritten, including the special case where the overwrite is a delete.

Specified by:
rangeCount in interface IRangeQuery
Parameters:
fromKey - The lowest key that will be counted (inclusive). When null there is no lower bound.
toKey - The first key that will not be counted (exclusive). When null there is no upper bound.
Returns:
The #of tuples in the half-open key range.

rangeCountExact

public long rangeCountExact(byte[] fromKey,
                            byte[] toKey)
Description copied from interface: IRangeQuery
Return the exact #of tuples in a half-open key range. The fromKey and toKey need not exist in the B+Tree.

Note: If the index supports deletion markers then this operation will require a key-range scan.

Specified by:
rangeCountExact in interface IRangeQuery
Parameters:
fromKey - The lowest key that will be counted (inclusive). When null there is no lower bound.
toKey - The first key that will not be counted (exclusive). When null there is no upper bound.
Returns:
The exact #of tuples in the half-open key range.

rangeCountExactWithDeleted

public long rangeCountExactWithDeleted(byte[] fromKey,
                                       byte[] toKey)
Description copied from interface: IRangeQuery
Return the exact #of tuples in a half-open key range, including any deleted tuples. The fromKey and toKey need not exist in the B+Tree.

When the view is just an AbstractBTree the result is the same as for IRangeQuery.rangeCount(byte[], byte[]), which already reports all tuples regardless of whether or not they are deleted.

When the index is a view with multiple sources, this operation requires a key-range scan where both deleted and undeleted tuples are visited.

Specified by:
rangeCountExactWithDeleted in interface IRangeQuery
Parameters:
fromKey - The lowest key that will be counted (inclusive). When null there is no lower bound.
toKey - The first key that will not be counted (exclusive). When null there is no upper bound.
Returns:
The exact #of deleted and undeleted tuples in the half-open key range.
See Also:
IRangeQuery.rangeCountExact(byte[], byte[])

rangeIterator

public ITupleIterator rangeIterator()
Note: The iterators returned by this view will be read-consistent as of the lastCommitTime when they are created. In order for newly committed state to be visible you must request a new iterator.

Specified by:
rangeIterator in interface IRangeQuery
Returns:
An iterator that will visit all entries in key order.

rangeIterator

public ITupleIterator rangeIterator(byte[] fromKey,
                                    byte[] toKey,
                                    int capacity,
                                    int flags,
                                    IFilter filterCtor)
Description copied from interface: IRangeQuery
Designated variant (the one that gets overridden) for an iterator that visits the entries in a half-open key range. When toKey EQ fromKey nothing will be visited. It is an error if toKey LT fromKey.

Specified by:
rangeIterator in interface IRangeQuery
Parameters:
fromKey - The first key that will be visited (inclusive lower bound). When null there is no lower bound.
toKey - The first key that will NOT be visited (exclusive upper bound). When null there is no upper bound.
capacity - The #of entries to buffer at a time. This is a hint and MAY be zero (0) to use an implementation specific default capacity. A non-zero value may be used if you know that you want at most N results or if you want to override the default #of results to be buffered before sending them across a network interface. (Note that you can control the default value using IBigdataClient.Options#DEFAULT_CLIENT_RANGE_QUERY_CAPACITY).
flags - A bitwise OR of IRangeQuery.KEYS, IRangeQuery.VALS, etc.
filterCtor - An optional object used to construct a stacked iterator. When IRangeQuery.CURSOR is specified in flags, the base iterator will implement ITupleCursor and the first filter in the stack can safely cast the source iterator to an ITupleCursor. If the outermost filter in the stack does not implement ITupleIterator, then it will be wrapped an ITupleIterator.
See Also:
SuccessorUtil, which may be used to compute the successor of a value before encoding it as a component of a key., BytesUtil#successor(byte[]), which may be used to compute the successor of an encoded key., IFilterConstructor, which may be used to construct an iterator stack performing filtering or other operations.

rangeIterator

public ITupleIterator rangeIterator(byte[] fromKey,
                                    byte[] toKey)
Description copied from interface: IRangeQuery
Return an iterator that visits the entries in a half-open key range. When toKey EQ fromKey nothing will be visited. It is an error if toKey LT fromKey.

Specified by:
rangeIterator in interface IRangeQuery
Parameters:
fromKey - The first key that will be visited (inclusive lower bound). When null there is no lower bound.
toKey - The first key that will NOT be visited (exclusive upper bound). When null there is no upper bound.
See Also:
SuccessorUtil, which may be used to compute the successor of a value before encoding it as a component of a key., BytesUtil#successor(byte[]), which may be used to compute the successor of an encoded key., EntryFilter, which may be used to filter the entries visited by the iterator.

submit

public void submit(byte[] fromKey,
                   byte[] toKey,
                   IKeyRangeIndexProcedure proc,
                   IResultHandler handler)
Description copied from interface: IIndex
The procedure will be transparently applied against each index partition spanned by the given key range.

Note: Since this variant of submit() does not split keys the fromIndex and toIndex in the Splits reported to the IResultHandler will be zero (0).

Specified by:
submit in interface IIndex
Parameters:
fromKey - The lower bound (inclusive) -or- null if there is no lower bound.
toKey - The upper bound (exclusive) -or- null if there is no upper bound.
proc - The procedure. If the procedure implements the IParallelizableIndexProcedure marker interface then it MAY be executed in parallel against the relevant index partition(s).

submit

public Object submit(byte[] key,
                     ISimpleIndexProcedure proc)
Description copied from interface: IIndex
Submits an index procedure that operations on a single key to the appropriate index partition returning the result of that procedure.

Specified by:
submit in interface IIndex
Parameters:
key - The key.
proc - The procedure.
Returns:
The value returned by IIndexProcedure.apply(IIndex)

submit

public void submit(int fromIndex,
                   int toIndex,
                   byte[][] keys,
                   byte[][] vals,
                   AbstractKeyArrayIndexProcedureConstructor ctor,
                   IResultHandler resultHandler)
Description copied from interface: IIndex
Runs a procedure against an index.

Note: This may be used to send custom logic together with the data to a remote index or index partition. When the index is remote both the procedure and the return value MUST be Serializable.

Note: The scale-out indices add support for auto-split of the procedure such that it runs locally against each relevant index partition.

Specified by:
submit in interface IIndex
Parameters:
fromIndex - The index of the first key to be used (inclusive).
toIndex - The index of the last key to be used (exclusive).
keys - The keys (required).
vals - The values (optional depending on the procedure).
ctor - An object that can create instances of the procedure.
resultHandler - When defined, results from each procedure application will be reported to this object.

getBTreeCounters

public final BTreeCounters getBTreeCounters()

getBloomFilter

public IBloomFilter getBloomFilter()
Description copied from interface: ILocalBTreeView
Return the bloom filter.

Specified by:
getBloomFilter in interface ILocalBTreeView
Returns:
The bloom filter if one exists and otherwise null.

getMutableBTree

public BTree getMutableBTree()
Description copied from interface: ILocalBTreeView
The BTree that is absorbing writes for the view.

Specified by:
getMutableBTree in interface ILocalBTreeView

getSourceCount

public int getSourceCount()
Description copied from interface: ILocalBTreeView
The #of AbstractBTrees sources for the view. This will be ONE (1) if the view is a BTree.

Specified by:
getSourceCount in interface ILocalBTreeView

getSources

public AbstractBTree[] getSources()
Description copied from interface: ILocalBTreeView
An array containing the ordered sources in the view. Changes to the array DO NOT affect the view. If the view is an AbstractBTree then the array will contain a single element which is that AbstractBTree.

Specified by:
getSources in interface ILocalBTreeView


Copyright © 2006-2011 SYSTAP, LLC. All Rights Reserved.