Issue 2128: NPE while deleting patch set N if patch set N-1 was already deleted
Status:  Released
Owner: ----
Closed:  Sep 2013
Reported by lopez.ju...@gmail.com, Sep 16, 2013
This also resulted in parts of the web UI becoming unresponsive, for example queries such as "status:open owner:self" hang for certain users

[2013-09-16 17:39:33,132] WARN  / : Error in deleteDraftPatchSet
java.lang.NullPointerException
        at com.google.gerrit.server.patch.PatchSetInfoFactory.get(PatchSetInfoFactory.java:73)
        at com.google.gerrit.server.changedetail.DeleteDraftPatchSet.call(DeleteDraftPatchSet.java:117)
        at com.google.gerrit.httpd.rpc.patch.PatchDetailServiceImpl$2.run(PatchDetailServiceImpl.java:116)
        at com.google.gerrit.httpd.rpc.patch.PatchDetailServiceImpl$2.run(PatchDetailServiceImpl.java:112)
        at com.google.gerrit.httpd.rpc.BaseServiceImplementation.run(BaseServiceImplementation.java:68)
        at com.google.gerrit.httpd.rpc.patch.PatchDetailServiceImpl.deleteDraftPatchSet(PatchDetailServiceImpl.java:112)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at com.google.gwtjsonrpc.server.MethodHandle.invoke(MethodHandle.java:91)
        at com.google.gwtjsonrpc.server.JsonServlet.doService(JsonServlet.java:379)
        at com.google.gwtjsonrpc.server.JsonServlet.service(JsonServlet.java:265)
        at com.google.gerrit.httpd.rpc.GerritJsonServlet.service(GerritJsonServlet.java:120)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
        at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:263)
        at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:178)
        at com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:91)
        at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:62)
        at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168)
        at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
        at com.google.gwtexpui.server.CacheControlFilter.doFilter(CacheControlFilter.java:70)
        at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:163)
        at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
        at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168)
        at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
        at com.google.gerrit.httpd.AllRequestFilter$FilterProxy$1.doFilter(AllRequestFilter.java:64)
        at com.google.gerrit.httpd.AllRequestFilter$FilterProxy.doFilter(AllRequestFilter.java:57)
        at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:163)
        at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
        at com.google.gerrit.httpd.RequestContextFilter.doFilter(RequestContextFilter.java:75)
        at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:163)
        at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
        at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168)
        at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
        at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118)
        at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113)
        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.Server.handle(Server.java:365)
        at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485)
        at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:937)
        at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:856)
        at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
        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:724)

Sep 17, 2013
Project Member #1 david.pu...@sonymobile.com
What version of Gerrit are you using?
Sep 17, 2013
Project Member #2 david.pu...@sonymobile.com
Never mind.  I was able to reproduce it on master.

1.  Upload a change as draft
2.  Upload patch set 2 as draft
3.  Upload patch set 3 as draft
4.  Delete patch set 2
5.  Delete patch set 3 --> NPE

The problem is in DeleteDraftPatchSet.java:

          PatchSet.Id id =
              new PatchSet.Id(patchSetId.getParentKey(), patchSetId.get() - 1);
          change.setCurrentPatchSet(patchSetInfoFactory.get(db, id));

It's trying to set the current patch set to the ID of the deleted patch set -1.  In this case, the patch set does not exist because it was deleted before.

Status: Accepted
Sep 17, 2013
Project Member #3 david.pu...@sonymobile.com
(No comment was entered for this change.)
Summary: NPE while deleting patch set N if patch set N-1 was already deleted (was: NPE while deleting patch)
Sep 17, 2013
Project Member #4 david.pu...@sonymobile.com
https://gerrit-review.googlesource.com/#/c/49880/
Status: ChangeUnderReview
Sep 17, 2013
Project Member #5 edwin.ke...@gmail.com
(No comment was entered for this change.)
Status: Submitted
Labels: FixedIn-2.8
Sep 17, 2013
#6 diwa...@maginatics.com
Any chance we can get this backported to the 2.6.x branch and/or the next 2.7 RC build? One of our users is essentially unable to use gerrit anymore due to this bug.
Sep 17, 2013
#7 lopez.ju...@gmail.com
Running 2.6.1
Sep 17, 2013
#8 lopez.ju...@gmail.com
The fix above should prevent the NPE.  However, it appears that once the NPE has occurred, the info for patchset in the DB seems inconsistent.  The patch set can be listed from the command line.  For example "gerrit query owner:self status:abandoned" shows the problematic change sets in the output.  

change I6c553fb5431d89b1ffb6691d1a730eb8e3afc00c
  project: acme
  branch: master
  topic: xyz/1
  id: I6c553fb5431d89b1ffb6691d1a730eb8e3afc00c
  number: 16155
  subject: Some trivial change
  owner:
    name: Me
    email: me@domain.org
    username: me
  url: http://reviews.domain.org/16155
  createdOn: 2013-06-13 18:10:21 PDT
  lastUpdated: 2013-09-17 00:21:36 PDT
  sortKey: 0027d23900003f1b
  open: false
  status: ABANDONED


However, when trying to access that changeset through the UI, either using the review# or ChangeId, the user (me) gets an error. 

"Code Review - Error
The page you requested was not found, or you do not have permissions to view this page"

As a workaround, the problematic patchset needs to be deleted from the DB.
Sep 17, 2013
#9 lopez.ju...@gmail.com
Thanks a lot for the quick turnaround.
Dec 9, 2013
Project Member #10 david.pu...@sonymobile.com
(No comment was entered for this change.)
Status: Released