Acho que agora estamos livres!
Percebemos que precisávamos migrar colunas em outras tabelas que referenciavam notification_id além de notifications.id. Caso contrário, services/notifications.rb ou services/badge_granter.rb lançariam erros.
Para qualquer outra configuração de grande fórum que encontrar isso no futuro com notificações, aqui está o que fizemos…
No total, tivemos que migrar quatro colunas em quatro tabelas:
notifications.id
user.seen_notification_id
user_badges.notification_id
shelved_notifications.notification_id
Inicialmente, fizemos o item nº 1 com o comando ALTER sugerido acima, mas depois, como mencionado, optamos por usar migrações ActiveRecord, para que os arquivos de migração se somem ao esquema.
20230215070319_change_notifications_id_to_bigint.rb
# frozen_string_literal: true
class ChangeNotificationsIdToBigint < ActiveRecord::Migration[6.1]
def change
change_column :notifications, :id, :bigint
end
end
20230215070320_change_user_seen_notification_id_to_bigint.rb
# frozen_string_literal: true
class ChangeUserSeenNotificationIdToBigint < ActiveRecord::Migration[6.1]
def change
change_column :users, :seen_notification_id, :bigint
end
end
20230215070321_change_user_badges_notification_id_to_bigint.rb
# frozen_string_literal: true
class ChangeUserBadgesNotificationIdToBigint < ActiveRecord::Migration[6.1]
def change
change_column :user_badges, :notification_id, :bigint
end
end
20230215070322_change_shelved_notifications_notification_id_to_bigint.rb
# frozen_string_literal: true
class ChangeShelvedNotificationsNotificationIdToBigint < ActiveRecord::Migration[6.1]
def change
change_column :shelved_notifications, :notification_id, :bigint
end
end
Temos um Dockerfile personalizado em nossa configuração (construímos imagens para que possamos executar discourse e sidekiq em recursos separados no Kubernetes), então fazer com que esses arquivos sejam copiados para /db/migrate como parte de nosso Dockerfile foi simples.
Em seguida, apenas deixamos rake db:migrate cuidar do resto. Assim que fizemos uma reinicialização gradual de todos os nossos pods de discourse e sidekiq, tudo estava funcionando como esperado
.