From 714530b80610099360d3359dba8006b66dff81e1 Mon Sep 17 00:00:00 2001 From: Zipeng WU Date: Wed, 21 Apr 2021 16:44:43 +0200 Subject: [PATCH] SONAR-14078 fix duplication of notification keys after upgrading to SonarQube 8.4+ --- .../PopulatePropertiesUserUuid.java | 11 ++++++++ .../PopulatePropertiesUserUuidTest.java | 28 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v84/users/fk/properties/PopulatePropertiesUserUuid.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v84/users/fk/properties/PopulatePropertiesUserUuid.java index 6bc811f3b6e..87d148cb8a3 100644 --- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v84/users/fk/properties/PopulatePropertiesUserUuid.java +++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v84/users/fk/properties/PopulatePropertiesUserUuid.java @@ -32,6 +32,11 @@ public class PopulatePropertiesUserUuid extends DataChange { @Override protected void execute(Context context) throws SQLException { + populateUserUuid(context); + removeRowWithNonExistentUser(context); + } + + private static void populateUserUuid(Context context) throws SQLException { MassUpdate massUpdate = context.prepareMassUpdate(); massUpdate.select("select p.uuid, u.uuid " + @@ -49,4 +54,10 @@ public class PopulatePropertiesUserUuid extends DataChange { return true; }); } + + private static void removeRowWithNonExistentUser(Context context) throws SQLException { + context.prepareUpsert("delete from properties where user_uuid is null and user_id is not null") + .execute() + .commit(); + } } diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v84/users/fk/properties/PopulatePropertiesUserUuidTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v84/users/fk/properties/PopulatePropertiesUserUuidTest.java index 1f62b88a2e8..2550fec05ce 100644 --- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v84/users/fk/properties/PopulatePropertiesUserUuidTest.java +++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v84/users/fk/properties/PopulatePropertiesUserUuidTest.java @@ -74,6 +74,30 @@ public class PopulatePropertiesUserUuidTest { assertThatPropertyUserUuidIsEqualTo(propertyUuid_5, null); } + @Test + public void should_remove_property_for_non_existent_user() throws SQLException { + long userId_1 = 1L; + String userUuid_1 = "uuid-1"; + insertUser(userId_1, userUuid_1); + + long userId_2 = 2L; + + long userId_3 = 3L; + + String propertyUuid_1 = Uuids.createFast(); + insertProperty(propertyUuid_1, userId_1); + String propertyUuid_2 = Uuids.createFast(); + insertProperty(propertyUuid_2, userId_2); + String propertyUuid_3 = Uuids.createFast(); + insertProperty(propertyUuid_3, userId_3); + + underTest.execute(); + + assertThatPropertyUserUuidIsEqualTo(propertyUuid_1, userUuid_1); + assertPropertyIsRemoved(propertyUuid_2); + assertPropertyIsRemoved(propertyUuid_3); + } + @Test public void migration_is_reentrant() throws SQLException { long userId_1 = 1L; @@ -131,6 +155,10 @@ public class PopulatePropertiesUserUuidTest { } + private void assertPropertyIsRemoved(String propertyUuid){ + assertThat(db.select(String.format("select 1 from properties where uuid = '%s'", propertyUuid))).isEmpty(); + } + private void insertProperty(String uuid, Long userId) { db.executeInsert("properties", "uuid", uuid, -- 2.39.5