asf.waitUntilDone(); if (asf.hasError()) { errors.add(asf.getErrors());
@Test public void testFail() throws Exception { MyAsyncProcess ap = new MyAsyncProcess(createHConnection(), CONF); List<Put> puts = new ArrayList<>(1); Put p = createPut(1, false); puts.add(p); AsyncRequestFuture ars = ap.submit(null, DUMMY_TABLE, puts, false, null, true); Assert.assertEquals(0, puts.size()); ars.waitUntilDone(); verifyResult(ars, false); Assert.assertEquals(NB_RETRIES + 1, ap.callsCt.get()); Assert.assertEquals(1, ars.getErrors().exceptions.size()); Assert.assertTrue("was: " + ars.getErrors().exceptions.get(0), failure.equals(ars.getErrors().exceptions.get(0))); Assert.assertTrue("was: " + ars.getErrors().exceptions.get(0), failure.equals(ars.getErrors().exceptions.get(0))); Assert.assertEquals(1, ars.getFailedOperations().size()); Assert.assertTrue("was: " + ars.getFailedOperations().get(0), p.equals(ars.getFailedOperations().get(0))); }
@Test public void testSuccessivePut() throws Exception { MyAsyncProcess ap = new MyAsyncProcess(createHConnection(), CONF); List<Put> puts = new ArrayList<>(1); puts.add(new Put(GOOD_ROW).addColumn(FAMILY, FAMILY, FAMILY)); final int expectedSize = puts.size(); AsyncRequestFuture arf = ap.submit(DUMMY_TABLE, puts); arf.waitUntilDone(); Object[] result = arf.getResults(); assertEquals(expectedSize, result.length); for (Object r : result) { assertEquals(Result.class, r.getClass()); } assertTrue(puts.isEmpty()); assertActionsInProgress(arf); }
private static void assertError(AsyncRequestFuture arf, int expectedCountOfFailure) { assertTrue(arf.hasError()); RetriesExhaustedWithDetailsException e = arf.getErrors(); List<Throwable> errors = e.getCauses(); assertEquals(expectedCountOfFailure, errors.size()); for (Throwable t : errors) { assertTrue(t instanceof IOException); } }
@Test public void testFailAndSuccess() throws Exception { MyAsyncProcess ap = new MyAsyncProcess(createHConnection(), CONF); List<Put> puts = new ArrayList<>(3); puts.add(createPut(1, false)); puts.add(createPut(1, true)); puts.add(createPut(1, true)); AsyncRequestFuture ars = ap.submit(null, DUMMY_TABLE, puts, false, null, true); Assert.assertTrue(puts.isEmpty()); ars.waitUntilDone(); verifyResult(ars, false, true, true); Assert.assertEquals(NB_RETRIES + 1, ap.callsCt.get()); ap.callsCt.set(0); Assert.assertEquals(1, ars.getErrors().actions.size()); puts.add(createPut(1, true)); // Wait for AP to be free. While ars might have the result, ap counters are decreased later. ap.waitForMaximumCurrentTasks(0, null); ars = ap.submit(null, DUMMY_TABLE, puts, false, null, true); Assert.assertEquals(0, puts.size()); ars.waitUntilDone(); Assert.assertEquals(1, ap.callsCt.get()); verifyResult(ars, true); }
@Test public void testSubmitWithCB() throws Exception { ClusterConnection hc = createHConnection(); final AtomicInteger updateCalled = new AtomicInteger(0); Batch.Callback<Object> cb = new Batch.Callback<Object>() { @Override public void update(byte[] region, byte[] row, Object result) { updateCalled.incrementAndGet(); } }; MyAsyncProcess ap = new MyAsyncProcess(hc, CONF); List<Put> puts = new ArrayList<>(1); puts.add(createPut(1, true)); final AsyncRequestFuture ars = ap.submit(null, DUMMY_TABLE, puts, false, cb, false); Assert.assertTrue(puts.isEmpty()); ars.waitUntilDone(); Assert.assertEquals(1, updateCalled.get()); }
@Test public void testFlush() throws Exception { MyAsyncProcess ap = new MyAsyncProcess(createHConnection(), CONF); List<Put> puts = new ArrayList<>(3); puts.add(createPut(1, false)); puts.add(createPut(1, true)); puts.add(createPut(1, true)); AsyncRequestFuture ars = ap.submit(null, DUMMY_TABLE, puts, false, null, true); ars.waitUntilDone(); verifyResult(ars, false, true, true); Assert.assertEquals(NB_RETRIES + 1, ap.callsCt.get()); Assert.assertEquals(1, ars.getFailedOperations().size()); }
@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()); } }
private void verifyResult(AsyncRequestFuture ars, boolean... expected) throws Exception { Object[] actual = ars.getResults(); Assert.assertEquals(expected.length, actual.length); for (int i = 0; i < expected.length; ++i) { Assert.assertEquals(expected[i], !(actual[i] instanceof Throwable)); } }
@Test public void testFailAndSuccess() throws Exception { MyAsyncProcess ap = new MyAsyncProcess(createHConnection(), CONF); List<Put> puts = new ArrayList<>(3); puts.add(createPut(1, false)); puts.add(createPut(1, true)); puts.add(createPut(1, true)); AsyncRequestFuture ars = ap.submit(null, DUMMY_TABLE, puts, false, null, true); Assert.assertTrue(puts.isEmpty()); ars.waitUntilDone(); verifyResult(ars, false, true, true); Assert.assertEquals(NB_RETRIES + 1, ap.callsCt.get()); ap.callsCt.set(0); Assert.assertEquals(1, ars.getErrors().actions.size()); puts.add(createPut(1, true)); // Wait for AP to be free. While ars might have the result, ap counters are decreased later. ap.waitForMaximumCurrentTasks(0, null); ars = ap.submit(null, DUMMY_TABLE, puts, false, null, true); Assert.assertEquals(0, puts.size()); ars.waitUntilDone(); Assert.assertEquals(1, ap.callsCt.get()); verifyResult(ars, true); }
private static void assertError(AsyncRequestFuture arf, int expectedCountOfFailure) { assertTrue(arf.hasError()); RetriesExhaustedWithDetailsException e = arf.getErrors(); List<Throwable> errors = e.getCauses(); assertEquals(expectedCountOfFailure, errors.size()); for (Throwable t : errors) { assertTrue(t instanceof IOException); } }
.build(); AsyncRequestFuture reqs = ap.submit(task); reqs.waitUntilDone();
@Test public void testFlush() throws Exception { MyAsyncProcess ap = new MyAsyncProcess(createHConnection(), CONF); List<Put> puts = new ArrayList<>(3); puts.add(createPut(1, false)); puts.add(createPut(1, true)); puts.add(createPut(1, true)); AsyncRequestFuture ars = ap.submit(null, DUMMY_TABLE, puts, false, null, true); ars.waitUntilDone(); verifyResult(ars, false, true, true); Assert.assertEquals(NB_RETRIES + 1, ap.callsCt.get()); Assert.assertEquals(1, ars.getFailedOperations().size()); }
@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()); } }
private void verifyReplicaResult(AsyncRequestFuture ars, RR... expecteds) throws Exception { Object[] actuals = ars.getResults(); Assert.assertEquals(expecteds.length, actuals.length); for (int i = 0; i < expecteds.length; ++i) { Object actual = actuals[i]; RR expected = expecteds[i]; Assert.assertEquals(actual.toString(), expected == RR.FAILED, actual instanceof Throwable); if (expected != RR.FAILED && expected != RR.DONT_CARE) { Assert.assertEquals(expected == RR.TRUE, ((Result)actual).isStale()); } } }
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(); } }
@Test public void testFailedPut() throws Exception { MyAsyncProcess ap = new MyAsyncProcess(createHConnection(), CONF); List<Put> puts = new ArrayList<>(2); puts.add(new Put(GOOD_ROW).addColumn(FAMILY, FAMILY, FAMILY)); // this put should fail puts.add(new Put(BAD_ROW).addColumn(FAMILY, FAMILY, FAMILY)); final int expectedSize = puts.size(); AsyncRequestFuture arf = ap.submit(DUMMY_TABLE, puts); arf.waitUntilDone(); // There is a failed puts assertError(arf, 1); Object[] result = arf.getResults(); assertEquals(expectedSize, result.length); assertEquals(Result.class, result[0].getClass()); assertTrue(result[1] instanceof IOException); assertTrue(puts.isEmpty()); assertActionsInProgress(arf); }
@Test public void testFail() throws Exception { MyAsyncProcess ap = new MyAsyncProcess(createHConnection(), CONF); List<Put> puts = new ArrayList<>(1); Put p = createPut(1, false); puts.add(p); AsyncRequestFuture ars = ap.submit(null, DUMMY_TABLE, puts, false, null, true); Assert.assertEquals(0, puts.size()); ars.waitUntilDone(); verifyResult(ars, false); Assert.assertEquals(NB_RETRIES + 1, ap.callsCt.get()); Assert.assertEquals(1, ars.getErrors().exceptions.size()); Assert.assertTrue("was: " + ars.getErrors().exceptions.get(0), failure.equals(ars.getErrors().exceptions.get(0))); Assert.assertTrue("was: " + ars.getErrors().exceptions.get(0), failure.equals(ars.getErrors().exceptions.get(0))); Assert.assertEquals(1, ars.getFailedOperations().size()); Assert.assertTrue("was: " + ars.getFailedOperations().get(0), p.equals(ars.getFailedOperations().get(0))); }
@Test public void testSubmitWithCB() throws Exception { ClusterConnection hc = createHConnection(); final AtomicInteger updateCalled = new AtomicInteger(0); Batch.Callback<Object> cb = new Batch.Callback<Object>() { @Override public void update(byte[] region, byte[] row, Object result) { updateCalled.incrementAndGet(); } }; MyAsyncProcess ap = new MyAsyncProcess(hc, CONF); List<Put> puts = new ArrayList<>(1); puts.add(createPut(1, true)); final AsyncRequestFuture ars = ap.submit(null, DUMMY_TABLE, puts, false, cb, false); Assert.assertTrue(puts.isEmpty()); ars.waitUntilDone(); Assert.assertEquals(1, updateCalled.get()); }
private void verifyResult(AsyncRequestFuture ars, boolean... expected) throws Exception { Object[] actual = ars.getResults(); Assert.assertEquals(expected.length, actual.length); for (int i = 0; i < expected.length; ++i) { Assert.assertEquals(expected[i], !(actual[i] instanceof Throwable)); } }