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:
@@ -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)
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user