Issue 2095: Guice provision error after unloading of plugin
Status:  New
Owner: ----
Project Member Reported by edwin.ke...@gmail.com, Aug 30, 2013
************************************************************
***** NOTE: THIS BUG TRACKER IS FOR GERRIT CODE REVIEW *****
***** DO NOT SUBMIT BUGS FOR CHROME, ANDROID, INTERNAL *****
***** ISSUES WITH YOUR COMPANY'S GERRIT SETUP, ETC.    *****
***** THOSE ISSUE BELONG IN DIFFERENT ISSUE TRACKERS!  *****
************************************************************

Affected Version: current master (9dd5400f1299ca17f377efa3f44f3b4787e4c2da)

What steps will reproduce the problem?
1. Build delete-project plugin with [1] included
2. Install the plugin with
   curl --digest --user admin:TNNuLkWsIV8w -X PUT --data-binary @target/delete-project-2.8-SNAPSHOT.jar 'http://127.0.0.1:8080/a/plugins/delete-project'
3. Overwrite the plugin by executing the same command again
4. The command succeeds but in the finally block in RestApiServlet a Guice provision error occurs [2]

What is the expected output? What do you see instead?
No exception.

Please provide any additional information below.
I only see this error when I include [1] for the plugin, without this change the error does not occur.

[1] https://gerrit-review.googlesource.com/49250

[2]
[2013-08-30 16:19:29,318] INFO  com.google.gerrit.server.plugins.PluginLoader : Unloading plugin deletePlugin
[2013-08-30 16:19:40,764] WARN  org.eclipse.jetty.servlet.ServletHandler : /a/plugins/deletePlugin
com.google.inject.ProvisionException: Guice provision errors:

1) Error in custom provider, com.google.inject.OutOfScopeException: Cannot access scoped object. Either we are not currently inside an HTTP Servlet request, or you may have forgotten to apply com.google.inject.servlet.GuiceFilter as a servlet filter for this request.
  at com.google.gerrit.httpd.CacheBasedWebSession$1.configure(CacheBasedWebSession.java:58)
  while locating com.google.gerrit.httpd.WebSession

1 error
	at com.google.inject.internal.InjectorImpl$3.get(InjectorImpl.java:1014)
	at com.google.gerrit.httpd.restapi.RestApiServlet.service(RestApiServlet.java:357)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at com.google.gerrit.httpd.plugins.HttpPluginServlet.service(HttpPluginServlet.java:204)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at com.google.inject.servlet.ServletDefinition.doServiceImpl(ServletDefinition.java:278)
	at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:268)
	at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:180)
	at com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:93)
	at com.google.gerrit.pgm.http.jetty.GetUserFilter.doFilter(GetUserFilter.java:76)
	at com.google.gerrit.httpd.RequireIdentifiedUserFilter.doFilter(RequireIdentifiedUserFilter.java:56)
	at com.google.gwtexpui.server.CacheControlFilter.doFilter(CacheControlFilter.java:70)
	at com.google.gerrit.httpd.RunAsFilter.doFilter(RunAsFilter.java:113)
	at com.google.gerrit.httpd.ProjectDigestFilter.doFilter(ProjectDigestFilter.java:106)
	at com.google.gerrit.httpd.AllRequestFilter$FilterProxy$1.doFilter(AllRequestFilter.java:64)
	at com.google.gerrit.httpd.AllRequestFilter$FilterProxy.doFilter(AllRequestFilter.java:67)
	at com.google.gerrit.httpd.RequestContextFilter.doFilter(RequestContextFilter.java:75)
	at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:120)
	at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:132)
	at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:129)
	at com.google.inject.servlet.GuiceFilter$Context.call(GuiceFilter.java:206)
	at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:129)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1307)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:453)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:229)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1072)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1006)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
	at org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:67)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
	at org.eclipse.jetty.server.Server.handle(Server.java:365)
	at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485)
	at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:926)
	at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:988)
	at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:642)
	at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
	at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
	at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:627)
	at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:51)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
	at java.lang.Thread.run(Thread.java:680)
Caused by: com.google.inject.OutOfScopeException: Cannot access scoped object. Either we are not currently inside an HTTP Servlet request, or you may have forgotten to apply com.google.inject.servlet.GuiceFilter as a servlet filter for this request.
	at com.google.inject.servlet.GuiceFilter.getContext(GuiceFilter.java:164)
	at com.google.inject.servlet.GuiceFilter.getOriginalRequest(GuiceFilter.java:146)
	at com.google.inject.servlet.ServletScopes$2$1.get(ServletScopes.java:106)
	at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
	at com.google.inject.internal.InjectorImpl$3$1.call(InjectorImpl.java:1005)
	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1051)
	at com.google.inject.internal.InjectorImpl$3.get(InjectorImpl.java:1001)
	... 44 more