LfsPluginServlet#reload: Fix plugin reload

Issue: when plugin gets unloaded it unconditionally cleans up current
reference to the Guice filter chain. Additionally, the access to
LfsPluginServlet.filter was not thread safe.

Use AtomicReference to make LfsPluginServlet.filter thread safe.

When unloading, set LfsPluginServlet.filter to null only if its value
didn't change since the time this plugin version was loaded.

Change-Id: I3287706107bd327af04c563eb46bf398aabda686
Signed-off-by: Jacek Centkowski <geminica.programs@gmail.com>
Also-by: Saša Živkov <zivkov@gmail.com>
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/LfsPluginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/LfsPluginServlet.java
index 482a2c0..2f7d70f 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/LfsPluginServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/LfsPluginServlet.java
@@ -34,6 +34,7 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
 
 import javax.servlet.FilterChain;
 import javax.servlet.ServletConfig;
@@ -58,7 +59,7 @@
   private List<Plugin> pending = new ArrayList<>();
   private final String pluginName;
   private final FilterChain chain;
-  private GuiceFilter filter;
+  private AtomicReference<GuiceFilter> filter;
 
   @Inject
   LfsPluginServlet(@GerritServerConfig Config cfg) {
@@ -71,17 +72,18 @@
             (HttpServletRequest) req, (HttpServletResponse) res);
       }
     };
+    this.filter = new AtomicReference<>();
   }
 
   @Override
   protected void service(HttpServletRequest req, HttpServletResponse res)
       throws ServletException, IOException {
-    if (filter == null) {
+    if (filter.get() == null) {
       CacheHeaders.setNotCacheable(res);
       res.sendError(SC_NOT_IMPLEMENTED);
       return;
     }
-    filter.doFilter(req, res, chain);
+    filter.get().doFilter(req, res, chain);
   }
 
   @Override
@@ -112,13 +114,14 @@
     if (!plugin.getName().equals(pluginName)) {
       return;
     }
-    filter = load(plugin);
+    final GuiceFilter guiceFilter = load(plugin);
     plugin.add(new RegistrationHandle() {
       @Override
       public void remove() {
-        filter = null;
+        filter.compareAndSet(guiceFilter, null);
       }
     });
+    filter.set(guiceFilter);
   }
 
   private GuiceFilter load(Plugin plugin) {