.setPool(pool) .setTableName(tableName) .setRowAccess(execs) .setResults(results) .setRpcTimeout(readRpcTimeoutMs)
.setPool(HTable.getDefaultExecutor(HTU.getConfiguration())) .setTableName(table.getName()) .setRowAccess(gets) .setResults(results) .setOperationTimeout(operationTimeout)
@Test public void testUncheckedException() throws Exception { // Test the case pool.submit throws unchecked exception ClusterConnection hc = createHConnection(); MyThreadPoolExecutor myPool = new MyThreadPoolExecutor(1, 20, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(200)); AsyncProcess ap = new AsyncProcessForThrowableCheck(hc, CONF); List<Put> puts = new ArrayList<>(1); puts.add(createPut(1, true)); AsyncProcessTask task = AsyncProcessTask.newBuilder() .setPool(myPool) .setRpcTimeout(RPC_TIMEOUT) .setOperationTimeout(OPERATION_TIMEOUT) .setTableName(DUMMY_TABLE) .setRowAccess(puts) .setSubmittedRows(SubmittedRows.NORMAL) .build(); ap.submit(task); Assert.assertTrue(puts.isEmpty()); }
public AsyncRequestFuture submit(TableName tableName, List<? extends Row> rows) throws InterruptedIOException { return submit(AsyncProcessTask.newBuilder() .setPool(service) .setTableName(tableName) .setRowAccess(rows) .setSubmittedRows(AsyncProcessTask.SubmittedRows.NORMAL) .setNeedResults(true) .setRpcTimeout(HConstants.DEFAULT_HBASE_RPC_TIMEOUT) .setOperationTimeout(HConstants.DEFAULT_HBASE_CLIENT_OPERATION_TIMEOUT) .build()); }
.setPool(mutator.getPool()) .setTableName(tableName) .setRowAccess(ops) .setSubmittedRows(AsyncProcessTask.SubmittedRows.AT_LEAST_ONE) .setOperationTimeout(conn.getConnectionConfiguration().getOperationTimeout())
.setPool(pool) .setTableName(tableName) .setRowAccess(rm.getMutations()) .setResults(results) .setCallable(callable)
.setPool(pool) .setTableName(tableName) .setRowAccess(rm.getMutations()) .setCallable(callable) .setRpcTimeout(writeRpcTimeoutMs)
Object[] results = new Object[1]; AsyncProcessTask task = AsyncProcessTask.newBuilder().setPool(pool).setTableName(tableName).setRowAccess(rows) .setCallable(callable)
@Test public void testReplicaAllCallsFailForOneRegion() throws Exception { // For one of the region, all 3, main and replica, calls fail. For the other, replica // call fails but its exception should not be visible as it did succeed. MyAsyncProcessWithReplicas ap = createReplicaAp(500, 1000, 0, 0); ap.addFailures(hri1, hri1r1, hri1r2, hri2r1); List<Get> rows = makeTimelineGets(DUMMY_BYTES_1, DUMMY_BYTES_2); AsyncProcessTask task = AsyncProcessTask.newBuilder() .setPool(ap.service) .setRpcTimeout(RPC_TIMEOUT) .setOperationTimeout(OPERATION_TIMEOUT) .setTableName(DUMMY_TABLE) .setRowAccess(rows) .setResults(new Object[2]) .setSubmittedRows(SubmittedRows.ALL) .build(); AsyncRequestFuture ars = ap.submit(task); verifyReplicaResult(ars, RR.FAILED, RR.FALSE); // We should get 3 exceptions, for main + 2 replicas for DUMMY_BYTES_1 Assert.assertEquals(3, ars.getErrors().getNumExceptions()); for (int i = 0; i < ars.getErrors().getNumExceptions(); ++i) { Assert.assertArrayEquals(DUMMY_BYTES_1, ars.getErrors().getRow(i).getRow()); } }
public static <R> void doBatchWithCallback(List<? extends Row> actions, Object[] results, Callback<R> callback, ClusterConnection connection, ExecutorService pool, TableName tableName) throws InterruptedIOException, RetriesExhaustedWithDetailsException { int operationTimeout = connection.getConnectionConfiguration().getOperationTimeout(); int writeTimeout = connection.getConfiguration().getInt(HConstants.HBASE_RPC_WRITE_TIMEOUT_KEY, connection.getConfiguration().getInt(HConstants.HBASE_RPC_TIMEOUT_KEY, HConstants.DEFAULT_HBASE_RPC_TIMEOUT)); AsyncProcessTask<R> task = AsyncProcessTask.newBuilder(callback) .setPool(pool) .setTableName(tableName) .setRowAccess(actions) .setResults(results) .setOperationTimeout(operationTimeout) .setRpcTimeout(writeTimeout) .setSubmittedRows(AsyncProcessTask.SubmittedRows.ALL) .build(); AsyncRequestFuture ars = connection.getAsyncProcess().submit(task); ars.waitUntilDone(); if (ars.hasError()) { throw ars.getErrors(); } }
@Test public void testReplicaReplicaSuccessWithParallelFailures() throws Exception { // Main calls fails after replica calls start. For two-replica region, one replica call // also fails. Regardless, we get replica results for both regions. MyAsyncProcessWithReplicas ap = createReplicaAp(0, 1000, 1000, 0); ap.addFailures(hri1, hri1r2, hri2); List<Get> rows = makeTimelineGets(DUMMY_BYTES_1, DUMMY_BYTES_2); AsyncProcessTask task = AsyncProcessTask.newBuilder() .setPool(ap.service) .setRpcTimeout(RPC_TIMEOUT) .setOperationTimeout(OPERATION_TIMEOUT) .setTableName(DUMMY_TABLE) .setRowAccess(rows) .setResults(new Object[2]) .setSubmittedRows(SubmittedRows.ALL) .build(); AsyncRequestFuture ars = ap.submit(task); verifyReplicaResult(ars, RR.TRUE, RR.TRUE); Assert.assertEquals(2, ap.getReplicaCallCount()); }
@Test public void testReplicaMainFailsBeforeReplicaCalls() throws Exception { // Main calls fail before replica calls can start - this is currently not handled. // It would probably never happen if we can get location (due to retries), // and it would require additional synchronization. MyAsyncProcessWithReplicas ap = createReplicaAp(1000, 0, 0, 0); ap.addFailures(hri1, hri2); List<Get> rows = makeTimelineGets(DUMMY_BYTES_1, DUMMY_BYTES_2); AsyncProcessTask task = AsyncProcessTask.newBuilder() .setPool(ap.service) .setRpcTimeout(RPC_TIMEOUT) .setOperationTimeout(OPERATION_TIMEOUT) .setTableName(DUMMY_TABLE) .setRowAccess(rows) .setResults(new Object[2]) .setSubmittedRows(SubmittedRows.ALL) .build(); AsyncRequestFuture ars = ap.submit(task); verifyReplicaResult(ars, RR.FAILED, RR.FAILED); Assert.assertEquals(0, ap.getReplicaCallCount()); }
@Test public void testReplicaPartialReplicaCall() throws Exception { // One server is slow, so the result for its region comes from replica, whereas // the result for other region comes from primary before replica calls happen. // There should be no replica call for that region at all. MyAsyncProcessWithReplicas ap = createReplicaAp(1000, 0, 0); ap.setPrimaryCallDelay(sn2, 2000); List<Get> rows = makeTimelineGets(DUMMY_BYTES_1, DUMMY_BYTES_2); AsyncProcessTask task = AsyncProcessTask.newBuilder() .setPool(ap.service) .setRpcTimeout(RPC_TIMEOUT) .setOperationTimeout(OPERATION_TIMEOUT) .setTableName(DUMMY_TABLE) .setRowAccess(rows) .setResults(new Object[2]) .setSubmittedRows(SubmittedRows.ALL) .build(); AsyncRequestFuture ars = ap.submit(task); verifyReplicaResult(ars, RR.FALSE, RR.TRUE); Assert.assertEquals(1, ap.getReplicaCallCount()); }
@Test public void testReplicaParallelCallsSucceed() throws Exception { // Either main or replica can succeed. MyAsyncProcessWithReplicas ap = createReplicaAp(0, 0, 0); List<Get> rows = makeTimelineGets(DUMMY_BYTES_1, DUMMY_BYTES_2); AsyncProcessTask task = AsyncProcessTask.newBuilder() .setPool(ap.service) .setRpcTimeout(RPC_TIMEOUT) .setOperationTimeout(OPERATION_TIMEOUT) .setTableName(DUMMY_TABLE) .setRowAccess(rows) .setResults(new Object[2]) .setSubmittedRows(SubmittedRows.ALL) .build(); AsyncRequestFuture ars = ap.submit(task); verifyReplicaResult(ars, RR.DONT_CARE, RR.DONT_CARE); long replicaCalls = ap.getReplicaCallCount(); Assert.assertTrue(replicaCalls >= 0); Assert.assertTrue(replicaCalls <= 2); }
@Test public void testReplicaReplicaSuccess() throws Exception { // Main call takes too long so replicas succeed, except for one region w/o replicas. // One region has no replica, so the main call succeeds for it. MyAsyncProcessWithReplicas ap = createReplicaAp(10, 1000, 0); List<Get> rows = makeTimelineGets(DUMMY_BYTES_1, DUMMY_BYTES_2, DUMMY_BYTES_3); AsyncProcessTask task = AsyncProcessTask.newBuilder() .setPool(ap.service) .setRpcTimeout(RPC_TIMEOUT) .setOperationTimeout(OPERATION_TIMEOUT) .setTableName(DUMMY_TABLE) .setRowAccess(rows) .setResults(new Object[3]) .setSubmittedRows(SubmittedRows.ALL) .build(); AsyncRequestFuture ars = ap.submit(task); verifyReplicaResult(ars, RR.TRUE, RR.TRUE, RR.FALSE); Assert.assertEquals(2, ap.getReplicaCallCount()); }
@Test public void testReplicaPrimarySuccessWoReplicaCalls() throws Exception { // Main call succeeds before replica calls are kicked off. MyAsyncProcessWithReplicas ap = createReplicaAp(1000, 10, 0); List<Get> rows = makeTimelineGets(DUMMY_BYTES_1, DUMMY_BYTES_2, DUMMY_BYTES_3); AsyncProcessTask task = AsyncProcessTask.newBuilder() .setPool(ap.service) .setRpcTimeout(RPC_TIMEOUT) .setOperationTimeout(OPERATION_TIMEOUT) .setTableName(DUMMY_TABLE) .setRowAccess(rows) .setResults(new Object[3]) .setSubmittedRows(SubmittedRows.ALL) .build(); AsyncRequestFuture ars = ap.submit(task); verifyReplicaResult(ars, RR.FALSE, RR.FALSE, RR.FALSE); Assert.assertEquals(0, ap.getReplicaCallCount()); }
private AsyncProcessTask createTask(QueueRowAccess access) { return new AsyncProcessTask(AsyncProcessTask.newBuilder() .setPool(pool) .setTableName(tableName) .setRowAccess(access) .setSubmittedRows(AsyncProcessTask.SubmittedRows.AT_LEAST_ONE) .build()) { @Override public int getRpcTimeout() { return rpcTimeout.get(); } @Override public int getOperationTimeout() { return operationTimeout.get(); } }; }
public void batch(final List<? extends Row> actions, final Object[] results, int rpcTimeout) throws InterruptedException, IOException { AsyncProcessTask task = AsyncProcessTask.newBuilder() .setPool(pool) .setTableName(tableName) .setRowAccess(actions) .setResults(results) .setRpcTimeout(rpcTimeout) .setOperationTimeout(operationTimeoutMs) .setSubmittedRows(AsyncProcessTask.SubmittedRows.ALL) .build(); AsyncRequestFuture ars = multiAp.submit(task); ars.waitUntilDone(); if (ars.hasError()) { throw ars.getErrors(); } }
public <CResult> AsyncRequestFuture submit(ExecutorService pool, TableName tableName, List<? extends Row> rows, boolean atLeastOne, Batch.Callback<CResult> callback, boolean needResults) throws InterruptedIOException { AsyncProcessTask task = AsyncProcessTask.newBuilder(callback) .setPool(pool == null ? service : pool) .setTableName(tableName) .setRowAccess(rows) .setSubmittedRows(atLeastOne ? SubmittedRows.AT_LEAST_ONE : SubmittedRows.NORMAL) .setNeedResults(needResults) .setRpcTimeout(conf.getInt(HConstants.HBASE_RPC_READ_TIMEOUT_KEY, HConstants.DEFAULT_HBASE_RPC_TIMEOUT)) .setOperationTimeout(conf.getInt(HConstants.HBASE_CLIENT_OPERATION_TIMEOUT, HConstants.DEFAULT_HBASE_CLIENT_OPERATION_TIMEOUT)) .build(); return submit(task); }
public AsyncRequestFuture submit(TableName tableName, List<? extends Row> rows) throws InterruptedIOException { return submit(AsyncProcessTask.newBuilder() .setPool(service) .setTableName(tableName) .setRowAccess(rows) .setSubmittedRows(AsyncProcessTask.SubmittedRows.NORMAL) .setNeedResults(true) .setRpcTimeout(HConstants.DEFAULT_HBASE_RPC_TIMEOUT) .setOperationTimeout(HConstants.DEFAULT_HBASE_CLIENT_OPERATION_TIMEOUT) .build()); }