Fix plugin reloading for DynamicItems

Since DynamicItems could only ever be loaded by a single
plugin at a time (they are singletons), the code enforcing
this prevented those plugins from being reloaded.

Test Plan: reload the following plugins:

* gravatar-avatar-provider
* websession-flatfile

Bug: issue 2895
Change-Id: I52a07f34d1fa0b756f4cc22d0d83d2ef6906840e
(cherry picked from commit 9a5e78aa73fc4cf1159e2bcca95bf11c1f0b5cb5)
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItem.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItem.java
index 9ef7d1b..7edfaed 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItem.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItem.java
@@ -184,7 +184,13 @@
     NamedProvider<T> old = null;
     while (!ref.compareAndSet(old, item)) {
       old = ref.get();
-      if (old != null && !"gerrit".equals(old.pluginName)) {
+      if (old != null
+          && !"gerrit".equals(old.pluginName)
+          && !pluginName.equals(old.pluginName)) {
+        // We allow to replace:
+        // 1. Gerrit core items, e.g. websession cache
+        //    can be replaced by plugin implementation
+        // 2. Reload of current plugin
         throw new ProvisionException(String.format(
             "%s already provided by %s, ignoring plugin %s",
             this.key.getTypeLiteral(), old.pluginName, pluginName));