Search in sources :

Example 16 with TiClientInternalException

use of com.pingcap.tikv.exception.TiClientInternalException in project tispark by pingcap.

the class IndexScanIterator method hasNext.

@Override
public boolean hasNext() {
    try {
        if (rowIterator == null) {
            TiSession session = snapshot.getSession();
            while (handleIterator.hasNext()) {
                List<Handle> handles = feedBatch();
                batchCount++;
                completionService.submit(() -> {
                    List<RegionTask> tasks = new ArrayList<>();
                    List<Long> ids = dagReq.getPrunedPhysicalIds();
                    tasks.addAll(RangeSplitter.newSplitter(session.getRegionManager()).splitAndSortHandlesByRegion(ids, handles));
                    return CoprocessorIterator.getRowIterator(dagReq, tasks, session);
                });
            }
            while (batchCount > 0) {
                rowIterator = completionService.take().get();
                batchCount--;
                if (rowIterator.hasNext()) {
                    return true;
                }
            }
        }
        if (rowIterator == null) {
            return false;
        }
    } catch (Exception e) {
        throw new TiClientInternalException("Error reading rows from handle", e);
    }
    return rowIterator.hasNext();
}
Also used : RegionTask(com.pingcap.tikv.util.RangeSplitter.RegionTask) TiClientInternalException(com.pingcap.tikv.exception.TiClientInternalException) ArrayList(java.util.ArrayList) TiSession(com.pingcap.tikv.TiSession) TiClientInternalException(com.pingcap.tikv.exception.TiClientInternalException) NoSuchElementException(java.util.NoSuchElementException) Handle(com.pingcap.tikv.key.Handle)

Example 17 with TiClientInternalException

use of com.pingcap.tikv.exception.TiClientInternalException in project tispark by pingcap.

the class ScanIterator method cacheLoadFails.

// return true if current cache is not loaded or empty
boolean cacheLoadFails() {
    if (endOfScan || processingLastBatch) {
        return true;
    }
    if (startKey == null) {
        return true;
    }
    try {
        TiRegion region = loadCurrentRegionToCache();
        ByteString curRegionEndKey = region.getEndKey();
        // See https://github.com/pingcap/tispark/issues/393 for details
        if (currentCache == null) {
            return true;
        }
        index = 0;
        Key lastKey;
        // of a transaction. Otherwise below code might lose data
        if (currentCache.size() < limit) {
            startKey = curRegionEndKey;
            lastKey = Key.toRawKey(curRegionEndKey);
        } else if (currentCache.size() > limit) {
            throw new IndexOutOfBoundsException("current cache size = " + currentCache.size() + ", larger than " + limit);
        } else {
            // Start new scan from exact next key in current region
            lastKey = Key.toRawKey(currentCache.get(currentCache.size() - 1).getKey());
            startKey = lastKey.next().toByteString();
        }
        // if startKey is empty, it indicates +∞
        if (hasEndKey && lastKey.compareTo(endKey) >= 0 || startKey.isEmpty()) {
            processingLastBatch = true;
            startKey = null;
        }
    } catch (Exception e) {
        throw new TiClientInternalException("Error scanning data from region.", e);
    }
    return false;
}
Also used : TiClientInternalException(com.pingcap.tikv.exception.TiClientInternalException) ByteString(com.google.protobuf.ByteString) TiRegion(com.pingcap.tikv.region.TiRegion) Key(com.pingcap.tikv.key.Key) GrpcException(com.pingcap.tikv.exception.GrpcException) TiClientInternalException(com.pingcap.tikv.exception.TiClientInternalException)

Example 18 with TiClientInternalException

use of com.pingcap.tikv.exception.TiClientInternalException in project tispark by pingcap.

the class LockResolverClientV3 method resolveLock.

private void resolveLock(BackOffer bo, Lock lock, TxnStatus txnStatus, Set<RegionVerID> cleanRegion) {
    boolean cleanWholeRegion = lock.getTxnSize() >= BIG_TXN_THRESHOLD;
    while (true) {
        region = regionManager.getRegionByKey(lock.getKey());
        if (cleanRegion.contains(region.getVerID())) {
            return;
        }
        Kvrpcpb.ResolveLockRequest.Builder builder = Kvrpcpb.ResolveLockRequest.newBuilder().setContext(region.getContext()).setStartVersion(lock.getTxnID());
        if (txnStatus.isCommitted()) {
            // txn is committed with commitTS txnStatus
            builder.setCommitVersion(txnStatus.getCommitTS());
        }
        if (lock.getTxnSize() < BIG_TXN_THRESHOLD) {
            // Only resolve specified keys when it is a small transaction,
            // prevent from scanning the whole region in this case.
            builder.addKeys(lock.getKey());
        }
        Supplier<Kvrpcpb.ResolveLockRequest> factory = builder::build;
        KVErrorHandler<Kvrpcpb.ResolveLockResponse> handler = new KVErrorHandler<>(regionManager, this, this, resp -> resp.hasRegionError() ? resp.getRegionError() : null, resp -> resp.hasError() ? resp.getError() : null, resolveLockResult -> null, 0L, false);
        Kvrpcpb.ResolveLockResponse resp = callWithRetry(bo, TikvGrpc.getKvResolveLockMethod(), factory, handler);
        if (resp == null) {
            logger.error("getKvResolveLockMethod failed without a cause");
            regionManager.onRequestFail(region);
            bo.doBackOff(BoRegionMiss, new TiClientInternalException("getKvResolveLockMethod failed without a cause"));
            continue;
        }
        if (resp.hasRegionError()) {
            bo.doBackOff(BoRegionMiss, new RegionException(resp.getRegionError()));
            continue;
        }
        if (resp.hasError()) {
            logger.error(String.format("unexpected resolveLock err: %s, lock: %s", resp.getError(), lock));
            throw new KeyException(resp.getError());
        }
        if (cleanWholeRegion) {
            cleanRegion.add(region.getVerID());
        }
        return;
    }
}
Also used : TiClientInternalException(com.pingcap.tikv.exception.TiClientInternalException) Kvrpcpb(org.tikv.kvproto.Kvrpcpb) KVErrorHandler(com.pingcap.tikv.operation.KVErrorHandler) RegionException(com.pingcap.tikv.exception.RegionException) KeyException(com.pingcap.tikv.exception.KeyException)

Example 19 with TiClientInternalException

use of com.pingcap.tikv.exception.TiClientInternalException in project tispark by pingcap.

the class LockResolverClientV3 method getTxnStatus.

private TxnStatus getTxnStatus(BackOffer bo, Long txnID, ByteString primary, Long currentTS) {
    TxnStatus status = getResolved(txnID);
    if (status != null) {
        return status;
    }
    Supplier<CleanupRequest> factory = () -> {
        TiRegion primaryKeyRegion = regionManager.getRegionByKey(primary);
        return CleanupRequest.newBuilder().setContext(primaryKeyRegion.getContext()).setKey(primary).setStartVersion(txnID).setCurrentTs(currentTS).build();
    };
    status = new TxnStatus();
    while (true) {
        // new RegionStoreClient for PrimaryKey
        RegionStoreClient primaryKeyRegionStoreClient = clientBuilder.build(primary);
        TiRegion primaryKeyRegion = primaryKeyRegionStoreClient.getRegion();
        KVErrorHandler<CleanupResponse> handler = new KVErrorHandler<>(regionManager, primaryKeyRegionStoreClient, primaryKeyRegionStoreClient.lockResolverClient, resp -> resp.hasRegionError() ? resp.getRegionError() : null, resp -> resp.hasError() ? resp.getError() : null, resolveLockResult -> null, 0L, false);
        CleanupResponse resp = primaryKeyRegionStoreClient.callWithRetry(bo, TikvGrpc.getKvCleanupMethod(), factory, handler);
        if (resp == null) {
            logger.error("getKvCleanupMethod failed without a cause");
            regionManager.onRequestFail(primaryKeyRegion);
            bo.doBackOff(BoRegionMiss, new TiClientInternalException("getKvCleanupMethod failed without a cause"));
            continue;
        }
        if (resp.hasRegionError()) {
            bo.doBackOff(BoRegionMiss, new RegionException(resp.getRegionError()));
            continue;
        }
        if (resp.hasError()) {
            Kvrpcpb.KeyError keyError = resp.getError();
            // the TTL.
            if (keyError.hasLocked()) {
                Kvrpcpb.LockInfo lockInfo = keyError.getLocked();
                return new TxnStatus(lockInfo.getLockTtl(), 0L);
            }
            logger.error(String.format("unexpected cleanup err: %s, tid: %d", keyError, txnID));
            throw new KeyException(keyError);
        }
        if (resp.getCommitVersion() != 0) {
            status = new TxnStatus(0L, resp.getCommitVersion());
        }
        saveResolved(txnID, status);
        return status;
    }
}
Also used : Kvrpcpb(org.tikv.kvproto.Kvrpcpb) KVErrorHandler(com.pingcap.tikv.operation.KVErrorHandler) RegionException(com.pingcap.tikv.exception.RegionException) KeyException(com.pingcap.tikv.exception.KeyException) CleanupResponse(org.tikv.kvproto.Kvrpcpb.CleanupResponse) TiClientInternalException(com.pingcap.tikv.exception.TiClientInternalException) TiRegion(com.pingcap.tikv.region.TiRegion) CleanupRequest(org.tikv.kvproto.Kvrpcpb.CleanupRequest) RegionStoreClient(com.pingcap.tikv.region.RegionStoreClient) AbstractRegionStoreClient(com.pingcap.tikv.region.AbstractRegionStoreClient)

Example 20 with TiClientInternalException

use of com.pingcap.tikv.exception.TiClientInternalException in project tispark by pingcap.

the class LockResolverClientV4 method getTxnStatus.

/**
 * getTxnStatus sends the CheckTxnStatus request to the TiKV server. When rollbackIfNotExist is
 * false, the caller should be careful with the TxnNotFoundException error.
 */
private TxnStatus getTxnStatus(BackOffer bo, Long txnID, ByteString primary, Long callerStartTS, Long currentTS, boolean rollbackIfNotExist, Lock lock) {
    TxnStatus status = getResolved(txnID);
    if (status != null) {
        return status;
    }
    // CheckTxnStatus may meet the following cases:
    // 1. LOCK
    // 1.1 Lock expired -- orphan lock, fail to update TTL, crash recovery etc.
    // 1.2 Lock TTL -- active transaction holding the lock.
    // 2. NO LOCK
    // 2.1 Txn Committed
    // 2.2 Txn Rollbacked -- rollback itself, rollback by others, GC tomb etc.
    // 2.3 No lock -- pessimistic lock rollback, concurrence prewrite.
    Supplier<Kvrpcpb.CheckTxnStatusRequest> factory = () -> {
        TiRegion primaryKeyRegion = regionManager.getRegionByKey(primary);
        return Kvrpcpb.CheckTxnStatusRequest.newBuilder().setContext(primaryKeyRegion.getContext()).setPrimaryKey(primary).setLockTs(txnID).setCallerStartTs(callerStartTS).setCurrentTs(currentTS).setRollbackIfNotExist(rollbackIfNotExist).build();
    };
    while (true) {
        // new RegionStoreClient for PrimaryKey
        RegionStoreClient primaryKeyRegionStoreClient = clientBuilder.build(primary);
        TiRegion primaryKeyRegion = primaryKeyRegionStoreClient.getRegion();
        KVErrorHandler<Kvrpcpb.CheckTxnStatusResponse> handler = new KVErrorHandler<>(regionManager, primaryKeyRegionStoreClient, primaryKeyRegionStoreClient.lockResolverClient, resp -> resp.hasRegionError() ? resp.getRegionError() : null, resp -> resp.hasError() ? resp.getError() : null, resolveLockResult -> null, callerStartTS, false);
        Kvrpcpb.CheckTxnStatusResponse resp = primaryKeyRegionStoreClient.callWithRetry(bo, TikvGrpc.getKvCheckTxnStatusMethod(), factory, handler);
        if (resp == null) {
            logger.error("getKvCheckTxnStatusMethod failed without a cause");
            regionManager.onRequestFail(primaryKeyRegion);
            bo.doBackOff(BoRegionMiss, new TiClientInternalException("getKvCheckTxnStatusMethod failed without a cause"));
            continue;
        }
        if (resp.hasRegionError()) {
            bo.doBackOff(BoRegionMiss, new RegionException(resp.getRegionError()));
            continue;
        }
        if (resp.hasError()) {
            Kvrpcpb.KeyError keyError = resp.getError();
            if (keyError.hasTxnNotFound()) {
                throw new TxnNotFoundException();
            }
            logger.error(String.format("unexpected cleanup err: %s, tid: %d", keyError, txnID));
            throw new KeyException(keyError);
        }
        status = new TxnStatus();
        status.setAction(resp.getAction());
        status.setPrimaryLock(resp.getLockInfo());
        if (status.getPrimaryLock() != null && status.getPrimaryLock().getUseAsyncCommit()) {
            if (!TsoUtils.isExpired(txnID, resp.getLockTtl())) {
                status.setTtl(resp.getLockTtl());
            }
        } else if (resp.getLockTtl() != 0) {
            status.setTtl(resp.getLockTtl());
        } else {
            status.setCommitTS(resp.getCommitVersion());
            // change.
            if (status.isCommitted() || (lock != null && lock.getLockType() != org.tikv.kvproto.Kvrpcpb.Op.PessimisticLock)) {
                saveResolved(txnID, status);
            }
        }
        return status;
    }
}
Also used : Kvrpcpb(org.tikv.kvproto.Kvrpcpb) TxnNotFoundException(com.pingcap.tikv.exception.TxnNotFoundException) KVErrorHandler(com.pingcap.tikv.operation.KVErrorHandler) RegionException(com.pingcap.tikv.exception.RegionException) KeyException(com.pingcap.tikv.exception.KeyException) TiClientInternalException(com.pingcap.tikv.exception.TiClientInternalException) TiRegion(com.pingcap.tikv.region.TiRegion) RegionStoreClient(com.pingcap.tikv.region.RegionStoreClient) AbstractRegionStoreClient(com.pingcap.tikv.region.AbstractRegionStoreClient)

Aggregations

TiClientInternalException (com.pingcap.tikv.exception.TiClientInternalException)25 KeyException (com.pingcap.tikv.exception.KeyException)11 RegionException (com.pingcap.tikv.exception.RegionException)10 KVErrorHandler (com.pingcap.tikv.operation.KVErrorHandler)10 Kvrpcpb (org.tikv.kvproto.Kvrpcpb)7 ByteString (com.google.protobuf.ByteString)6 TiRegion (com.pingcap.tikv.region.TiRegion)6 ArrayList (java.util.ArrayList)6 RegionStoreClient (com.pingcap.tikv.region.RegionStoreClient)5 GrpcException (com.pingcap.tikv.exception.GrpcException)4 AbstractRegionStoreClient (com.pingcap.tikv.region.AbstractRegionStoreClient)4 HashMap (java.util.HashMap)4 TiKVException (com.pingcap.tikv.exception.TiKVException)3 Lock (com.pingcap.tikv.txn.Lock)3 ResolveLockResult (com.pingcap.tikv.txn.ResolveLockResult)3 BoTxnLock (com.pingcap.tikv.util.BackOffFunction.BackOffFuncType.BoTxnLock)3 List (java.util.List)3 Map (java.util.Map)3 DAGRequest (com.pingcap.tidb.tipb.DAGRequest)2 SelectResponse (com.pingcap.tidb.tipb.SelectResponse)2