diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/PartialIndexRebuilderIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/PartialIndexRebuilderIT.java index 9095dbe7cf0..8bf2bc8f767 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/PartialIndexRebuilderIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/PartialIndexRebuilderIT.java @@ -88,7 +88,7 @@ public static void doSetup() throws Exception { Map serverProps = Maps.newHashMapWithExpectedSize(10); serverProps.put(QueryServices.INDEX_FAILURE_HANDLING_REBUILD_ATTRIB, Boolean.TRUE.toString()); serverProps.put(QueryServices.INDEX_FAILURE_HANDLING_REBUILD_INTERVAL_ATTRIB, Long.toString(REBUILD_INTERVAL)); - serverProps.put(QueryServices.INDEX_REBUILD_DISABLE_TIMESTAMP_THRESHOLD, "300000"); // give up rebuilding after 5 minutes + serverProps.put(QueryServices.INDEX_REBUILD_DISABLE_TIMESTAMP_THRESHOLD, "50000000"); serverProps.put(QueryServices.INDEX_FAILURE_HANDLING_REBUILD_PERIOD, Long.toString(REBUILD_PERIOD)); // batch at 50 seconds serverProps.put(QueryServices.INDEX_FAILURE_HANDLING_REBUILD_OVERLAP_FORWARD_TIME_ATTRIB, Long.toString(WAIT_AFTER_DISABLED)); setUpTestDriver(new ReadOnlyProps(serverProps.entrySet().iterator()), ReadOnlyProps.EMPTY_PROPS); @@ -897,7 +897,7 @@ private void testIndexWriteFailureDuringRebuild(PIndexState indexStateOnFailure) TestUtil.removeCoprocessor(conn, fullIndexName, WriteFailingRegionObserver.class); runIndexRebuilder(); - assertTrue(TestUtil.checkIndexState(conn, fullIndexName, indexStateOnFailure == PIndexState.DISABLE ? PIndexState.INACTIVE : PIndexState.ACTIVE, null)); + assertEquals(indexStateOnFailure == PIndexState.DISABLE ? PIndexState.INACTIVE : PIndexState.ACTIVE, TestUtil.getIndexState(conn, fullIndexName)); clock.time += WAIT_AFTER_DISABLED; // First batch should have been processed again because we started over @@ -907,7 +907,9 @@ private void testIndexWriteFailureDuringRebuild(PIndexState indexStateOnFailure) clock.time += 2 * REBUILD_PERIOD; // Second batch should have been processed now runIndexRebuilder(); - assertTrue(TestUtil.checkIndexState(conn, fullIndexName, PIndexState.ACTIVE, 0L)); + clock.time += 2 * REBUILD_PERIOD; + runIndexRebuilder(); + TestUtil.assertIndexState(conn, fullIndexName, PIndexState.ACTIVE, 0L); // Verify that other batches were processed IndexScrutiny.scrutinizeIndex(conn, fullTableName, fullIndexName); diff --git a/phoenix-core/src/test/java/org/apache/phoenix/util/TestUtil.java b/phoenix-core/src/test/java/org/apache/phoenix/util/TestUtil.java index 45fd52c19b4..8b93b5c7b66 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/util/TestUtil.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/util/TestUtil.java @@ -888,14 +888,25 @@ public static void waitForIndexRebuild(Connection conn, String fullIndexName, PI waitForIndexState(conn, fullIndexName, indexState, 0L); } - private enum IndexStateCheck {SUCCESS, FAIL, KEEP_TRYING}; + private static class IndexStateCheck { + public final PIndexState indexState; + public final Long indexDisableTimestamp; + public final Boolean success; + + public IndexStateCheck(PIndexState indexState, Long indexDisableTimestamp, Boolean success) { + this.indexState = indexState; + this.indexDisableTimestamp = indexDisableTimestamp; + this.success = success; + } + } + public static void waitForIndexState(Connection conn, String fullIndexName, PIndexState expectedIndexState, Long expectedIndexDisableTimestamp) throws InterruptedException, SQLException { int maxTries = 60, nTries = 0; do { Thread.sleep(1000); // sleep 1 sec IndexStateCheck state = checkIndexStateInternal(conn, fullIndexName, expectedIndexState, expectedIndexDisableTimestamp); - if (state != IndexStateCheck.KEEP_TRYING) { - if (state == IndexStateCheck.SUCCESS) { + if (state.success != null) { + if (Boolean.TRUE.equals(state.success)) { return; } fail("Index state will not become " + expectedIndexState); @@ -905,8 +916,26 @@ public static void waitForIndexState(Connection conn, String fullIndexName, PInd } public static boolean checkIndexState(Connection conn, String fullIndexName, PIndexState expectedIndexState, Long expectedIndexDisableTimestamp) throws SQLException { - return checkIndexStateInternal(conn,fullIndexName, expectedIndexState, expectedIndexDisableTimestamp) == IndexStateCheck.SUCCESS; + return Boolean.TRUE.equals(checkIndexStateInternal(conn,fullIndexName, expectedIndexState, expectedIndexDisableTimestamp).success); + } + + public static void assertIndexState(Connection conn, String fullIndexName, PIndexState expectedIndexState, Long expectedIndexDisableTimestamp) throws SQLException { + IndexStateCheck state = checkIndexStateInternal(conn,fullIndexName, expectedIndexState, expectedIndexDisableTimestamp); + if (!Boolean.TRUE.equals(state.success)) { + if (expectedIndexState != null) { + assertEquals(expectedIndexState, state.indexState); + } + if (expectedIndexDisableTimestamp != null) { + assertEquals(expectedIndexDisableTimestamp, state.indexDisableTimestamp); + } + } + } + + public static PIndexState getIndexState(Connection conn, String fullIndexName) throws SQLException { + IndexStateCheck state = checkIndexStateInternal(conn, fullIndexName, null, null); + return state.indexState; } + private static IndexStateCheck checkIndexStateInternal(Connection conn, String fullIndexName, PIndexState expectedIndexState, Long expectedIndexDisableTimestamp) throws SQLException { String schema = SchemaUtil.getSchemaNameFromFullName(fullIndexName); String index = SchemaUtil.getTableNameFromFullName(fullIndexName); @@ -915,19 +944,21 @@ private static IndexStateCheck checkIndexStateInternal(Connection conn, String f + ") = (" + "'" + schema + "','" + index + "') " + "AND " + PhoenixDatabaseMetaData.COLUMN_FAMILY + " IS NULL AND " + PhoenixDatabaseMetaData.COLUMN_NAME + " IS NULL"; ResultSet rs = conn.createStatement().executeQuery(query); + Long actualIndexDisableTimestamp = null; + PIndexState actualIndexState = null; if (rs.next()) { - Long actualIndexDisableTimestamp = rs.getLong(1); - PIndexState actualIndexState = PIndexState.fromSerializedValue(rs.getString(2)); + actualIndexDisableTimestamp = rs.getLong(1); + actualIndexState = PIndexState.fromSerializedValue(rs.getString(2)); boolean matchesExpected = (expectedIndexDisableTimestamp == null || Objects.equal(actualIndexDisableTimestamp, expectedIndexDisableTimestamp)) - && actualIndexState == expectedIndexState; + && (expectedIndexState == null || actualIndexState == expectedIndexState); if (matchesExpected) { - return IndexStateCheck.SUCCESS; + return new IndexStateCheck(actualIndexState, actualIndexDisableTimestamp, Boolean.TRUE); } if (ZERO.equals(actualIndexDisableTimestamp)) { - return IndexStateCheck.FAIL; + return new IndexStateCheck(actualIndexState, actualIndexDisableTimestamp, Boolean.FALSE); } } - return IndexStateCheck.KEEP_TRYING; + return new IndexStateCheck(actualIndexState, actualIndexDisableTimestamp, null); } public static long getRowCount(Connection conn, String tableName) throws SQLException {