Check index existence on raw SQL creation (#5624)

* Add conditional check on index existence before we try again

* Add conditional check on index existence before we try again

* Changelog

* remit

* remit

* debug statements
This commit is contained in:
Tadgh 2024-01-23 17:56:26 -08:00 committed by GitHub
parent a2a0a8a662
commit b982abbfbe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 15 additions and 5 deletions

View File

@ -0,0 +1,5 @@
---
type: fix
issue: 5547
title: "The addition of the indexes `idx_sp_uri_hash_identity_pattern_ops` and `idx_sp_string_hash_nrm_pattern_ops` could occasionally timeout during migration in Postgresql on large databases, leaving the migration table in a failed state, and Smile CDR unable to boot.
Now existence of the index is checked before attempting to add it again."

View File

@ -184,8 +184,10 @@ public class HapiFhirJpaMigrationTasks extends BaseMigrationTasks<VersionEnum> {
QUERY_FOR_COLUMN_COLLATION_TEMPLATE, QUERY_FOR_COLUMN_COLLATION_TEMPLATE,
"HFJ_SPIDX_STRING".toLowerCase(), "HFJ_SPIDX_STRING".toLowerCase(),
"SP_VALUE_NORMALIZED".toLowerCase()), "SP_VALUE_NORMALIZED".toLowerCase()),
"Column HFJ_SPIDX_STRING.SP_VALUE_NORMALIZED already has a collation of 'C' so doing nothing"); "Column HFJ_SPIDX_STRING.SP_VALUE_NORMALIZED already has a collation of 'C' so doing nothing")
.onlyIf(
"SELECT NOT EXISTS(select 1 from pg_indexes where indexname='idx_sp_string_hash_nrm_pattern_ops')",
"Index idx_sp_string_hash_nrm_pattern_ops already exists");
version.executeRawSql( version.executeRawSql(
"20231212.2", "20231212.2",
"CREATE UNIQUE INDEX idx_sp_uri_hash_identity_pattern_ops ON public.hfj_spidx_uri USING btree (hash_identity, sp_uri varchar_pattern_ops, res_id, partition_id)") "CREATE UNIQUE INDEX idx_sp_uri_hash_identity_pattern_ops ON public.hfj_spidx_uri USING btree (hash_identity, sp_uri varchar_pattern_ops, res_id, partition_id)")
@ -195,7 +197,10 @@ public class HapiFhirJpaMigrationTasks extends BaseMigrationTasks<VersionEnum> {
QUERY_FOR_COLUMN_COLLATION_TEMPLATE, QUERY_FOR_COLUMN_COLLATION_TEMPLATE,
"HFJ_SPIDX_URI".toLowerCase(), "HFJ_SPIDX_URI".toLowerCase(),
"SP_URI".toLowerCase()), "SP_URI".toLowerCase()),
"Column HFJ_SPIDX_STRING.SP_VALUE_NORMALIZED already has a collation of 'C' so doing nothing"); "Column HFJ_SPIDX_STRING.SP_VALUE_NORMALIZED already has a collation of 'C' so doing nothing")
.onlyIf(
"SELECT NOT EXISTS(select 1 from pg_indexes where indexname='idx_sp_uri_hash_identity_pattern_ops')",
"Index idx_sp_uri_hash_identity_pattern_ops already exists.");
} }
// This fix was bad for MSSQL, it has been set to do nothing. // This fix was bad for MSSQL, it has been set to do nothing.

View File

@ -597,11 +597,11 @@ public class Builder {
"Only SELECT statements (including CTEs) are allowed here. Please check your SQL: [%s]", "Only SELECT statements (including CTEs) are allowed here. Please check your SQL: [%s]",
theSql)); theSql));
} }
ourLog.info("SQL to evaluate: {}", theSql); ourLog.debug("SQL to evaluate: {}", theSql);
myTask.addPrecondition(new ExecuteTaskPrecondition( myTask.addPrecondition(new ExecuteTaskPrecondition(
() -> { () -> {
ourLog.info("Checking precondition for SQL: {}", theSql); ourLog.debug("Checking precondition for SQL: {}", theSql);
return MigrationJdbcUtils.queryForSingleBooleanResultMultipleThrowsException( return MigrationJdbcUtils.queryForSingleBooleanResultMultipleThrowsException(
theSql, myTask.newJdbcTemplate()); theSql, myTask.newJdbcTemplate());
}, },