FrankChen021 commented on code in PR #19672:
URL: https://github.com/apache/druid/pull/19672#discussion_r3570770459
##########
server/src/main/java/org/apache/druid/metadata/SQLMetadataConnector.java:
##########
@@ -1256,6 +1272,59 @@ public void createIndex(
}
}
+ /**
+ * Drops an index on {@code tableName} if it exists, under either the full or
+ * short naming convention (see {@link #createIndex}). No-op if absent, so
it is
+ * safe to call on every startup.
+ *
+ * @param tableName Name of the table the index is on
+ * @param fullIndexNameFormat Same format string that was passed to {@link
#createIndex}
+ * @param indexCols Same columns that were passed to {@link
#createIndex}
+ */
+ public void dropIndex(
+ final String tableName,
+ final String fullIndexNameFormat,
+ final List<String> indexCols
+ )
+ {
+ final Set<String> createdIndexSet = getIndexOnTable(tableName);
+ final String shortIndexName = generateShortIndexName(tableName, indexCols);
+ final String fullIndexName =
StringUtils.toUpperCase(StringUtils.format(fullIndexNameFormat, tableName));
+
+ final String indexName;
+ if (createdIndexSet.contains(fullIndexName)) {
+ indexName = fullIndexName;
+ } else if (createdIndexSet.contains(shortIndexName)) {
+ indexName = shortIndexName;
+ } else {
+ log.info("Index[%s] on table[%s] does not exist, skipping drop.",
fullIndexName, tableName);
+ return;
+ }
+
+ try {
+ retryWithHandle(
+ (HandleCallback<Void>) handle -> {
+ final String dropSQL = getDropIndexStatement(indexName, tableName);
+ log.info("Dropping index[%s] on table[%s] using SQL[%s].",
indexName, tableName, dropSQL);
+ handle.execute(dropSQL);
+ return null;
+ }
+ );
+ }
+ catch (Exception e) {
+ log.warn(e, "Could not drop index[%s] on table[%s]", indexName,
tableName);
+ }
+ }
+
+ /**
+ * SQL to drop an index. Standard SQL / Derby / PostgreSQL use {@code DROP
INDEX <name>};
+ * MySQL requires the {@code ON <table>} clause (see {@code MySQLConnector}).
+ */
+ protected String getDropIndexStatement(String indexName, String tableName)
+ {
+ return StringUtils.format("DROP INDEX %s", indexName);
Review Comment:
[P2] Add the SQL Server DROP INDEX syntax
`SQLServerConnector` also subclasses `SQLMetadataConnector` but does not
override this new hook. SQL Server requires `DROP INDEX <name> ON <table>`, so
the default `DROP INDEX <name>` fails and is swallowed, leaving the redundant
legacy index on every SQL Server upgrade. Add an override there as was done for
MySQL.
##########
server/src/main/java/org/apache/druid/metadata/SQLMetadataConnector.java:
##########
@@ -663,6 +669,16 @@ protected void alterSegmentTable()
"IDX_%S_DATASOURCE_UPGRADED_FROM_SEGMENT_ID",
List.of("dataSource", "upgraded_from_segment_id")
);
+ // Migration for existing tables: covering index backing the used-segment
ID
+ // scan on every cache sync (see createSegmentTable).
+ createIndex(
+ tableName,
+ "IDX_%S_USED_USLU_DATASOURCE",
+ List.of("used", "used_status_last_updated", "dataSource", "id")
+ );
+ // The covering index above leads with 'used', so it supersedes the
single-column
+ // IDX_%S_USED. Drop the now-redundant index on existing tables.
+ dropIndex(tableName, "IDX_%S_USED", List.of("used"));
Review Comment:
[P2] Verify the covering index before dropping the fallback
`createIndex` catches and only logs every exception, so this drop still runs
when the new four-column index could not be created. On an existing cluster, a
transient DDL failure or backend constraint can therefore remove `IDX_*_USED`
and leave used-segment queries without either intended index. Re-read the index
set after creation, or return success from `createIndex`, and drop the legacy
index only after confirming the covering index exists.
--
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.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]