Close repository in ref-updated listener onGitReferenceUpdated() created two MetaDataUpdate instances per refs/meta/config update and never closed them, leaking the underlying Repository reference on every project config change. Found by the repository-leak tracking of the acceptance test framework when the first test for this plugin was added. Use a single MetaDataUpdate in try-with-resources for both the old and the new revision read. Change-Id: I6d3a91e04c85f2b7a1c9e8f5063d2b74915ac0e8
diff --git a/src/main/java/com/googlesource/gerrit/plugins/download/command/project/DownloadCommandUpdater.java b/src/main/java/com/googlesource/gerrit/plugins/download/command/project/DownloadCommandUpdater.java index 3225d95..9f13a86 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/download/command/project/DownloadCommandUpdater.java +++ b/src/main/java/com/googlesource/gerrit/plugins/download/command/project/DownloadCommandUpdater.java
@@ -111,18 +111,16 @@ public void onGitReferenceUpdated(Event event) { if (event.getRefName().equals(RefNames.REFS_CONFIG)) { Project.NameKey p = Project.nameKey(event.getProjectName()); - try { + try (MetaDataUpdate md = metaDataUpdateFactory.create(p)) { ProjectConfig oldCfg = - projectConfigFactory.read( - metaDataUpdateFactory.create(p), ObjectId.fromString(event.getOldObjectId())); + projectConfigFactory.read(md, ObjectId.fromString(event.getOldObjectId())); PluginConfig oldPluginCfg = oldCfg.getPluginConfig(pluginName); for (String name : oldPluginCfg.getNames()) { removeCommand(p, name); } ProjectConfig newCfg = - projectConfigFactory.read( - metaDataUpdateFactory.create(p), ObjectId.fromString(event.getNewObjectId())); + projectConfigFactory.read(md, ObjectId.fromString(event.getNewObjectId())); PluginConfig newPluginCfg = newCfg.getPluginConfig(pluginName); for (String name : newPluginCfg.getNames()) { installCommand(p, name, newPluginCfg.getString(name));