From 00b02365268a41640170388616d14fc54e7b9f6e Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Mon, 14 Jun 2010 17:55:38 -0700 Subject: [PATCH] Don't allow registering for cleanup after cleanup runs We only run the cleanup code once per request. After its run, any new objects added onto the cleanup list for this request are wrong and cannot be satisifed. If we don't have this guard, a potential code change could ask for a ReviewDb to be opened after cleanup was done, leaking the database connection. Change-Id: I854f6790b36cad4ad07356a7239c8648dc3937e4 Signed-off-by: Shawn O. Pearce --- .../main/java/com/google/gerrit/server/RequestCleanup.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/RequestCleanup.java b/gerrit-server/src/main/java/com/google/gerrit/server/RequestCleanup.java index 23c0a6fd6d..d836646bc9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/RequestCleanup.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/RequestCleanup.java @@ -33,16 +33,21 @@ public class RequestCleanup implements Runnable { LoggerFactory.getLogger(RequestCleanup.class); private final List cleanup = new LinkedList(); + private boolean ran; /** Register a task to be completed after the request ends. */ public void add(final Runnable task) { synchronized (cleanup) { + if (ran) { + throw new IllegalStateException("Request has already been cleaned up"); + } cleanup.add(task); } } public void run() { synchronized (cleanup) { + ran = true; for (final Iterator i = cleanup.iterator(); i.hasNext();) { try { i.next().run();