com.bigdata.service.ndx.IScaleOutClientIndex Maven / Gradle / Ivy
/*
Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016. All rights reserved.
Contact:
SYSTAP, LLC DBA Blazegraph
2501 Calvert ST NW #106
Washington, DC 20008
[email protected]
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* Created on Mar 31, 2009
*/
package com.bigdata.service.ndx;
import java.util.Iterator;
import java.util.concurrent.atomic.AtomicInteger;
import com.bigdata.btree.ITuple;
import com.bigdata.journal.ITx;
import com.bigdata.mdi.IMetadataIndex;
import com.bigdata.mdi.PartitionLocator;
import com.bigdata.resources.StaleLocatorException;
import com.bigdata.service.AbstractScaleOutFederation;
import com.bigdata.service.IDataService;
/**
* A client-side view of a scale-out index.
*
* @author Bryan Thompson
* @version $Id$
*/
public interface IScaleOutClientIndex extends IClientIndex, ISplitter,
IAsynchronousWriteBufferFactory {
/**
* Resolve the data service to which the index partition is mapped.
*
* @param pmd
* The index partition locator.
*
* @return The data service and never null
.
*
* @throws RuntimeException
* if none of the data services identified in the index
* partition locator record could be discovered.
*/
IDataService getDataService(final PartitionLocator pmd);
/**
* Returns an iterator that will visit the {@link PartitionLocator}s for
* the specified scale-out index key range.
*
* @see AbstractScaleOutFederation#locatorScan(String, long, byte[], byte[],
* boolean)
*
* @param ts
* The timestamp that will be used to visit the locators.
* @param fromKey
* The scale-out index first key that will be visited
* (inclusive). When null
there is no lower bound.
* @param toKey
* The first scale-out index key that will NOT be visited
* (exclusive). When null
there is no upper bound.
* @param reverseScan
* true
if you need to visit the index partitions
* in reverse key order (this is done when the partitioned
* iterator is scanning backwards).
*
* @return The iterator. The value returned by {@link ITuple#getValue()}
* will be a serialized {@link PartitionLocator} object.
*/
Iterator locatorScan(final long ts, final byte[] fromKey,
final byte[] toKey, final boolean reverseScan);
/**
* Notifies the client that a {@link StaleLocatorException} was received.
* The client will use this information to refresh the
* {@link IMetadataIndex}.
*
* @param ts
* The timestamp of the metadata index view from which the
* locator was obtained.
* @param locator
* The locator that was stale.
* @param cause
* The reason why the locator became stale (split, join, or
* move).
*
* @throws RuntimeException
* unless the timestamp given is {@link ITx#UNISOLATED} or
* {@link ITx#READ_COMMITTED} since stale locators do not occur
* for other views.
*/
void staleLocator(final long ts, final PartitionLocator locator,
final StaleLocatorException cause);
/**
* Return a {@link ThreadLocal} {@link AtomicInteger} whose value is the
* recursion depth of the current {@link Thread}. This is initially zero
* when the task is submitted by the application. The value incremented when
* a task results in a {@link StaleLocatorException} and is decremented when
* returning from the recursive handling of the
* {@link StaleLocatorException}.
*
* The recursion depth is used:
*
* - to limit the #of retries due to {@link StaleLocatorException}s for
* a split of a task submitted by the application
* - to force execution of retried tasks in the caller's thread.
*
* The latter point is critical - if the retry tasks are run in the client
* {@link #getThreadPool() thread pool} then all threads in the pool can
* rapidly become busy awaiting retry tasks with the result that the client
* is essentially deadlocked.
*
* @return The recursion depth.
*/
AtomicInteger getRecursionDepth();
/**
* Return the object used to access the services in the connected
* federation.
*/
AbstractScaleOutFederation getFederation();
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy