Allow seeing plugins without the PluginLoader lock

This enables `gerrit plugin ls` or a future web UI to show plugins
that are known to the loader without waiting for current loading or
unloading activity.

Change-Id: I7eca30aaa407ba57b8690603c7b370a9495c216d
This commit is contained in:
Shawn O. Pearce
2012-05-11 15:21:11 -07:00
parent 9a59b7b27a
commit 68a8d414a0
2 changed files with 6 additions and 6 deletions

View File

@@ -15,7 +15,6 @@
package com.google.gerrit.server.plugins; package com.google.gerrit.server.plugins;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.google.gerrit.lifecycle.LifecycleListener; import com.google.gerrit.lifecycle.LifecycleListener;
@@ -60,7 +59,7 @@ public class PluginLoader implements LifecycleListener {
private final File pluginsDir; private final File pluginsDir;
private final File tmpDir; private final File tmpDir;
private final PluginGuiceEnvironment env; private final PluginGuiceEnvironment env;
private final Map<String, Plugin> running; private final ConcurrentMap<String, Plugin> running;
private final Map<String, FileSnapshot> broken; private final Map<String, FileSnapshot> broken;
private final ReferenceQueue<ClassLoader> cleanupQueue; private final ReferenceQueue<ClassLoader> cleanupQueue;
private final ConcurrentMap<CleanupHandle, Boolean> cleanupHandles; private final ConcurrentMap<CleanupHandle, Boolean> cleanupHandles;
@@ -73,7 +72,7 @@ public class PluginLoader implements LifecycleListener {
pluginsDir = sitePaths.plugins_dir; pluginsDir = sitePaths.plugins_dir;
tmpDir = sitePaths.tmp_dir; tmpDir = sitePaths.tmp_dir;
env = pe; env = pe;
running = Maps.newHashMap(); running = Maps.newConcurrentMap();
broken = Maps.newHashMap(); broken = Maps.newHashMap();
cleanupQueue = new ReferenceQueue<ClassLoader>(); cleanupQueue = new ReferenceQueue<ClassLoader>();
cleanupHandles = Maps.newConcurrentMap(); cleanupHandles = Maps.newConcurrentMap();
@@ -88,8 +87,8 @@ public class PluginLoader implements LifecycleListener {
} }
} }
public synchronized List<Plugin> getPlugins() { public Iterable<Plugin> getPlugins() {
return Lists.newArrayList(running.values()); return running.values();
} }
public void installPluginFromStream(String name, InputStream in) public void installPluginFromStream(String name, InputStream in)

View File

@@ -15,6 +15,7 @@
package com.google.gerrit.sshd.commands; package com.google.gerrit.sshd.commands;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.gerrit.common.data.GlobalCapability; import com.google.gerrit.common.data.GlobalCapability;
import com.google.gerrit.server.plugins.Plugin; import com.google.gerrit.server.plugins.Plugin;
import com.google.gerrit.server.plugins.PluginLoader; import com.google.gerrit.server.plugins.PluginLoader;
@@ -33,7 +34,7 @@ final class PluginLsCommand extends SshCommand {
@Override @Override
protected void run() { protected void run() {
List<Plugin> running = loader.getPlugins(); List<Plugin> running = Lists.newArrayList(loader.getPlugins());
Collections.sort(running, new Comparator<Plugin>() { Collections.sort(running, new Comparator<Plugin>() {
@Override @Override
public int compare(Plugin a, Plugin b) { public int compare(Plugin a, Plugin b) {