FanoutConfigResourceTest: assert configuration updates being visible When updating a remote configuration using the FanoutConfigResource, the updated values should be also visible in-memory and not simply stored on the underlying filesystem. Fix an issue where the updates to the remotes performed using $GERRIT_SITE/etc/replication/remote.config fan-out config scheme was persisted on disk but left a stale in-memory copy. Change-Id: I2360ba447ffbc3695faad72e5674ca883f75081a
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/FanoutConfigResource.java b/src/main/java/com/googlesource/gerrit/plugins/replication/FanoutConfigResource.java index 0a2afa6..5d308a5 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/FanoutConfigResource.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/FanoutConfigResource.java
@@ -30,6 +30,7 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.function.Predicate; import java.util.stream.Stream; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.internal.storage.file.FileSnapshot; @@ -65,6 +66,8 @@ @Override public void update(Config updates) throws IOException { + super.update(filterOutRemotes(updates)); + Set<String> remotes = updates.getSubsections("remote"); for (String remote : remotes) { File remoteFile = remoteConfigsDirPath.resolve(remote + ".config").toFile(); @@ -79,12 +82,10 @@ for (String option : options) { List<String> values = List.of(updates.getStringList("remote", remote, option)); remoteConfig.setStringList("remote", remote, option, values); + config.setStringList("remote", remote, option, values); } remoteConfig.save(); } - - removeRemotes(updates); - super.update(updates); } private static void removeRemotes(Config config) { @@ -111,6 +112,40 @@ } } + private static Config filterOutRemotes(Config config) { + Config filteredConfig = new Config(); + Set<String> sections = config.getSections(); + sections.stream() + .filter(Predicate.not("remote"::equalsIgnoreCase)) + .forEach( + section -> { + config + .getNames(section) + .forEach( + sectionName -> + filteredConfig.setStringList( + section, + null, + sectionName, + List.of(config.getStringList(section, null, sectionName)))); + config + .getSubsections(section) + .forEach( + subsection -> + config + .getNames(section, subsection) + .forEach( + name -> + filteredConfig.setStringList( + section, + subsection, + name, + List.of( + config.getStringList(section, subsection, name))))); + }); + return filteredConfig; + } + private static boolean isValid(Config cfg) { if (cfg.getSections().size() != 1 || !cfg.getSections().contains("remote")) { logger.atSevere().log(
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/FanoutConfigResourceTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/FanoutConfigResourceTest.java index a622170..c91ac14 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/replication/FanoutConfigResourceTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/FanoutConfigResourceTest.java
@@ -321,6 +321,8 @@ objectUnderTest.update(update); + assertThat(objectUnderTest.getConfig().getString("remote", remoteName1, "url")) + .isEqualTo(remoteUrl1); Config actual = loadRemoteConfig(remoteName1); assertThat(actual.getString("remote", remoteName1, "url")).isEqualTo(remoteUrl1); } @@ -336,6 +338,8 @@ objectUnderTest.update(update); + assertThat(objectUnderTest.getConfig().getString("remote", remoteName1, "url")) + .isEqualTo(remoteUrl2); Config actual = loadRemoteConfig(remoteName1); assertThat(actual.getString("remote", remoteName1, "url")).isEqualTo(remoteUrl2); }