Upgrade from 3.1.3/4.2.1 to 3.2.1/4.3.1 fails during database migration

Problem:
I just tried the upgrade the first time on my production system and it fails during database migration.

Expected outcome:
No errors during foreman-installer run.

Versions:
3.1.3/4.2.1 latest, upgrading to 3.2.1/4.3.1.

Distribution and version:
CentOS 7.9 up-to-date

Other relevant data:

2022-07-12 07:27:18 [DEBUG ] [configure] Foreman::Rake[db:migrate]: Starting to evaluate the resource (1386 of 2101)
2022-07-12 07:27:18 [DEBUG ] [configure] Foreman::Rake[db:migrate]: Evaluated in 0.00 seconds
2022-07-12 07:27:18 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]: Starting to evaluate the resource (1387 of 2101)
2022-07-12 07:27:18 [DEBUG ] [configure] Exec[foreman-rake-db:migrate](provider=posix): Executing check '/usr/sbin/foreman-rake db:abort_if_pending_migrations'
2022-07-12 07:27:18 [DEBUG ] [configure] Executing with uid=foreman: '/usr/sbin/foreman-rake db:abort_if_pending_migrations'
2022-07-12 07:27:31 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/unless: API controllers newer than Apipie cache! Run apipie:cache rake task to regenerate cache.
2022-07-12 07:27:31 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/unless: Run `rails db:migrate` to update your database then try again.
2022-07-12 07:27:31 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/unless: You have 16 pending migrations:
2022-07-12 07:27:31 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/unless:   20210708123832 AddParentTaskIdToRemoteTasks
2022-07-12 07:27:31 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/unless:   20211111115000 DropFixDbCacheSetting
2022-07-12 07:27:31 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/unless:   20211123170430 TasksSettingsToDslCategory
2022-07-12 07:27:31 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/unless:   20211201154845 AddUniqueIndexes
2022-07-12 07:27:31 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/unless:   20211208034230 AddContentViewAndLifecycleEnvironment
2022-07-12 07:27:31 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/unless:   20211220185935 CleanDuplicateContentUnits
2022-07-12 07:27:31 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/unless:   20220110223754 UpdateDisconnectedSettings
2022-07-12 07:27:31 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/unless:   20220111110149 DropRequireSslSmartProxiesSetting
2022-07-12 07:27:31 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/unless:   20220120163252 FixDockerDownloadPolicy
2022-07-12 07:27:31 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/unless:   20220124191056 AddTypeToCdnConfiguration
2022-07-12 07:27:31 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/unless:   20220127120843 FixDebianDownloadPolicy
2022-07-12 07:27:31 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/unless:   20220204171908 RenameDockerTagsWhitelistAndAddExcludeTags
2022-07-12 07:27:31 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/unless:   20220207140355 ChangeDebAttributesSizeLimit
2022-07-12 07:27:31 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/unless:   20220208134539 RenameCentOsStreamOs
2022-07-12 07:27:31 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/unless:   20220209205137 ExpandSyncTimeoutSettings
2022-07-12 07:27:31 [DEBUG ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/unless:   20220303160220 RemoveDuplicateErrata
2022-07-12 07:27:31 [DEBUG ] [configure] Exec[foreman-rake-db:migrate](provider=posix): Executing '/usr/sbin/foreman-rake db:migrate'
2022-07-12 07:27:31 [DEBUG ] [configure] Executing with uid=foreman: '/usr/sbin/foreman-rake db:migrate'
2022-07-12 07:27:43 [INFO  ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/returns: API controllers newer than Apipie cache! Run apipie:cache rake task to regenerate cache.
2022-07-12 07:27:43 [INFO  ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/returns: rake aborted!
2022-07-12 07:27:43 [INFO  ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/returns: StandardError: An error has occurred, this and all later migrations canceled:
2022-07-12 07:27:43 [INFO  ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/returns:
2022-07-12 07:27:43 [INFO  ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/returns: PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_operatingsystems_on_name_and_major_and_minor"
2022-07-12 07:27:43 [INFO  ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/returns: DETAIL:  Key (name, major, minor)=(CentOS_Stream, 8, ) already exists.
2022-07-12 07:27:43 [INFO  ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/returns: /opt/theforeman/tfm/root/usr/share/gems/gems/activerecord-6.0.3.7/lib/active_record/connection_adapters/postgresql_adapter.rb:675:in `async_exec_params'
2022-07-12 07:27:43 [INFO  ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/returns: /opt/theforeman/tfm/root/usr/share/gems/gems/activerecord-6.0.3.7/lib/active_record/connection_adapters/postgresql_adapter.rb:675:in `block (2 levels) in exec_no_cache'
2022-07-12 07:27:43 [INFO  ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/returns: /opt/theforeman/tfm/root/usr/share/gems/gems/activesupport-6.0.3.7/lib/active_support/dependencies/interlock.rb:48:in `block in permit_concurrent_loads'
2022-07-12 07:27:43 [INFO  ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/returns: /opt/theforeman/tfm/root/usr/share/gems/gems/activesupport-6.0.3.7/lib/active_support/concurrency/share_lock.rb:187:in `yield_shares'
2022-07-12 07:27:43 [INFO  ] [configure] /Stage[main]/Foreman::Database/Foreman::Rake[db:migrate]/Exec[foreman-rake-db:migrate]/returns: /opt/theforeman/tfm/root/usr/share/gems/gems/activesupport-6.0.3.7/lib/active_support/dependencies/interlock.rb:47:in `permit_concurrent_loads'

The migration RenameCentOsStreamOs renames the centos stream os but does not check if the new name already exists. I have:

# hammer os info --id=4
Id:                 4
Title:              CentOS Stream 8
Release name:       
Family:             Redhat
Name:               CentOS
Major version:      8
Minor version:      
...
# hammer os info --id=31
Id:                 31
Title:              CentOS_Stream 8
Release name:       
Family:             Redhat
Name:               CentOS_Stream
Major version:      8
Minor version:      
...

It seems a little short sighted for a migration to assume a rename on an unique index column will always pass…

I am thinking about whether I do the obvious workaround and try again or not. Considering how many attempts and months it took for me to get to working a working 4.2 this isn’t a good start…