gjacoby126 commented on a change in pull request #672: PHOENIX-5658 IndexTool
to verify index rows inline
URL: https://github.com/apache/phoenix/pull/672#discussion_r365379448
##########
File path: phoenix-core/src/it/java/org/apache/phoenix/end2end/IndexToolIT.java
##########
@@ -366,6 +371,140 @@ public void testBuildSecondaryIndexAndScrutinize()
throws Exception {
}
}
+ private Cell getErrorMessageFromIndexToolOutputTable(Connection conn,
String dataTableFullName, String indexTableFullName)
+ throws Exception {
+ byte[] indexTableFullNameBytes = Bytes.toBytes(indexTableFullName);
+ byte[] dataTableFullNameBytes = Bytes.toBytes(dataTableFullName);
+ Table hIndexTable =
conn.unwrap(PhoenixConnection.class).getQueryServices()
+ .getTable(IndexTool.OUTPUT_TABLE_NAME_BYTES);
+ Scan scan = new Scan();
+ ResultScanner scanner = hIndexTable.getScanner(scan);
+ boolean dataTableNameCheck = false;
+ boolean indexTableNameCheck = false;
+ Cell errorMessageCell = null;
+ Result result = scanner.next();
+ if (result != null) {
+ for (Cell cell : result.rawCells()) {
+ assertTrue(Bytes.compareTo(cell.getFamilyArray(),
cell.getFamilyOffset(), cell.getFamilyLength(),
+ IndexTool.OUTPUT_TABLE_COLUMN_FAMILY, 0,
+ IndexTool.OUTPUT_TABLE_COLUMN_FAMILY.length) == 0);
+ if (Bytes.compareTo(cell.getQualifierArray(),
cell.getQualifierOffset(), cell.getQualifierLength(),
+ IndexTool.DATA_TABLE_NAME_BYTES, 0,
IndexTool.DATA_TABLE_NAME_BYTES.length) == 0) {
+ dataTableNameCheck = true;
+ assertTrue(Bytes.compareTo(cell.getValueArray(),
cell.getValueOffset(), cell.getValueLength(),
+ dataTableFullNameBytes, 0,
dataTableFullNameBytes.length) == 0);
+ } else if (Bytes.compareTo(cell.getQualifierArray(),
cell.getQualifierOffset(), cell.getQualifierLength(),
+ IndexTool.INDEX_TABLE_NAME_BYTES, 0,
IndexTool.INDEX_TABLE_NAME_BYTES.length) == 0) {
+ indexTableNameCheck = true;
+ assertTrue(Bytes.compareTo(cell.getValueArray(),
cell.getValueOffset(), cell.getValueLength(),
+ indexTableFullNameBytes, 0,
indexTableFullNameBytes.length) == 0);
+ } else if (Bytes.compareTo(cell.getQualifierArray(),
cell.getQualifierOffset(), cell.getQualifierLength(),
+ IndexTool.ERROR_MESSAGE_BYTES, 0,
IndexTool.ERROR_MESSAGE_BYTES.length) == 0) {
+ errorMessageCell = cell;
+
+ }
+ }
+ }
+ assertTrue(dataTableNameCheck && indexTableNameCheck &&
errorMessageCell != null);
+ return errorMessageCell;
+ }
+
+ @Test
+ public void testIndexToolVerifyOption() throws Exception {
+ // This test is for building non-transactional global indexes with
direct api
+ if (localIndex || transactional || !directApi || useSnapshot) {
+ return;
+ }
+ Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+ try (Connection conn = DriverManager.getConnection(getUrl(), props)) {
+ String schemaName = generateUniqueName();
+ String dataTableName = generateUniqueName();
+ String dataTableFullName = SchemaUtil.getTableName(schemaName,
dataTableName);
+ String indexTableName = generateUniqueName();
+ String viewName = generateUniqueName();
+ String viewFullName = SchemaUtil.getTableName(schemaName,
viewName);
+ conn.createStatement().execute("CREATE TABLE " + dataTableFullName
+ + " (ID INTEGER NOT NULL PRIMARY KEY, NAME VARCHAR, ZIP
INTEGER) "
+ + tableDDLOptions);
+ conn.commit();
+ conn.createStatement().execute("CREATE VIEW " + viewFullName + "
AS SELECT * FROM " + dataTableFullName);
+ conn.commit();
+ // Insert a row
+ conn.createStatement().execute("upsert into " + viewFullName + "
values (1, 'Phoenix', 12345)");
+ conn.commit();
+ // Configure IndexRegionObserver to fail the first write phase.
This should not
+ // lead to any change on index and thus the index verify during
index rebuild should fail
+ IndexRegionObserver.setIgnoreIndexRebuildForTesting(true);
+ conn.createStatement().execute(String.format(
+ "CREATE INDEX %s ON %s (NAME) INCLUDE (ZIP) ASYNC",
indexTableName, viewFullName));
+ // Run the index MR job and verify that the index table rebuild
fails
+ runIndexTool(directApi, useSnapshot, schemaName, viewName,
indexTableName,
+ null, -1, true, false);
+ // The index tool output table should report that there is a
missing index row
+ Cell cell = getErrorMessageFromIndexToolOutputTable(conn,
dataTableFullName, "_IDX_" + dataTableFullName);
+ byte[] expectedValueBytes = Bytes.toBytes("Missing index rows -
Expected: 1 Actual: 0");
+ assertTrue(Bytes.compareTo(cell.getValueArray(),
cell.getValueOffset(), cell.getValueLength(),
+ expectedValueBytes, 0, expectedValueBytes.length) == 0);
+ IndexRegionObserver.setIgnoreIndexRebuildForTesting(false);
+ Admin admin =
conn.unwrap(PhoenixConnection.class).getQueryServices().getAdmin();
+ TableName indexToolOutputTable =
TableName.valueOf(IndexTool.OUTPUT_TABLE_NAME_BYTES);
+ admin.disableTable(indexToolOutputTable);
Review comment:
disabling / dropping takes time, and this test suite uses its own cluster --
any reason we need to drop?
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services