Search in sources :

Example 11 with RegionLocations

use of org.apache.hadoop.hbase.RegionLocations in project hbase by apache.

the class MetaCache method cacheLocation.

/**
   * Put a newly discovered HRegionLocation into the cache.
   * @param tableName The table name.
   * @param source the source of the new location
   * @param location the new location
   */
public void cacheLocation(final TableName tableName, final ServerName source, final HRegionLocation location) {
    assert source != null;
    byte[] startKey = location.getRegionInfo().getStartKey();
    ConcurrentMap<byte[], RegionLocations> tableLocations = getTableLocations(tableName);
    RegionLocations locations = new RegionLocations(new HRegionLocation[] { location });
    RegionLocations oldLocations = tableLocations.putIfAbsent(startKey, locations);
    boolean isNewCacheEntry = (oldLocations == null);
    if (isNewCacheEntry) {
        if (LOG.isTraceEnabled()) {
            LOG.trace("Cached location: " + location);
        }
        addToCachedServers(locations);
        return;
    }
    // If the server in cache sends us a redirect, assume it's always valid.
    HRegionLocation oldLocation = oldLocations.getRegionLocation(location.getRegionInfo().getReplicaId());
    boolean force = oldLocation != null && oldLocation.getServerName() != null && oldLocation.getServerName().equals(source);
    // For redirect if the number is equal to previous
    // record, the most common case is that first the region was closed with seqNum, and then
    // opened with the same seqNum; hence we will ignore the redirect.
    // There are so many corner cases with various combinations of opens and closes that
    // an additional counter on top of seqNum would be necessary to handle them all.
    RegionLocations updatedLocations = oldLocations.updateLocation(location, false, force);
    if (oldLocations != updatedLocations) {
        boolean replaced = tableLocations.replace(startKey, oldLocations, updatedLocations);
        if (replaced && LOG.isTraceEnabled()) {
            LOG.trace("Changed cached location to: " + location);
        }
        addToCachedServers(updatedLocations);
    }
}
Also used : RegionLocations(org.apache.hadoop.hbase.RegionLocations) HRegionLocation(org.apache.hadoop.hbase.HRegionLocation)

Example 12 with RegionLocations

use of org.apache.hadoop.hbase.RegionLocations in project hbase by apache.

the class RpcRetryingCallerWithReadReplicas method call.

/**
   * <p>
   * Algo:
   * - we put the query into the execution pool.
   * - after x ms, if we don't have a result, we add the queries for the secondary replicas
   * - we take the first answer
   * - when done, we cancel what's left. Cancelling means:
   * - removing from the pool if the actual call was not started
   * - interrupting the call if it has started
   * Client side, we need to take into account
   * - a call is not executed immediately after being put into the pool
   * - a call is a thread. Let's not multiply the number of thread by the number of replicas.
   * Server side, if we can cancel when it's still in the handler pool, it's much better, as a call
   * can take some i/o.
   * </p>
   * Globally, the number of retries, timeout and so on still applies, but it's per replica,
   * not global. We continue until all retries are done, or all timeouts are exceeded.
   */
public Result call(int operationTimeout) throws DoNotRetryIOException, InterruptedIOException, RetriesExhaustedException {
    boolean isTargetReplicaSpecified = (get.getReplicaId() >= 0);
    RegionLocations rl = getRegionLocations(true, (isTargetReplicaSpecified ? get.getReplicaId() : RegionReplicaUtil.DEFAULT_REPLICA_ID), cConnection, tableName, get.getRow());
    final ResultBoundedCompletionService<Result> cs = new ResultBoundedCompletionService<>(this.rpcRetryingCallerFactory, pool, rl.size());
    int startIndex = 0;
    int endIndex = rl.size();
    if (isTargetReplicaSpecified) {
        addCallsForReplica(cs, rl, get.getReplicaId(), get.getReplicaId());
        endIndex = 1;
    } else {
        addCallsForReplica(cs, rl, 0, 0);
        try {
            // wait for the timeout to see whether the primary responds back
            // Yes, microseconds
            Future<Result> f = cs.poll(timeBeforeReplicas, TimeUnit.MICROSECONDS);
            if (f != null) {
                //great we got a response
                return f.get();
            }
        } catch (ExecutionException e) {
            // We ignore the ExecutionException and continue with the secondary replicas
            if (LOG.isDebugEnabled()) {
                LOG.debug("Primary replica returns " + e.getCause());
            }
            // Skip the result from the primary as we know that there is something wrong
            startIndex = 1;
        } catch (CancellationException e) {
            throw new InterruptedIOException();
        } catch (InterruptedException e) {
            throw new InterruptedIOException();
        }
        // submit call for the all of the secondaries at once
        addCallsForReplica(cs, rl, 1, rl.size() - 1);
    }
    try {
        Future<Result> f = cs.pollForFirstSuccessfullyCompletedTask(operationTimeout, TimeUnit.MILLISECONDS, startIndex, endIndex);
        if (f == null) {
            throw new RetriesExhaustedException("timed out after " + operationTimeout + " ms");
        }
        return f.get();
    } catch (ExecutionException e) {
        throwEnrichedException(e, retries);
    } catch (CancellationException e) {
        throw new InterruptedIOException();
    } catch (InterruptedException e) {
        throw new InterruptedIOException();
    } finally {
        // We get there because we were interrupted or because one or more of the
        // calls succeeded or failed. In all case, we stop all our tasks.
        cs.cancelAll();
    }
    // unreachable
    LOG.error("Imposible? Arrive at an unreachable line...");
    // unreachable
    return null;
}
Also used : RegionLocations(org.apache.hadoop.hbase.RegionLocations) InterruptedIOException(java.io.InterruptedIOException) CancellationException(java.util.concurrent.CancellationException) ExecutionException(java.util.concurrent.ExecutionException)

Example 13 with RegionLocations

use of org.apache.hadoop.hbase.RegionLocations in project hbase by apache.

the class ZKAsyncRegistry method tryComplete.

private static void tryComplete(MutableInt remaining, HRegionLocation[] locs, CompletableFuture<RegionLocations> future) {
    remaining.decrement();
    if (remaining.intValue() > 0) {
        return;
    }
    future.complete(new RegionLocations(locs));
}
Also used : RegionLocations(org.apache.hadoop.hbase.RegionLocations)

Example 14 with RegionLocations

use of org.apache.hadoop.hbase.RegionLocations in project hbase by apache.

the class ZooKeeperRegistry method getMetaRegionLocation.

@Override
public RegionLocations getMetaRegionLocation() throws IOException {
    ZooKeeperKeepAliveConnection zkw = hci.getKeepAliveZooKeeperWatcher();
    try {
        if (LOG.isTraceEnabled()) {
            LOG.trace("Looking up meta region location in ZK," + " connection=" + this);
        }
        List<ServerName> servers = new MetaTableLocator().blockUntilAvailable(zkw, hci.rpcTimeout, hci.getConfiguration());
        if (LOG.isTraceEnabled()) {
            if (servers == null) {
                LOG.trace("Looked up meta region location, connection=" + this + "; servers = null");
            } else {
                StringBuilder str = new StringBuilder();
                for (ServerName s : servers) {
                    str.append(s.toString());
                    str.append(" ");
                }
                LOG.trace("Looked up meta region location, connection=" + this + "; servers = " + str.toString());
            }
        }
        if (servers == null)
            return null;
        HRegionLocation[] locs = new HRegionLocation[servers.size()];
        int i = 0;
        for (ServerName server : servers) {
            HRegionInfo h = RegionReplicaUtil.getRegionInfoForReplica(HRegionInfo.FIRST_META_REGIONINFO, i);
            if (server == null)
                locs[i++] = null;
            else
                locs[i++] = new HRegionLocation(h, server, 0);
        }
        return new RegionLocations(locs);
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        return null;
    } finally {
        zkw.close();
    }
}
Also used : HRegionInfo(org.apache.hadoop.hbase.HRegionInfo) RegionLocations(org.apache.hadoop.hbase.RegionLocations) MetaTableLocator(org.apache.hadoop.hbase.zookeeper.MetaTableLocator) HRegionLocation(org.apache.hadoop.hbase.HRegionLocation) ServerName(org.apache.hadoop.hbase.ServerName)

Example 15 with RegionLocations

use of org.apache.hadoop.hbase.RegionLocations in project hbase by apache.

the class MetaCache method clearCache.

/**
   * Delete a cached location, no matter what it is. Called when we were told to not use cache.
   * @param tableName tableName
   * @param row
   */
public void clearCache(final TableName tableName, final byte[] row) {
    ConcurrentMap<byte[], RegionLocations> tableLocations = getTableLocations(tableName);
    RegionLocations regionLocations = getCachedLocation(tableName, row);
    if (regionLocations != null) {
        byte[] startKey = regionLocations.getRegionLocation().getRegionInfo().getStartKey();
        boolean removed = tableLocations.remove(startKey, regionLocations);
        if (removed) {
            if (metrics != null) {
                metrics.incrMetaCacheNumClearRegion();
            }
            if (LOG.isTraceEnabled()) {
                LOG.trace("Removed " + regionLocations + " from cache");
            }
        }
    }
}
Also used : RegionLocations(org.apache.hadoop.hbase.RegionLocations)

Aggregations

RegionLocations (org.apache.hadoop.hbase.RegionLocations)47 HRegionLocation (org.apache.hadoop.hbase.HRegionLocation)28 ServerName (org.apache.hadoop.hbase.ServerName)18 HRegionInfo (org.apache.hadoop.hbase.HRegionInfo)13 Test (org.junit.Test)9 IOException (java.io.IOException)8 InterruptedIOException (java.io.InterruptedIOException)7 ArrayList (java.util.ArrayList)6 Result (org.apache.hadoop.hbase.client.Result)6 TableName (org.apache.hadoop.hbase.TableName)5 DoNotRetryIOException (org.apache.hadoop.hbase.DoNotRetryIOException)4 MetaTableAccessor (org.apache.hadoop.hbase.MetaTableAccessor)4 Pair (org.apache.hadoop.hbase.util.Pair)4 HashMap (java.util.HashMap)3 HashSet (java.util.HashSet)2 CancellationException (java.util.concurrent.CancellationException)2 ExecutionException (java.util.concurrent.ExecutionException)2 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)2 HBaseIOException (org.apache.hadoop.hbase.HBaseIOException)2 HColumnDescriptor (org.apache.hadoop.hbase.HColumnDescriptor)2