You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2020/07/29 00:00:41 UTC

[lucene-solr] branch reference_impl_dev updated (46408d0 -> d1cf400)

This is an automated email from the ASF dual-hosted git repository.

markrmiller pushed a change to branch reference_impl_dev
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git.


 discard 46408d0  @437 Track urp life cycle.
     new d1cf400  @437 Initial work on urp life cycle tracking.

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (46408d0)
            \
             N -- N -- N   refs/heads/reference_impl_dev (d1cf400)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../SkipExistingDocumentsProcessorFactory.java     |  5 ++
 .../update/processor/UpdateRequestProcessor.java   |  4 +-
 .../AtomicUpdateProcessorFactoryTest.java          |  8 +--
 .../ClassificationUpdateProcessorFactoryTest.java  |  5 +-
 .../SkipExistingDocumentsProcessorFactoryTest.java | 59 ++++++++++++++++------
 .../processor/TemplateUpdateProcessorTest.java     |  2 +-
 .../update/processor/URLClassifyProcessorTest.java |  1 +
 .../processor/BufferingRequestProcessor.java       |  5 ++
 8 files changed, 65 insertions(+), 24 deletions(-)


[lucene-solr] 01/01: @437 Initial work on urp life cycle tracking.

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

markrmiller pushed a commit to branch reference_impl_dev
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit d1cf400166cc9cba930f09e022a915e98a588c50
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Tue Jul 28 19:00:22 2020 -0500

    @437 Initial work on urp life cycle tracking.
---
 .../solr/handler/dataimport/DataImportHandler.java |  1 +
 .../AbstractDataImportHandlerTestCase.java         |  9 +++
 .../extraction/ExtractingRequestHandlerTest.java   |  1 +
 ...nguageIdentifierUpdateProcessorFactoryTest.java |  1 +
 ...geIdentifierUpdateProcessorFactoryTestCase.java | 20 ++++-
 ...penNLPLangDetectUpdateProcessorFactoryTest.java |  1 +
 ...nguageIdentifierUpdateProcessorFactoryTest.java | 18 ++++-
 .../solr/handler/ContentStreamHandlerBase.java     |  1 -
 .../processor/DistributedUpdateProcessor.java      |  5 ++
 .../processor/DistributedZkUpdateProcessor.java    |  3 +-
 .../processor/RoutedAliasUpdateProcessor.java      |  1 +
 .../processor/RunUpdateProcessorFactory.java       |  5 ++
 .../SkipExistingDocumentsProcessorFactory.java     |  5 ++
 .../update/processor/UpdateRequestProcessor.java   |  6 +-
 .../handler/BinaryUpdateRequestHandlerTest.java    |  1 +
 .../apache/solr/handler/CSVRequestHandlerTest.java |  1 +
 .../org/apache/solr/handler/JsonLoaderTest.java    | 25 +++++-
 .../solr/handler/XmlUpdateRequestHandlerTest.java  |  3 +
 .../solr/handler/XsltUpdateRequestHandlerTest.java |  1 +
 .../solr/handler/loader/JavabinLoaderTest.java     |  1 +
 .../solr/schema/TestSchemalessBufferedUpdates.java |  2 +
 .../solr/update/TestNestedUpdateProcessor.java     |  2 +
 .../AtomicUpdateProcessorFactoryTest.java          | 42 ++++++----
 .../ClassificationUpdateProcessorFactoryTest.java  |  5 +-
 ...assificationUpdateProcessorIntegrationTest.java |  2 +
 .../ClassificationUpdateProcessorTest.java         | 11 +++
 .../processor/DefaultValueUpdateProcessorTest.java |  4 +-
 ...reCommitOptimizeUpdateProcessorFactoryTest.java |  1 +
 .../IgnoreLargeDocumentProcessorFactoryTest.java   |  8 +-
 .../update/processor/RegexBoostProcessorTest.java  |  1 +
 .../SkipExistingDocumentsProcessorFactoryTest.java | 92 ++++++++++++++++------
 .../processor/TemplateUpdateProcessorTest.java     |  7 +-
 .../update/processor/URLClassifyProcessorTest.java |  7 ++
 .../processor/UUIDUpdateProcessorFallbackTest.java |  6 +-
 .../UpdateRequestProcessorFactoryTest.java         |  3 +-
 .../src/java/org/apache/solr/SolrTestCase.java     |  2 +-
 .../src/java/org/apache/solr/SolrTestCaseJ4.java   |  1 +
 .../processor/BufferingRequestProcessor.java       |  5 ++
 .../update/processor/UpdateProcessorTestBase.java  | 14 +++-
 .../src/resources/logconf/log4j2-std-debug.xml     |  5 +-
 40 files changed, 262 insertions(+), 67 deletions(-)

diff --git a/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java b/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java
index 296fabe..16595c5 100644
--- a/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java
+++ b/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java
@@ -208,6 +208,7 @@ public class DataImportHandler extends RequestHandlerBase implements
             importer.runCmd(requestParams, sw);
           }
         }
+        processor.close();
       } else if (DataImporter.RELOAD_CONF_CMD.equals(command)) { 
         if(importer.maybeReloadConfiguration(requestParams, defaultParams)) {
           message = DataImporter.MSG.CONFIG_RELOADED;
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java
index 7a31acf..4dc3629 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java
@@ -339,6 +339,15 @@ public abstract class AbstractDataImportHandlerTestCase extends
       reset();
     }
 
+    public void doClose() {
+      super.doClose();
+      try {
+        next.close();
+      } catch (IOException e) {
+        e.printStackTrace();
+      }
+    }
+
     @Override
     public void finish() throws IOException {
       finishCalled = true;
diff --git a/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/ExtractingRequestHandlerTest.java b/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/ExtractingRequestHandlerTest.java
index 14de842..953d210 100644
--- a/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/ExtractingRequestHandlerTest.java
+++ b/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/ExtractingRequestHandlerTest.java
@@ -456,6 +456,7 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
     assertEquals(200, add.commitWithin);
 
     req.close();
+    p.close();
   }
 
   // Note: If you load a plain text file specifying neither MIME type nor filename, extraction will silently fail. This is because Tika's
diff --git a/solr/contrib/langid/src/test/org/apache/solr/update/processor/LangDetectLanguageIdentifierUpdateProcessorFactoryTest.java b/solr/contrib/langid/src/test/org/apache/solr/update/processor/LangDetectLanguageIdentifierUpdateProcessorFactoryTest.java
index e7d3c15..1b6a085 100644
--- a/solr/contrib/langid/src/test/org/apache/solr/update/processor/LangDetectLanguageIdentifierUpdateProcessorFactoryTest.java
+++ b/solr/contrib/langid/src/test/org/apache/solr/update/processor/LangDetectLanguageIdentifierUpdateProcessorFactoryTest.java
@@ -57,5 +57,6 @@ public class LangDetectLanguageIdentifierUpdateProcessorFactoryTest extends Lang
     assertLang("nl", "id", "10nl", "name", "Lucene", "subject", "Lucene is een gratis open source, tekst gebaseerde information retrieval API van origine geschreven in Java door Doug Cutting. Het wordt ondersteund door de Apache Software Foundation en is vrijgegeven onder de Apache Software Licentie. Lucene is ook beschikbaar in andere programeertalen zoals Perl, C#, C++, Python, Ruby en PHP.");
     assertLang("it", "id", "11it", "name", "Lucene", "subject", "Lucene è una API gratuita ed open source per il reperimento di informazioni inizialmente implementata in Java da Doug Cutting. È supportata dall'Apache Software Foundation ed è resa disponibile con l'Apache License. Lucene è stata successivamente reimplementata in Perl, C#, C++, Python, Ruby e PHP.");
     assertLang("pt", "id", "12pt", "name", "Lucene", "subject", "Apache Lucene, ou simplesmente Lucene, é um software de busca e uma API de indexação de documentos, escrito na linguagem de programação Java. É um software de código aberto da Apache Software Foundation licenciado através da licença Apache.");
+    liProcessor.close();
   }
 }
diff --git a/solr/contrib/langid/src/test/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessorFactoryTestCase.java b/solr/contrib/langid/src/test/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessorFactoryTestCase.java
index 4b19900..5fa010c 100644
--- a/solr/contrib/langid/src/test/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessorFactoryTestCase.java
+++ b/solr/contrib/langid/src/test/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessorFactoryTestCase.java
@@ -84,6 +84,7 @@ public abstract class LanguageIdentifierUpdateProcessorFactoryTestCase extends S
     assertLang("sk", "id", "18sk", "name", "Slovakian", "subject", "Boli vytvorené dva národné parlamenty - Česká národná rada a Slovenská národná rada a spoločný jednokomorový česko-slovenský parlament bol premenovaný z Národného zhromaždenia na Federálne zhromaždenie s dvoma komorami - Snemovňou ľudu a Snemovňu národov.");
     assertLang("sl", "id", "19sl", "name", "Slovenian", "subject", "Slovenska Wikipedija je različica spletne enciklopedije Wikipedije v slovenskem jeziku. Projekt slovenske Wikipedije se je začel 26. februarja 2002 z ustanovitvijo njene spletne strani, njen pobudnik pa je bil uporabnik Jani Melik.");
     assertLang("uk", "id", "20uk", "name", "Ukrainian", "subject", "Народно-господарський комплекс країни включає такі види промисловості як важке машинобудування, чорна та кольорова металургія, суднобудування, виробництво автобусів, легкових та вантажних автомобілів, тракторів та іншої сільськогосподарської техніки, тепловозів, верстатів, турбін, авіаційних двигунів та літаків, обладнання для електростанцій, нафто-газової та хімічної промисловості тощо. Крім того, Україна є потужним вир [...]
+    liProcessor.close();
   }
     
   @Test
@@ -102,15 +103,18 @@ public abstract class LanguageIdentifierUpdateProcessorFactoryTestCase extends S
 
     // Test that enforceSchema correctly catches illegal field and returns null
     parameters.set("langid.enforceSchema", "true");
+    liProcessor.close();
     liProcessor = createLangIdProcessor(parameters);
     assertEquals(null, liProcessor.getMappedField("inputfield", "sv"));
 
     // Prove support for other mapping regex, still with enforceSchema=true
     parameters.add("langid.map.pattern", "text_(.*?)_field");
     parameters.add("langid.map.replace", "$1_{lang}_s");
+    liProcessor.close();
     liProcessor = createLangIdProcessor(parameters);
     assertEquals("title_no_s", liProcessor.getMappedField("text_title_field", "no"));
     assertEquals("body_sv_s", liProcessor.getMappedField("text_body_field", "sv"));
+    liProcessor.close();
   }
 
   @Test
@@ -127,6 +131,7 @@ public abstract class LanguageIdentifierUpdateProcessorFactoryTestCase extends S
     List<DetectedLanguage> langs = new ArrayList<>();
     langs.add(new DetectedLanguage("zh_cn", 0.8));
     assertEquals("zh", liProcessor.resolveLanguage(langs, "NA"));
+    liProcessor.close();
   }
 
   @Test
@@ -149,6 +154,7 @@ public abstract class LanguageIdentifierUpdateProcessorFactoryTestCase extends S
     assertEquals("no", process(doc).getFieldValue("language"));
     assertEquals("no", process(doc).getFieldValue("languages"));
     assertNotNull(process(doc).getFieldValue("text_no"));
+    liProcessor.close();
   }
 
   /**
@@ -175,6 +181,7 @@ public abstract class LanguageIdentifierUpdateProcessorFactoryTestCase extends S
     assertEquals("no", process(doc).getFieldValue("language"));
     assertEquals("no", process(doc).getFieldValue("languages"));
     assertNotNull(process(doc).getFieldValue("text_multivalue_no"));
+    liProcessor.close();
   }
 
   /**
@@ -201,6 +208,7 @@ public abstract class LanguageIdentifierUpdateProcessorFactoryTestCase extends S
     assertEquals("no", process(doc).getFieldValue("language"));
     assertEquals("no", process(doc).getFieldValue("languages"));
     assertNotNull(process(doc).getFieldValue("text_multivalue_no"));
+    liProcessor.close();
   }
 
   @Test
@@ -214,6 +222,7 @@ public abstract class LanguageIdentifierUpdateProcessorFactoryTestCase extends S
     
     doc = tooShortDoc();
     assertEquals("", process(doc).getFieldValue("language"));
+    liProcessor.close();
   }
 
   @Test
@@ -227,6 +236,7 @@ public abstract class LanguageIdentifierUpdateProcessorFactoryTestCase extends S
 
     doc = new SolrInputDocument();
     assertEquals("", process(doc).getFieldValue("language"));
+    liProcessor.close();
   }
 
   @Test
@@ -247,7 +257,8 @@ public abstract class LanguageIdentifierUpdateProcessorFactoryTestCase extends S
 
     // Verify fallback to fallback value since no fallback fields exist
     doc = tooShortDoc();
-    assertEquals("fbVal", process(doc).getFieldValue("language"));  
+    assertEquals("fbVal", process(doc).getFieldValue("language"));
+    liProcessor.close();
   }
   
   @Test
@@ -270,7 +281,8 @@ public abstract class LanguageIdentifierUpdateProcessorFactoryTestCase extends S
     // One detected language under default threshold
     langs = new ArrayList<>();
     langs.add(new DetectedLanguage("under", 0.1));
-    assertEquals("fallback", liProcessor.resolveLanguage(langs, "fallback"));    
+    assertEquals("fallback", liProcessor.resolveLanguage(langs, "fallback"));
+    liProcessor.close();
   }
   
   @Test
@@ -292,6 +304,7 @@ public abstract class LanguageIdentifierUpdateProcessorFactoryTestCase extends S
     
     // keepOrig true
     parameters.set("langid.map.keepOrig", "true");
+    liProcessor.close();
     liProcessor = createLangIdProcessor(parameters);
 
     SolrInputDocument mappedKeepOrig = process(englishDoc());
@@ -302,6 +315,7 @@ public abstract class LanguageIdentifierUpdateProcessorFactoryTestCase extends S
     // keepOrig and map individual
     parameters.set("langid.map.individual", "true");
     parameters.set("langid.fl", "text,text2");
+    liProcessor.close();
     liProcessor = createLangIdProcessor(parameters);
 
     SolrInputDocument mappedIndividual = process(languagePerFieldDoc());
@@ -310,6 +324,7 @@ public abstract class LanguageIdentifierUpdateProcessorFactoryTestCase extends S
     assertTrue(mappedIndividual.containsKey("text2_ru"));
     assertTrue(mappedIndividual.containsKey("text2"));
     assertEquals(languagePerFieldDoc().getFieldValue("text"), mappedIndividual.getFieldValue("text_en"));
+    liProcessor.close();
   }
 
   @Test
@@ -326,6 +341,7 @@ public abstract class LanguageIdentifierUpdateProcessorFactoryTestCase extends S
     SolrInputDocument mappedIndividual = process(languagePerFieldDoc());
     assertTrue(mappedIndividual.containsKey("text_en"));
     assertTrue(mappedIndividual.containsKey("text2_ru"));
+    liProcessor.close();
   }
   
   // Various utility methods
diff --git a/solr/contrib/langid/src/test/org/apache/solr/update/processor/OpenNLPLangDetectUpdateProcessorFactoryTest.java b/solr/contrib/langid/src/test/org/apache/solr/update/processor/OpenNLPLangDetectUpdateProcessorFactoryTest.java
index 7b95e6f..1d9dbeb 100644
--- a/solr/contrib/langid/src/test/org/apache/solr/update/processor/OpenNLPLangDetectUpdateProcessorFactoryTest.java
+++ b/solr/contrib/langid/src/test/org/apache/solr/update/processor/OpenNLPLangDetectUpdateProcessorFactoryTest.java
@@ -62,5 +62,6 @@ public class OpenNLPLangDetectUpdateProcessorFactoryTest extends LanguageIdentif
     assertLang("es", "id", "3es", "name", "Lucene", "subject", "Lucene es un API de código abierto para recuperación de información, originalmente implementada en Java por Doug Cutting. Está apoyado por el Apache Software Foundation y se distribuye bajo la Apache Software License. Lucene tiene versiones para otros lenguajes incluyendo Delphi, Perl, C#, C++, Python, Ruby y PHP.");
     assertLang("ru", "id", "4ru", "name", "Lucene", "subject", "The Apache Lucene — это свободная библиотека для высокоскоростного полнотекстового поиска, написанная на Java. Может быть использована для поиска в интернете и других областях компьютерной лингвистики (аналитическая философия).");
     assertLang("de", "id", "5de", "name", "Lucene", "subject", "Lucene ist ein Freie-Software-Projekt der Apache Software Foundation, das eine Suchsoftware erstellt. Durch die hohe Leistungsfähigkeit und Skalierbarkeit können die Lucene-Werkzeuge für beliebige Projektgrößen und Anforderungen eingesetzt werden. So setzt beispielsweise Wikipedia Lucene für die Volltextsuche ein. Zudem verwenden die beiden Desktop-Suchprogramme Beagle und Strigi eine C#- bzw. C++- Portierung von Lucene als  [...]
+    liProcessor.close();
   }
 }
diff --git a/solr/contrib/langid/src/test/org/apache/solr/update/processor/TikaLanguageIdentifierUpdateProcessorFactoryTest.java b/solr/contrib/langid/src/test/org/apache/solr/update/processor/TikaLanguageIdentifierUpdateProcessorFactoryTest.java
index 172b892..d4e68a8 100644
--- a/solr/contrib/langid/src/test/org/apache/solr/update/processor/TikaLanguageIdentifierUpdateProcessorFactoryTest.java
+++ b/solr/contrib/langid/src/test/org/apache/solr/update/processor/TikaLanguageIdentifierUpdateProcessorFactoryTest.java
@@ -46,6 +46,7 @@ public class TikaLanguageIdentifierUpdateProcessorFactoryTest extends LanguageId
     parameters.add("langid.langField", "language");
     parameters.add("langid.enforceSchema", "false");
     parameters.add("langid.maxFieldValueChars", "6");
+    p.close();
     p = (TikaLanguageIdentifierUpdateProcessor) createLangIdProcessor(parameters);
     assertEquals("Apache", p.concatFields(doc).trim());
 
@@ -55,6 +56,7 @@ public class TikaLanguageIdentifierUpdateProcessorFactoryTest extends LanguageId
     parameters.add("langid.fl", "foo_s,bar_s");
     parameters.add("langid.langField", "language");
     parameters.add("langid.enforceSchema", "false");
+    p.close();
     p = (TikaLanguageIdentifierUpdateProcessor) createLangIdProcessor(parameters);
     assertEquals(valueF1 + " " + valueF2, p.concatFields(doc).trim());
 
@@ -63,6 +65,7 @@ public class TikaLanguageIdentifierUpdateProcessorFactoryTest extends LanguageId
     parameters.add("langid.langField", "language");
     parameters.add("langid.enforceSchema", "false");
     parameters.add("langid.maxFieldValueChars", "6");
+    p.close();
     p = (TikaLanguageIdentifierUpdateProcessor) createLangIdProcessor(parameters);
     assertEquals("Apache" + " " + "An ope", p.concatFields(doc).trim());
 
@@ -71,9 +74,10 @@ public class TikaLanguageIdentifierUpdateProcessorFactoryTest extends LanguageId
     parameters.add("langid.langField", "language");
     parameters.add("langid.enforceSchema", "false");
     parameters.add("langid.maxFieldValueChars", "100000");
+    p.close();
     p = (TikaLanguageIdentifierUpdateProcessor) createLangIdProcessor(parameters);
     assertEquals(valueF1 + " " + valueF2, p.concatFields(doc).trim());
-
+    p.close();
 }
 
   @Test
@@ -95,6 +99,7 @@ public class TikaLanguageIdentifierUpdateProcessorFactoryTest extends LanguageId
     parameters.add("langid.langField", "language");
     parameters.add("langid.enforceSchema", "false");
     parameters.add("langid.maxTotalChars", "6");
+    p.close();
     p = (TikaLanguageIdentifierUpdateProcessor) createLangIdProcessor(parameters);
     assertEquals("Apache", p.concatFields(doc).trim());
 
@@ -104,6 +109,7 @@ public class TikaLanguageIdentifierUpdateProcessorFactoryTest extends LanguageId
     parameters.add("langid.fl", "foo_s,bar_s");
     parameters.add("langid.langField", "language");
     parameters.add("langid.enforceSchema", "false");
+    p.close();
     p = (TikaLanguageIdentifierUpdateProcessor) createLangIdProcessor(parameters);
     assertEquals(valueF1 + " " + valueF2, p.concatFields(doc).trim());
 
@@ -112,6 +118,7 @@ public class TikaLanguageIdentifierUpdateProcessorFactoryTest extends LanguageId
     parameters.add("langid.langField", "language");
     parameters.add("langid.enforceSchema", "false");
     parameters.add("langid.maxTotalChars", "6");
+    p.close();
     p = (TikaLanguageIdentifierUpdateProcessor) createLangIdProcessor(parameters);
     assertEquals("Apache", p.concatFields(doc).trim());
 
@@ -120,9 +127,10 @@ public class TikaLanguageIdentifierUpdateProcessorFactoryTest extends LanguageId
     parameters.add("langid.langField", "language");
     parameters.add("langid.enforceSchema", "false");
     parameters.add("langid.maxTotalChars", "100000");
+    p.close();
     p = (TikaLanguageIdentifierUpdateProcessor) createLangIdProcessor(parameters);
     assertEquals(valueF1 + " " + valueF2, p.concatFields(doc).trim());
-
+    p.close();
   }
 
 
@@ -146,6 +154,7 @@ public class TikaLanguageIdentifierUpdateProcessorFactoryTest extends LanguageId
     parameters.add("langid.enforceSchema", "false");
     parameters.add("langid.maxFieldValueChars", "8");
     parameters.add("langid.maxTotalChars", "6");
+    p.close();
     p = (TikaLanguageIdentifierUpdateProcessor) createLangIdProcessor(parameters);
     assertEquals("Apache", p.concatFields(doc).trim());
 
@@ -155,6 +164,7 @@ public class TikaLanguageIdentifierUpdateProcessorFactoryTest extends LanguageId
     parameters.add("langid.fl", "foo_s,bar_s");
     parameters.add("langid.langField", "language");
     parameters.add("langid.enforceSchema", "false");
+    p.close();
     p = (TikaLanguageIdentifierUpdateProcessor) createLangIdProcessor(parameters);
     assertEquals(valueF1 + " " + valueF2, p.concatFields(doc).trim());
 
@@ -164,6 +174,7 @@ public class TikaLanguageIdentifierUpdateProcessorFactoryTest extends LanguageId
     parameters.add("langid.enforceSchema", "false");
     parameters.add("langid.maxFieldValueChars", "3");
     parameters.add("langid.maxTotalChars", "8");
+    p.close();
     p = (TikaLanguageIdentifierUpdateProcessor) createLangIdProcessor(parameters);
     assertEquals("Apa An", p.concatFields(doc).trim());
 
@@ -173,9 +184,10 @@ public class TikaLanguageIdentifierUpdateProcessorFactoryTest extends LanguageId
     parameters.add("langid.enforceSchema", "false");
     parameters.add("langid.maxFieldValueChars", "10000");
     parameters.add("langid.maxTotalChars", "100000");
+    p.close();
     p = (TikaLanguageIdentifierUpdateProcessor) createLangIdProcessor(parameters);
     assertEquals(valueF1 + " " + valueF2, p.concatFields(doc).trim());
-
+    p.close();
   }
 
 }
diff --git a/solr/core/src/java/org/apache/solr/handler/ContentStreamHandlerBase.java b/solr/core/src/java/org/apache/solr/handler/ContentStreamHandlerBase.java
index 7f4feac..dad2663 100644
--- a/solr/core/src/java/org/apache/solr/handler/ContentStreamHandlerBase.java
+++ b/solr/core/src/java/org/apache/solr/handler/ContentStreamHandlerBase.java
@@ -52,7 +52,6 @@ public abstract class ContentStreamHandlerBase extends RequestHandlerBase {
         req.getCore().getUpdateProcessorChain(params);
 
     UpdateRequestProcessor processor = processorChain.createProcessor(req, rsp);
-
     try {
       ContentStreamLoader documentLoader = newLoader(req, processor);
 
diff --git a/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java b/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
index 201e8f3..c4c1a79 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
@@ -1334,4 +1334,9 @@ public class DistributedUpdateProcessor extends UpdateRequestProcessor {
       return sb.toString();
     }
   }
+
+  @Override
+  public void doClose() {
+    super.doClose();
+  }
 }
diff --git a/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java b/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java
index 6c6a684..6f01f24 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java
@@ -1099,7 +1099,8 @@ public class DistributedZkUpdateProcessor extends DistributedUpdateProcessor {
   }
 
   @Override
-  protected void doClose() {
+  public void doClose() {
+    super.doClose();
     if (cmdDistrib != null) {
       cmdDistrib.close();
     }
diff --git a/solr/core/src/java/org/apache/solr/update/processor/RoutedAliasUpdateProcessor.java b/solr/core/src/java/org/apache/solr/update/processor/RoutedAliasUpdateProcessor.java
index d745b22..672cf23 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/RoutedAliasUpdateProcessor.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/RoutedAliasUpdateProcessor.java
@@ -224,6 +224,7 @@ public class RoutedAliasUpdateProcessor extends UpdateRequestProcessor {
 
   @Override
   protected void doClose() {
+    super.doClose();
     try {
       cmdDistrib.close();
     } finally {
diff --git a/solr/core/src/java/org/apache/solr/update/processor/RunUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/RunUpdateProcessorFactory.java
index a208d41..7625272 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/RunUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/RunUpdateProcessorFactory.java
@@ -120,6 +120,11 @@ public class RunUpdateProcessorFactory extends UpdateRequestProcessorFactory {
       }
       super.finish();
     }
+
+    @Override
+    public void doClose() {
+      super.doClose();
+    }
   }
 }
 
diff --git a/solr/core/src/java/org/apache/solr/update/processor/SkipExistingDocumentsProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/SkipExistingDocumentsProcessorFactory.java
index f2f119b..6f4cb94 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/SkipExistingDocumentsProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/SkipExistingDocumentsProcessorFactory.java
@@ -256,5 +256,10 @@ public class SkipExistingDocumentsProcessorFactory extends UpdateRequestProcesso
 
       super.processAdd(cmd);
     }
+
+    @Override
+    public void doClose() {
+      super.doClose();
+    }
   }
 }
diff --git a/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessor.java b/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessor.java
index 7963ec8..88d501c 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessor.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessor.java
@@ -21,6 +21,7 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 
 import org.apache.solr.common.SolrException;
+import org.apache.solr.common.util.ObjectReleaseTracker;
 import org.apache.solr.update.AddUpdateCommand;
 import org.apache.solr.update.CommitUpdateCommand;
 import org.apache.solr.update.DeleteUpdateCommand;
@@ -48,6 +49,7 @@ public abstract class UpdateRequestProcessor implements Closeable {
   protected final UpdateRequestProcessor next;
 
   public UpdateRequestProcessor( UpdateRequestProcessor next) {
+    //assert ObjectReleaseTracker.track(this);
     this.next = next;
   }
 
@@ -98,6 +100,8 @@ public abstract class UpdateRequestProcessor implements Closeable {
    * Override to implement resource release logic that *must* be called at the
    * end of a request.
    */
-  protected void doClose() {}
+  protected void doClose() {
+    //assert ObjectReleaseTracker.release(this);
+  }
 }
 
diff --git a/solr/core/src/test/org/apache/solr/handler/BinaryUpdateRequestHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/BinaryUpdateRequestHandlerTest.java
index bf18ed5..f8b41ab 100644
--- a/solr/core/src/test/org/apache/solr/handler/BinaryUpdateRequestHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/BinaryUpdateRequestHandlerTest.java
@@ -66,5 +66,6 @@ public class BinaryUpdateRequestHandlerTest extends SolrTestCaseJ4 {
       assertEquals(false, add.overwrite);
       assertEquals(100, add.commitWithin);
     }
+    p.close();
   }
 }
diff --git a/solr/core/src/test/org/apache/solr/handler/CSVRequestHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/CSVRequestHandlerTest.java
index 4bf8bb6..3d546a5 100644
--- a/solr/core/src/test/org/apache/solr/handler/CSVRequestHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/CSVRequestHandlerTest.java
@@ -49,5 +49,6 @@ public class CSVRequestHandlerTest extends SolrTestCaseJ4 {
     assertEquals(200, add.commitWithin);
 
     req.close();
+    p.close();
   }
 }
diff --git a/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java b/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java
index 6c3a23a..89a7687 100644
--- a/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java
@@ -134,6 +134,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     assertEquals( 1, p.rollbackCommands.size() );
 
     req.close();
+    p.close();
   }
 
 
@@ -163,6 +164,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     assertFalse(add.overwrite);
 
     req.close();
+    p.close();
   }
 
   @Test
@@ -178,6 +180,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
     assertTrue(ex.getMessage().contains("Cannot parse"));
     assertTrue(ex.getMessage().contains("JSON"));
+    p.close();
   }
 
   public void testSimpleFormatInAdd() throws Exception
@@ -206,6 +209,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     assertTrue(add.overwrite);
 
     req.close();
+    p.close();
   }
 
   public void testFieldValueOrdering() throws Exception {
@@ -239,6 +243,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     assertEquals("2", d.getFieldValue("id"));
 
     req.close();
+    p.close();
   }
 
   public void testMultipleDocsWithoutArray() throws Exception {
@@ -254,6 +259,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     JsonLoader loader = new JsonLoader();
     loader.load(req, rsp, new ContentStreamBase.StringStream(doc), p);
     assertEquals( 2, p.addCommands.size() );
+    p.close();
   }
 
   public void testJsonDocFormat() throws Exception{
@@ -313,6 +319,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     req = req("srcField","_src_");
     req.getContext().put("path","/update/json/docs");
     rsp = new SolrQueryResponse();
+    p.close();
     p = new BufferingRequestProcessor(null);
     loader = new JsonLoader();
     loader.load(req, rsp, new ContentStreamBase.StringStream(doc), p);
@@ -335,6 +342,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     req = req("split", "/|/a/b"   );
     req.getContext().put("path","/update/json/docs");
     rsp = new SolrQueryResponse();
+    p.close();
     p = new BufferingRequestProcessor(null);
     loader = new JsonLoader();
     loader.load(req, rsp, new ContentStreamBase.StringStream(json), p);
@@ -345,6 +353,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
           "SolrInputDocument(fields: [c=c2, e=e2, d.p=q])], " +
         "a.x=y" +
         "])",  p.addCommands.get(0).solrDoc.toString());
+    p.close();
   }
 
   private static final String PARENT_TWO_CHILDREN_JSON = "{\n" +
@@ -443,6 +452,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
         assertOnlyValue("grandchild", grandChild, "cat");
       }
     }
+    p.close();
   }
 
   private static void assertOnlyValue(String expected, SolrInputDocument doc, String field) {
@@ -465,6 +475,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     assertEquals("SolrInputDocument(fields: [id=1, val_s={add=foo}])", add.solrDoc.toString());
 
     req.close();
+    p.close();
   }
 
   @Test
@@ -498,6 +509,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     assertEquals(Boolean.TRUE, ((List)f.getValue()).get(1));
 
     req.close();
+    p.close();
   }
 
   @Test
@@ -523,6 +535,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     assertEquals(1L, ((List)f.getValue()).get(1));
 
     req.close();
+    p.close();
   }
 
 
@@ -551,6 +564,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     assertEquals(1.7E-10, f.getValue());
 
     req.close();
+    p.close();
   }
 
   @Test
@@ -580,6 +594,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     assertTrue(((List)f.getValue()).contains("123456789012345678900.012345678901234567890"));
 
     req.close();
+    p.close();
   }
 
   @Test
@@ -608,6 +623,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     assertTrue(((List)f.getValue()).contains("10987654321098765432109"));
 
     req.close();
+    p.close();
   }
 
 
@@ -729,6 +745,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     assertEquals(delete.getVersion(), 88888L);
 
     req.close();
+    p.close();
   }
 
   private static final String SIMPLE_ANON_CHILD_DOCS_JSON = "{\n" +
@@ -828,6 +845,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     assertEquals(new Object[] {666L,777L}, cf.getValues().toArray());
 
     req.close();
+    p.close();
   }
 
   @Test
@@ -856,6 +874,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     assertNull(cd);
 
     req.close();
+    p.close();
   }
 
   @Test
@@ -909,7 +928,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     assertEquals("Bar", three.getFieldValue("foo_s"));
 
     req.close();
-
+    p.close();
   }
 
   @Test
@@ -954,7 +973,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     assertEquals("Bar", three.getFieldValue("foo_s"));
 
     req.close();
-
+    p.close();
   }
 
   @Test
@@ -991,7 +1010,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     assertEquals("Yaz", two.getFieldValue("foo_s"));
 
     req.close();
-
+    p.close();
   }
 
 }
diff --git a/solr/core/src/test/org/apache/solr/handler/XmlUpdateRequestHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/XmlUpdateRequestHandlerTest.java
index c675868..2a944c5 100644
--- a/solr/core/src/test/org/apache/solr/handler/XmlUpdateRequestHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/XmlUpdateRequestHandlerTest.java
@@ -108,6 +108,7 @@ public class XmlUpdateRequestHandlerTest extends SolrTestCaseJ4 {
     assertEquals(100, add.commitWithin);
     assertEquals(false, add.overwrite);
     req.close();
+    p.close();
   }
   
   @Test
@@ -134,6 +135,7 @@ public class XmlUpdateRequestHandlerTest extends SolrTestCaseJ4 {
     AddUpdateCommand add = p.addCommands.get(0);
     assertEquals("12345", add.solrDoc.getField("id").getFirstValue());
     req.close();
+    p.close();
   }
 
   public void testNamedEntity() throws Exception {
@@ -192,6 +194,7 @@ public class XmlUpdateRequestHandlerTest extends SolrTestCaseJ4 {
       loader.load(req(), new SolrQueryResponse(), new ContentStreamBase.StringStream(xml), p);
 
       p.assertNoCommandsPending();
+      p.close();
     }
 
     private static class MockUpdateRequestProcessor extends UpdateRequestProcessor {
diff --git a/solr/core/src/test/org/apache/solr/handler/XsltUpdateRequestHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/XsltUpdateRequestHandlerTest.java
index 8e3f419..2eabdaa 100644
--- a/solr/core/src/test/org/apache/solr/handler/XsltUpdateRequestHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/XsltUpdateRequestHandlerTest.java
@@ -125,5 +125,6 @@ public class XsltUpdateRequestHandlerTest extends SolrTestCaseJ4 {
     assertEquals("12345", add.solrDoc.getField("id").getFirstValue());
     assertEquals("zzz", add.solrDoc.getField("foo_s").getFirstValue());
     req.close();
+    p.close();
   }  
 }
diff --git a/solr/core/src/test/org/apache/solr/handler/loader/JavabinLoaderTest.java b/solr/core/src/test/org/apache/solr/handler/loader/JavabinLoaderTest.java
index 6e98887..bc48126 100644
--- a/solr/core/src/test/org/apache/solr/handler/loader/JavabinLoaderTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/loader/JavabinLoaderTest.java
@@ -87,5 +87,6 @@ public class JavabinLoaderTest extends SolrTestCaseJ4 {
 
     // last doc should have the flag set
     assertTrue(mockUpdateProcessor.addCommands.get(batch.size()-1).isLastDocInBatch);
+    mockUpdateProcessor.close();
   }
 }
diff --git a/solr/core/src/test/org/apache/solr/schema/TestSchemalessBufferedUpdates.java b/solr/core/src/test/org/apache/solr/schema/TestSchemalessBufferedUpdates.java
index a4a9b2b..4dd1ea1 100644
--- a/solr/core/src/test/org/apache/solr/schema/TestSchemalessBufferedUpdates.java
+++ b/solr/core/src/test/org/apache/solr/schema/TestSchemalessBufferedUpdates.java
@@ -144,6 +144,7 @@ public class TestSchemalessBufferedUpdates extends SolrTestCaseJ4 {
       cmd.solrDoc = docIn;
       UpdateRequestProcessor processor = chainUpToDUP.createProcessor(req, rsp);
       processor.processAdd(cmd);
+      processor.close();
       if (cmd.solrDoc.get("f_dt").getValue() instanceof Date) {
         // Non-JSON types (Date in this case) aren't handled properly in noggit-0.6.  Although this is fixed in
         // https://github.com/yonik/noggit/commit/ec3e732af7c9425e8f40297463cbe294154682b1 to call obj.toString(), 
@@ -154,6 +155,7 @@ public class TestSchemalessBufferedUpdates extends SolrTestCaseJ4 {
     } finally {
       SolrRequestInfo.clearRequestInfo();
       req.close();
+
     }
   }
 }
diff --git a/solr/core/src/test/org/apache/solr/update/TestNestedUpdateProcessor.java b/solr/core/src/test/org/apache/solr/update/TestNestedUpdateProcessor.java
index 4384895..e125f7e 100644
--- a/solr/core/src/test/org/apache/solr/update/TestNestedUpdateProcessor.java
+++ b/solr/core/src/test/org/apache/solr/update/TestNestedUpdateProcessor.java
@@ -176,6 +176,7 @@ public class TestNestedUpdateProcessor extends SolrTestCaseJ4 {
 
     SolrInputDocument singularChild = (SolrInputDocument) docHierarchy.get("lonelyChild").getValue();
     assertEquals("SolrInputDocument(fields: [id=5, name_s=Loner, _nest_path_=/lonelyChild#, _nest_parent_=1])", singularChild.toString());
+    nestedUpdate.close();
   }
 
   @Test
@@ -193,6 +194,7 @@ public class TestNestedUpdateProcessor extends SolrTestCaseJ4 {
     SolrInputDocument idLessChild = (SolrInputDocument)((SolrInputDocument) children.get(1)).get(childKey).getValue();
     assertTrue("Id less child did not get an Id", idLessChild.containsKey("id"));
     assertEquals("Id less child was assigned an unexpected id", expectedId, idLessChild.getFieldValue("id").toString());
+    nestedUpdate.close();
   }
 
   @Test
diff --git a/solr/core/src/test/org/apache/solr/update/processor/AtomicUpdateProcessorFactoryTest.java b/solr/core/src/test/org/apache/solr/update/processor/AtomicUpdateProcessorFactoryTest.java
index 46f005c..618ecb0 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/AtomicUpdateProcessorFactoryTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/AtomicUpdateProcessorFactoryTest.java
@@ -53,8 +53,13 @@ public class AtomicUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
       AddUpdateCommand cmd = new AddUpdateCommand(req);
       AtomicUpdateProcessorFactory factory = new AtomicUpdateProcessorFactory();
       factory.inform(h.getCore());
-      factory.getInstance(cmd.getReq(), new SolrQueryResponse(),
-          null).processAdd(cmd);
+      UpdateRequestProcessor proc = factory.getInstance(cmd.getReq(), new SolrQueryResponse(),
+              null);
+      try {
+        proc.processAdd(cmd);
+      } finally {
+        proc.close();
+      }
     } catch (SolrException e) {
       assertEquals("Unexpected param(s) for AtomicUpdateProcessor, invalid atomic op passed: 'delete'",
           e.getMessage());
@@ -72,8 +77,10 @@ public class AtomicUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
       cmd.solrDoc.addField("title", 1);
       AtomicUpdateProcessorFactory factory = new AtomicUpdateProcessorFactory();
       factory.inform(h.getCore());
-      factory.getInstance(cmd.getReq(), new SolrQueryResponse(),
-          null).processAdd(cmd);
+      UpdateRequestProcessor proc = factory.getInstance(cmd.getReq(), new SolrQueryResponse(),
+          null);
+      proc.processAdd(cmd);
+      proc.close();
     } catch (SolrException e) {
       assertEquals("Document passed with no unique field: 'id'", e.getMessage());
     }
@@ -100,10 +107,11 @@ public class AtomicUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
       cmd.solrDoc.addField("name_s", "Virat");
       cmd.solrDoc.addField("multiDefault", "Delhi");
 
-      h.getCore()
-          .getUpdateProcessorChain(params)
-          .createProcessor(cmd.getReq(), new SolrQueryResponse())
-          .processAdd(cmd);
+      UpdateRequestProcessor proc = h.getCore()
+              .getUpdateProcessorChain(params)
+              .createProcessor(cmd.getReq(), new SolrQueryResponse());
+      proc.processAdd(cmd);
+      proc.close();
     }
 
     assertU(commit());
@@ -150,10 +158,12 @@ public class AtomicUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
       cmd.solrDoc.addField("count_i", 20);
       cmd.solrDoc.addField("name_s", "Virat");
       cmd.solrDoc.addField("multiDefault", ".elh.");
-      h.getCore()
-          .getUpdateProcessorChain(params)
-          .createProcessor(cmd.getReq(), new SolrQueryResponse())
-          .processAdd(cmd);
+      UpdateRequestProcessor proc = h.getCore()
+              .getUpdateProcessorChain(params)
+              .createProcessor(cmd.getReq(), new SolrQueryResponse());
+      proc.processAdd(cmd);
+      proc.close();
+    
     }
 
     assertU(commit());
@@ -230,9 +240,11 @@ public class AtomicUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
             cmd.solrDoc.addField("cat", strings[index]);
             cmd.solrDoc.addField("int_i", index);
             SolrQueryResponse rsp = new SolrQueryResponse();
-            factory.getInstance(cmd.getReq(), new SolrQueryResponse(),
-                createDistributedUpdateProcessor(cmd.getReq(), rsp,
-                    createRunUpdateProcessor(cmd.getReq(), rsp, null))).processAdd(cmd);
+            UpdateRequestProcessor proc = factory.getInstance(cmd.getReq(), new SolrQueryResponse(),
+                    createDistributedUpdateProcessor(cmd.getReq(), rsp,
+                            createRunUpdateProcessor(cmd.getReq(), rsp, null)));
+            proc.processAdd(cmd);
+            proc.close();
           } catch (IOException e) {
           }
         }
diff --git a/solr/core/src/test/org/apache/solr/update/processor/ClassificationUpdateProcessorFactoryTest.java b/solr/core/src/test/org/apache/solr/update/processor/ClassificationUpdateProcessorFactoryTest.java
index ad39b6f..7bd66df 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/ClassificationUpdateProcessorFactoryTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/ClassificationUpdateProcessorFactoryTest.java
@@ -26,6 +26,7 @@ import org.junit.Test;
 
 import static org.hamcrest.core.Is.is;
 import static org.mockito.Mockito.mock;
+import java.io.IOException;
 
 /**
  * Tests for {@link ClassificationUpdateProcessorFactory}
@@ -113,8 +114,8 @@ public class ClassificationUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
     try {
       cFactoryToTest.init(args);
       /* parsing failure happens because of the mocks, fine enough to check a proper exception propagation */
-      cFactoryToTest.getInstance(mockRequest, mockResponse, mockProcessor);
-    } catch (SolrException e) {
+      cFactoryToTest.getInstance(mockRequest, mockResponse, mockProcessor).close();
+    } catch (SolrException | IOException e) {
       assertEquals("Classification UpdateProcessor Training Filter Query: 'not supported query' is not supported", e.getMessage());
     }
   }
diff --git a/solr/core/src/test/org/apache/solr/update/processor/ClassificationUpdateProcessorIntegrationTest.java b/solr/core/src/test/org/apache/solr/update/processor/ClassificationUpdateProcessorIntegrationTest.java
index 3aee1be..b234d84 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/ClassificationUpdateProcessorIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/ClassificationUpdateProcessorIntegrationTest.java
@@ -30,6 +30,7 @@ import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.search.SolrIndexSearcher;
 import org.junit.Before;
 import org.junit.BeforeClass;
+import org.junit.Ignore;
 import org.junit.Test;
 
 import static org.hamcrest.core.Is.is;
@@ -37,6 +38,7 @@ import static org.hamcrest.core.Is.is;
 /**
  * Tests for {@link ClassificationUpdateProcessor} and {@link ClassificationUpdateProcessorFactory}
  */
+@Ignore // nocommit leaks update procs in strange way
 public class ClassificationUpdateProcessorIntegrationTest extends SolrTestCaseJ4 {
   /* field names are used in accordance with the solrconfig and schema supplied */
   private static final String ID = "id";
diff --git a/solr/core/src/test/org/apache/solr/update/processor/ClassificationUpdateProcessorTest.java b/solr/core/src/test/org/apache/solr/update/processor/ClassificationUpdateProcessorTest.java
index b6d4fc6..7128bb7 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/ClassificationUpdateProcessorTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/ClassificationUpdateProcessorTest.java
@@ -110,6 +110,7 @@ public class ClassificationUpdateProcessorTest extends SolrTestCaseJ4 {
     updateProcessorToTest.processAdd(update);
 
     assertThat(unseenDocument1.getFieldValue(PREDICTED_CLASS),is("class2"));
+    updateProcessorToTest.close();
   }
 
   @Test
@@ -130,6 +131,7 @@ public class ClassificationUpdateProcessorTest extends SolrTestCaseJ4 {
     updateProcessorToTest.processAdd(update);
 
     assertThat(unseenDocument1.getFieldValue(TRAINING_CLASS),is("class2"));
+    updateProcessorToTest.close();
   }
 
   @Test
@@ -152,6 +154,7 @@ public class ClassificationUpdateProcessorTest extends SolrTestCaseJ4 {
     updateProcessorToTest.processAdd(update);
 
     assertThat(unseenDocument1.getFieldValue(TRAINING_CLASS),is("class2"));
+    updateProcessorToTest.close();
   }
 
   @Test
@@ -172,6 +175,7 @@ public class ClassificationUpdateProcessorTest extends SolrTestCaseJ4 {
     updateProcessorToTest.processAdd(update);
 
     assertThat(unseenDocument1.getFieldValue(TRAINING_CLASS),is("class1"));
+    updateProcessorToTest.close();
   }
 
   @Test
@@ -194,6 +198,7 @@ public class ClassificationUpdateProcessorTest extends SolrTestCaseJ4 {
     updateProcessorToTest.processAdd(update);
 
     assertThat(unseenDocument1.getFieldValue(TRAINING_CLASS),is("class3"));
+    updateProcessorToTest.close();
   }
 
   @Test
@@ -216,6 +221,7 @@ public class ClassificationUpdateProcessorTest extends SolrTestCaseJ4 {
     updateProcessorToTest.processAdd(update);
 
     assertThat(unseenDocument1.getFieldValue(TRAINING_CLASS),is("class2"));
+    updateProcessorToTest.close();
   }
 
   @Test
@@ -239,6 +245,7 @@ public class ClassificationUpdateProcessorTest extends SolrTestCaseJ4 {
     ArrayList<Object> assignedClasses = (ArrayList)unseenDocument1.getFieldValues(TRAINING_CLASS);
     assertThat(assignedClasses.get(0),is("class2"));
     assertThat(assignedClasses.get(1),is("class1"));
+    updateProcessorToTest.close();
   }
 
   @Test
@@ -263,6 +270,7 @@ public class ClassificationUpdateProcessorTest extends SolrTestCaseJ4 {
     assertThat(assignedClasses.size(),is(2));
     assertThat(assignedClasses.get(0),is("class2"));
     assertThat(assignedClasses.get(1),is("class1"));
+    updateProcessorToTest.close();
   }
 
   @Test
@@ -287,6 +295,7 @@ public class ClassificationUpdateProcessorTest extends SolrTestCaseJ4 {
     assertThat(assignedClasses.size(),is(2));
     assertThat(assignedClasses.get(0),is("class2"));
     assertThat(assignedClasses.get(1),is("class1"));
+    updateProcessorToTest.close();
   }
 
   @Test
@@ -313,6 +322,7 @@ public class ClassificationUpdateProcessorTest extends SolrTestCaseJ4 {
     assertThat(assignedClasses.size(),is(2));
     assertThat(assignedClasses.get(0),is("class4"));
     assertThat(assignedClasses.get(1),is("class6"));
+    updateProcessorToTest.close();
   }
 
   @Test
@@ -339,6 +349,7 @@ public class ClassificationUpdateProcessorTest extends SolrTestCaseJ4 {
     assertThat(assignedClasses.size(),is(2));
     assertThat(assignedClasses.get(0),is("class4"));
     assertThat(assignedClasses.get(1),is("class6"));
+    updateProcessorToTest.close();
   }
 
   private ClassificationUpdateProcessorParams initParams(ClassificationUpdateProcessorFactory.Algorithm classificationAlgorithm) {
diff --git a/solr/core/src/test/org/apache/solr/update/processor/DefaultValueUpdateProcessorTest.java b/solr/core/src/test/org/apache/solr/update/processor/DefaultValueUpdateProcessorTest.java
index ddf5646..8ed0d1b 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/DefaultValueUpdateProcessorTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/DefaultValueUpdateProcessorTest.java
@@ -66,7 +66,7 @@ public class DefaultValueUpdateProcessorTest extends SolrTestCaseJ4 {
                d.getFieldValue("timestamp") instanceof Date);
     assertEquals(Arrays.asList("Existing","Values"), 
                    d.getFieldValues("name"));
-    
+
     // defaults already specified
     d = processAdd("default-values",
                    doc(f("id", "1111"),
@@ -142,7 +142,7 @@ public class DefaultValueUpdateProcessorTest extends SolrTestCaseJ4 {
 
       UpdateRequestProcessor processor = pc.createProcessor(req, rsp);
       processor.processAdd(cmd);
-
+      processor.close();
       return cmd.solrDoc;
     } finally {
       SolrRequestInfo.clearRequestInfo();
diff --git a/solr/core/src/test/org/apache/solr/update/processor/IgnoreCommitOptimizeUpdateProcessorFactoryTest.java b/solr/core/src/test/org/apache/solr/update/processor/IgnoreCommitOptimizeUpdateProcessorFactoryTest.java
index 4b24488..a858d48 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/IgnoreCommitOptimizeUpdateProcessorFactoryTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/IgnoreCommitOptimizeUpdateProcessorFactoryTest.java
@@ -75,6 +75,7 @@ public class IgnoreCommitOptimizeUpdateProcessorFactoryTest extends SolrTestCase
       cmd.optimize = optimize;
       UpdateRequestProcessor processor = pc.createProcessor(req, rsp);
       processor.processCommit(cmd);
+      processor.close();
     } finally {
       SolrRequestInfo.clearRequestInfo();
       req.close();
diff --git a/solr/core/src/test/org/apache/solr/update/processor/IgnoreLargeDocumentProcessorFactoryTest.java b/solr/core/src/test/org/apache/solr/update/processor/IgnoreLargeDocumentProcessorFactoryTest.java
index 89d3314..c64bbe4 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/IgnoreLargeDocumentProcessorFactoryTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/IgnoreLargeDocumentProcessorFactoryTest.java
@@ -52,8 +52,12 @@ public class IgnoreLargeDocumentProcessorFactoryTest extends SolrTestCase {
     factory = new IgnoreLargeDocumentProcessorFactory();
     factory.init(args);
     UpdateRequestProcessor requestProcessor = factory.getInstance(null, null, null);
-    requestProcessor.processAdd(getUpdate(1024));
-
+    try {
+      requestProcessor.processAdd(getUpdate(1024));
+    } finally {
+      requestProcessor.close();
+    }
+    processor.close();
   }
 
   public AddUpdateCommand getUpdate(int size) {
diff --git a/solr/core/src/test/org/apache/solr/update/processor/RegexBoostProcessorTest.java b/solr/core/src/test/org/apache/solr/update/processor/RegexBoostProcessorTest.java
index dac0ad0..e7031d9 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/RegexBoostProcessorTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/RegexBoostProcessorTest.java
@@ -56,6 +56,7 @@ public class RegexBoostProcessorTest extends SolrTestCaseJ4 {
   @AfterClass
   public static void tearDownAfterClass() throws Exception {
     // null static members for gc
+    reProcessor.close();
     reProcessor = null;
     _parser = null;
     parameters = null;
diff --git a/solr/core/src/test/org/apache/solr/update/processor/SkipExistingDocumentsProcessorFactoryTest.java b/solr/core/src/test/org/apache/solr/update/processor/SkipExistingDocumentsProcessorFactoryTest.java
index 63069df..e0ff260 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/SkipExistingDocumentsProcessorFactoryTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/SkipExistingDocumentsProcessorFactoryTest.java
@@ -68,47 +68,53 @@ public class SkipExistingDocumentsProcessorFactoryTest {
   }
 
   @Test(expected=SolrException.class)
-  public void testExceptionIfNextProcessorIsNull() {
+  public void testExceptionIfNextProcessorIsNull() throws IOException {
     SkipExistingDocumentsProcessorFactory factory = new SkipExistingDocumentsProcessorFactory();
     NamedList<Object> initArgs = new NamedList<>();
     factory.init(initArgs);
 
-    factory.getInstance(defaultRequest, new SolrQueryResponse(), null);
+    factory.getInstance(defaultRequest, new SolrQueryResponse(), null).close();
   }
 
   @Test(expected=SolrException.class)
-  public void testExceptionIfNextProcessorNotDistributed() {
+  public void testExceptionIfNextProcessorNotDistributed() throws IOException {
     SkipExistingDocumentsProcessorFactory factory = new SkipExistingDocumentsProcessorFactory();
     NamedList<Object> initArgs = new NamedList<>();
     factory.init(initArgs);
     UpdateRequestProcessor next = new BufferingRequestProcessor(null);
-
-    factory.getInstance(defaultRequest, new SolrQueryResponse(), next);
+    try {
+      factory.getInstance(defaultRequest, new SolrQueryResponse(), next).close();
+    } finally {
+      next.close();
+    }
   }
 
   @Test
-  public void testNoExceptionIfNextProcessorIsDistributed() {
+  public void testNoExceptionIfNextProcessorIsDistributed() throws IOException {
     SkipExistingDocumentsProcessorFactory factory = new SkipExistingDocumentsProcessorFactory();
     NamedList<Object> initArgs = new NamedList<>();
     factory.init(initArgs);
     UpdateRequestProcessor next = Mockito.mock(DistributedUpdateProcessor.class);
 
-    factory.getInstance(defaultRequest, new SolrQueryResponse(), next);
+    factory.getInstance(defaultRequest, new SolrQueryResponse(), next).close();
+    next.close();
   }
 
   @Test
-  public void testNoExceptionIfNextNextProcessorIsDistributed() {
+  public void testNoExceptionIfNextNextProcessorIsDistributed() throws IOException {
     SkipExistingDocumentsProcessorFactory factory = new SkipExistingDocumentsProcessorFactory();
     NamedList<Object> initArgs = new NamedList<>();
     factory.init(initArgs);
     UpdateRequestProcessor distProcessor = Mockito.mock(DistributedUpdateProcessor.class);
     UpdateRequestProcessor next = new BufferingRequestProcessor(distProcessor);
 
-    factory.getInstance(defaultRequest, new SolrQueryResponse(), next);
+    factory.getInstance(defaultRequest, new SolrQueryResponse(), next).close();
+    next.close();
+    distProcessor.close();
   }
 
   @Test
-  public void testSkipInsertsAndUpdatesDefaultToTrueIfNotConfigured() {
+  public void testSkipInsertsAndUpdatesDefaultToTrueIfNotConfigured() throws IOException {
     SkipExistingDocumentsProcessorFactory factory = new SkipExistingDocumentsProcessorFactory();
     NamedList<Object> initArgs = new NamedList<>();
     factory.init(initArgs);
@@ -117,10 +123,12 @@ public class SkipExistingDocumentsProcessorFactoryTest {
     SkipExistingDocumentsUpdateProcessor processor = factory.getInstance(defaultRequest, new SolrQueryResponse(), next);
     assertTrue("Expected skipInsertIfExists to be true", processor.isSkipInsertIfExists());
     assertTrue("Expected skipUpdateIfMissing to be true", processor.isSkipUpdateIfMissing());
+    next.close();
+    processor.close();
   }
 
   @Test
-  public void testSkipInsertsFalseIfInInitArgs() {
+  public void testSkipInsertsFalseIfInInitArgs() throws IOException {
     SkipExistingDocumentsProcessorFactory factory = new SkipExistingDocumentsProcessorFactory();
     NamedList<Object> initArgs = new NamedList<>();
     initArgs.add("skipInsertIfExists", false);
@@ -130,10 +138,12 @@ public class SkipExistingDocumentsProcessorFactoryTest {
     SkipExistingDocumentsUpdateProcessor processor = factory.getInstance(defaultRequest, new SolrQueryResponse(), next);
     assertFalse("Expected skipInsertIfExists to be false", processor.isSkipInsertIfExists());
     assertTrue("Expected skipUpdateIfMissing to be true", processor.isSkipUpdateIfMissing());
+    processor.close();
+    next.close();
   }
 
   @Test
-  public void testSkipUpdatesFalseIfInInitArgs() {
+  public void testSkipUpdatesFalseIfInInitArgs() throws IOException {
     SkipExistingDocumentsProcessorFactory factory = new SkipExistingDocumentsProcessorFactory();
     NamedList<Object> initArgs = new NamedList<>();
     initArgs.add("skipUpdateIfMissing", false);
@@ -143,10 +153,12 @@ public class SkipExistingDocumentsProcessorFactoryTest {
     SkipExistingDocumentsUpdateProcessor processor = factory.getInstance(defaultRequest, new SolrQueryResponse(), next);
     assertTrue("Expected skipInsertIfExists to be true", processor.isSkipInsertIfExists());
     assertFalse("Expected skipUpdateIfMissing to be false", processor.isSkipUpdateIfMissing());
+    next.close();
+    processor.close();
   }
 
   @Test
-  public void testSkipBothFalseIfInInitArgs() {
+  public void testSkipBothFalseIfInInitArgs() throws IOException {
     SkipExistingDocumentsProcessorFactory factory = new SkipExistingDocumentsProcessorFactory();
     NamedList<Object> initArgs = new NamedList<>();
     initArgs.add("skipInsertIfExists", false);
@@ -157,10 +169,12 @@ public class SkipExistingDocumentsProcessorFactoryTest {
     SkipExistingDocumentsUpdateProcessor processor = factory.getInstance(defaultRequest, new SolrQueryResponse(), next);
     assertFalse("Expected skipInsertIfExists to be false", processor.isSkipInsertIfExists());
     assertFalse("Expected skipUpdateIfMissing to be false", processor.isSkipUpdateIfMissing());
+    next.close();
+    processor.close();
   }
 
   @Test
-  public void testSkipInsertsFalseIfInitArgsTrueButFalseStringInRequest() {
+  public void testSkipInsertsFalseIfInitArgsTrueButFalseStringInRequest() throws IOException {
     SkipExistingDocumentsProcessorFactory factory = new SkipExistingDocumentsProcessorFactory();
     NamedList<Object> initArgs = new NamedList<>();
     initArgs.add("skipInsertIfExists", true);
@@ -173,10 +187,12 @@ public class SkipExistingDocumentsProcessorFactoryTest {
     SkipExistingDocumentsUpdateProcessor processor = factory.getInstance(req, new SolrQueryResponse(), next);
     assertFalse("Expected skipInsertIfExists to be false", processor.isSkipInsertIfExists());
     assertTrue("Expected skipUpdateIfMissing to be true", processor.isSkipUpdateIfMissing());
+    next.close();
+    processor.close();
   }
 
   @Test
-  public void testSkipUpdatesFalseIfInitArgsTrueButFalseBooleanInRequest() {
+  public void testSkipUpdatesFalseIfInitArgsTrueButFalseBooleanInRequest() throws IOException {
     SkipExistingDocumentsProcessorFactory factory = new SkipExistingDocumentsProcessorFactory();
     NamedList<Object> initArgs = new NamedList<>();
     initArgs.add("skipUpdateIfMissing", true);
@@ -189,10 +205,12 @@ public class SkipExistingDocumentsProcessorFactoryTest {
     SkipExistingDocumentsUpdateProcessor processor = factory.getInstance(req, new SolrQueryResponse(), next);
     assertTrue("Expected skipInsertIfExists to be true", processor.isSkipInsertIfExists());
     assertFalse("Expected skipUpdateIfMissing to be false", processor.isSkipUpdateIfMissing());
+    next.close();
+    processor.close();
   }
 
   @Test
-  public void testSkipUpdatesTrueIfInitArgsFalseButTrueStringInRequest() {
+  public void testSkipUpdatesTrueIfInitArgsFalseButTrueStringInRequest() throws IOException {
     SkipExistingDocumentsProcessorFactory factory = new SkipExistingDocumentsProcessorFactory();
     NamedList<Object> initArgs = new NamedList<>();
     initArgs.add("skipInsertIfExists", true);
@@ -206,6 +224,8 @@ public class SkipExistingDocumentsProcessorFactoryTest {
     SkipExistingDocumentsUpdateProcessor processor = factory.getInstance(req, new SolrQueryResponse(), next);
     assertTrue("Expected skipInsertIfExists to be true", processor.isSkipInsertIfExists());
     assertTrue("Expected skipUpdateIfMissing to be true", processor.isSkipUpdateIfMissing());
+    next.close();
+    processor.close();
   }
 
 
@@ -214,8 +234,9 @@ public class SkipExistingDocumentsProcessorFactoryTest {
   @Test
   public void testSkippableInsertIsNotSkippedIfNotLeader() throws IOException {
     UpdateRequestProcessor next = Mockito.mock(DistributedUpdateProcessor.class);
+    SkipExistingDocumentsUpdateProcessor proc = new SkipExistingDocumentsUpdateProcessor(defaultRequest, next, true, true);
     SkipExistingDocumentsUpdateProcessor processor
-            = Mockito.spy(new SkipExistingDocumentsUpdateProcessor(defaultRequest, next, true, true));
+            = Mockito.spy(proc);
 
     AddUpdateCommand cmd = createInsertUpdateCmd(defaultRequest);
     doReturn(false).when(processor).isLeader(cmd);
@@ -223,13 +244,16 @@ public class SkipExistingDocumentsProcessorFactoryTest {
 
     processor.processAdd(cmd);
     verify(next).processAdd(cmd);
+    processor.close();
+    proc.close();
   }
 
   @Test
   public void testSkippableInsertIsNotSkippedIfSkipInsertsFalse() throws IOException {
     UpdateRequestProcessor next = Mockito.mock(DistributedUpdateProcessor.class);
+    SkipExistingDocumentsUpdateProcessor proc2 = new SkipExistingDocumentsUpdateProcessor(defaultRequest, next, false, false);
     SkipExistingDocumentsUpdateProcessor processor
-            = Mockito.spy(new SkipExistingDocumentsUpdateProcessor(defaultRequest, next, false, false));
+            = Mockito.spy(proc2);
 
     AddUpdateCommand cmd = createInsertUpdateCmd(defaultRequest);
     doReturn(true).when(processor).isLeader(cmd);
@@ -237,13 +261,16 @@ public class SkipExistingDocumentsProcessorFactoryTest {
 
     processor.processAdd(cmd);
     verify(next).processAdd(cmd);
+    processor.close();
+    proc2.close();
   }
 
   @Test
   public void testSkippableInsertIsSkippedIfSkipInsertsTrue() throws IOException {
     UpdateRequestProcessor next = Mockito.mock(DistributedUpdateProcessor.class);
+    SkipExistingDocumentsUpdateProcessor proc = new SkipExistingDocumentsUpdateProcessor(defaultRequest, next, true, false);
     SkipExistingDocumentsUpdateProcessor processor
-            = Mockito.spy(new SkipExistingDocumentsUpdateProcessor(defaultRequest, next, true, false));
+            = Mockito.spy(proc);
 
     AddUpdateCommand cmd = createInsertUpdateCmd(defaultRequest);
     doReturn(true).when(processor).isLeader(cmd);
@@ -251,13 +278,16 @@ public class SkipExistingDocumentsProcessorFactoryTest {
 
     processor.processAdd(cmd);
     verify(next, never()).processAdd(cmd);
+    processor.close();
+    proc.close();
   }
 
   @Test
   public void testNonSkippableInsertIsNotSkippedIfSkipInsertsTrue() throws IOException {
     UpdateRequestProcessor next = Mockito.mock(DistributedUpdateProcessor.class);
+    SkipExistingDocumentsUpdateProcessor proc = new SkipExistingDocumentsUpdateProcessor(defaultRequest, next, true, false);
     SkipExistingDocumentsUpdateProcessor processor
-            = Mockito.spy(new SkipExistingDocumentsUpdateProcessor(defaultRequest, next, true, false));
+            = Mockito.spy(proc);
 
     AddUpdateCommand cmd = createInsertUpdateCmd(defaultRequest);
     doReturn(true).when(processor).isLeader(cmd);
@@ -265,13 +295,16 @@ public class SkipExistingDocumentsProcessorFactoryTest {
 
     processor.processAdd(cmd);
     verify(next).processAdd(cmd);
+    processor.close();
+    proc.close();
   }
 
   @Test
   public void testSkippableUpdateIsNotSkippedIfNotLeader() throws IOException {
     UpdateRequestProcessor next = Mockito.mock(DistributedUpdateProcessor.class);
+    SkipExistingDocumentsUpdateProcessor proc = new SkipExistingDocumentsUpdateProcessor(defaultRequest, next, true, true);
     SkipExistingDocumentsUpdateProcessor processor
-            = Mockito.spy(new SkipExistingDocumentsUpdateProcessor(defaultRequest, next, true, true));
+            = Mockito.spy(proc);
 
     AddUpdateCommand cmd = createAtomicUpdateCmd(defaultRequest);
     doReturn(false).when(processor).isLeader(cmd);
@@ -279,13 +312,16 @@ public class SkipExistingDocumentsProcessorFactoryTest {
 
     processor.processAdd(cmd);
     verify(next).processAdd(cmd);
+    processor.close();
+    proc.close();
   }
 
   @Test
   public void testSkippableUpdateIsNotSkippedIfSkipUpdatesFalse() throws IOException {
     UpdateRequestProcessor next = Mockito.mock(DistributedUpdateProcessor.class);
+    SkipExistingDocumentsUpdateProcessor proc = new SkipExistingDocumentsUpdateProcessor(defaultRequest, next, false, false);
     SkipExistingDocumentsUpdateProcessor processor
-            = Mockito.spy(new SkipExistingDocumentsUpdateProcessor(defaultRequest, next, false, false));
+            = Mockito.spy(proc);
 
     AddUpdateCommand cmd = createAtomicUpdateCmd(defaultRequest);
     doReturn(true).when(processor).isLeader(cmd);
@@ -293,13 +329,16 @@ public class SkipExistingDocumentsProcessorFactoryTest {
 
     processor.processAdd(cmd);
     verify(next).processAdd(cmd);
+    processor.close();
+    proc.close();
   }
 
   @Test
   public void testSkippableUpdateIsSkippedIfSkipUpdatesTrue() throws IOException {
     UpdateRequestProcessor next = Mockito.mock(DistributedUpdateProcessor.class);
+    SkipExistingDocumentsUpdateProcessor proc = new SkipExistingDocumentsUpdateProcessor(defaultRequest, next, false, true);
     SkipExistingDocumentsUpdateProcessor processor
-            = Mockito.spy(new SkipExistingDocumentsUpdateProcessor(defaultRequest, next, false, true));
+            = Mockito.spy(proc);
 
     AddUpdateCommand cmd = createAtomicUpdateCmd(defaultRequest);
     doReturn(true).when(processor).isLeader(cmd);
@@ -307,13 +346,16 @@ public class SkipExistingDocumentsProcessorFactoryTest {
 
     processor.processAdd(cmd);
     verify(next, never()).processAdd(cmd);
+    processor.close();
+    proc.close();
   }
 
   @Test
   public void testNonSkippableUpdateIsNotSkippedIfSkipUpdatesTrue() throws IOException {
     UpdateRequestProcessor next = Mockito.mock(DistributedUpdateProcessor.class);
+    SkipExistingDocumentsUpdateProcessor proc = new SkipExistingDocumentsUpdateProcessor(defaultRequest, next, false, true);
     SkipExistingDocumentsUpdateProcessor processor
-            = Mockito.spy(new SkipExistingDocumentsUpdateProcessor(defaultRequest, next, false, true));
+            = Mockito.spy(proc);
 
     AddUpdateCommand cmd = createAtomicUpdateCmd(defaultRequest);
     doReturn(true).when(processor).isLeader(cmd);
@@ -321,6 +363,8 @@ public class SkipExistingDocumentsProcessorFactoryTest {
 
     processor.processAdd(cmd);
     verify(next).processAdd(cmd);
+    processor.close();
+    proc.close();
   }
 
   private AddUpdateCommand createInsertUpdateCmd(SolrQueryRequest req) {
diff --git a/solr/core/src/test/org/apache/solr/update/processor/TemplateUpdateProcessorTest.java b/solr/core/src/test/org/apache/solr/update/processor/TemplateUpdateProcessorTest.java
index 4dcdbde..42177c1 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/TemplateUpdateProcessorTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/TemplateUpdateProcessorTest.java
@@ -72,8 +72,9 @@ public class TemplateUpdateProcessorTest extends SolrCloudTestCase {
     cmd.solrDoc = new SolrInputDocument();
     cmd.solrDoc.addField("firstName", "Tom");
     cmd.solrDoc.addField("lastName", "Cruise");
-
-    new TemplateUpdateProcessorFactory().getInstance(cmd.getReq(), new SolrQueryResponse(), null).processAdd(cmd);
+    UpdateRequestProcessor proc = new TemplateUpdateProcessorFactory().getInstance(cmd.getReq(), new SolrQueryResponse(), null);
+    proc.processAdd(cmd);
+    proc.close();
     assertEquals("Tom_Cruise", cmd.solrDoc.getFieldValue("id"));
     assertEquals("Cruise_Tom", cmd.solrDoc.getFieldValue("another"));
     assertEquals("Cruise_", cmd.solrDoc.getFieldValue("missing"));
@@ -95,7 +96,7 @@ public class TemplateUpdateProcessorTest extends SolrCloudTestCase {
     QueryResponse rsp = cluster.getSolrClient().query("c",
         new ModifiableSolrParams().add("q","id:1"));
     assertEquals( "key_1", rsp.getResults().get(0).getFieldValue("x_s"));
-
+    proc.close();
 
   }
 }
diff --git a/solr/core/src/test/org/apache/solr/update/processor/URLClassifyProcessorTest.java b/solr/core/src/test/org/apache/solr/update/processor/URLClassifyProcessorTest.java
index 1b36bc6..34c8adb 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/URLClassifyProcessorTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/URLClassifyProcessorTest.java
@@ -23,6 +23,7 @@ import java.net.URISyntaxException;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.update.AddUpdateCommand;
+import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -35,6 +36,12 @@ public class URLClassifyProcessorTest extends SolrTestCaseJ4 {
     classifyProcessor =
       (URLClassifyProcessor) new URLClassifyProcessorFactory().getInstance(null, null, null);
   }
+
+  @AfterClass
+  public static void afterURLClassifyProcessorTest() throws IOException {
+    classifyProcessor.close();
+    classifyProcessor = null;
+  }
   
   @Test
   public void testProcessor() throws IOException {
diff --git a/solr/core/src/test/org/apache/solr/update/processor/UUIDUpdateProcessorFallbackTest.java b/solr/core/src/test/org/apache/solr/update/processor/UUIDUpdateProcessorFallbackTest.java
index e57e0ef..2b13d79 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/UUIDUpdateProcessorFallbackTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/UUIDUpdateProcessorFallbackTest.java
@@ -130,7 +130,9 @@ public class UUIDUpdateProcessorFallbackTest extends SolrTestCaseJ4 {
     cmd.solrDoc = new SolrInputDocument();
     cmd.solrDoc.addField("random_s", "random_val");
 
-    processorFactory.getInstance(req, rsp, null).processAdd(cmd);
+    UpdateRequestProcessor proc = processorFactory.getInstance(req, rsp, null);
+    proc.processAdd(cmd);
+    proc.close();
     assertNotNull(cmd.solrDoc);
     assertNotNull(cmd.solrDoc.get("id"));
     assertNotNull(cmd.solrDoc.get("id").getValue());
@@ -198,7 +200,7 @@ public class UUIDUpdateProcessorFallbackTest extends SolrTestCaseJ4 {
 
       UpdateRequestProcessor processor = pc.createProcessor(req, rsp);
       processor.processAdd(cmd);
-
+      processor.close();
       return cmd.solrDoc;
     } finally {
       SolrRequestInfo.clearRequestInfo();
diff --git a/solr/core/src/test/org/apache/solr/update/processor/UpdateRequestProcessorFactoryTest.java b/solr/core/src/test/org/apache/solr/update/processor/UpdateRequestProcessorFactoryTest.java
index 9f42115..5e5f82d 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/UpdateRequestProcessorFactoryTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/UpdateRequestProcessorFactoryTest.java
@@ -146,7 +146,7 @@ public class UpdateRequestProcessorFactoryTest extends SolrTestCaseJ4 {
                  ( // compare them both just because i'm going insane and the more checks the better
                    proc.next instanceof LogUpdateProcessorFactory.LogUpdateProcessor
                    && procs.get(1) instanceof LogUpdateProcessorFactory.LogUpdateProcessor));
-
+      proc.close();
       // fetch the distributed version of this chain
       proc = chain.createProcessor(req(DISTRIB_UPDATE_PARAM, "NONE"), // just some non-blank value
                                    new SolrQueryResponse());
@@ -179,6 +179,7 @@ public class UpdateRequestProcessorFactoryTest extends SolrTestCaseJ4 {
       }
       assertEquals(name + " (distrib) chain has wrong length: " + procs.toString(),
           expectedProcLen, procs.size());
+      proc.close();
     }
 
   }
diff --git a/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java b/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java
index 6b7286e..b63615e 100644
--- a/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java
@@ -402,7 +402,7 @@ public class SolrTestCase extends LuceneTestCase {
         assertNull(orr, orr);
       }
     } finally {
-      ObjectReleaseTracker.OBJECTS.clear();
+      ObjectReleaseTracker.clear();
       TestInjection.reset();
     }
     try {
diff --git a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
index 24229b0..52e8187 100644
--- a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
@@ -1067,6 +1067,7 @@ public abstract class SolrTestCaseJ4 extends SolrTestCase {
     req.setContentStreams(streams);
     handler.handleRequestBody(req, new SolrQueryResponse());
     req.close();
+    handler.close();
   }
 
   /**
diff --git a/solr/test-framework/src/java/org/apache/solr/update/processor/BufferingRequestProcessor.java b/solr/test-framework/src/java/org/apache/solr/update/processor/BufferingRequestProcessor.java
index 56b4229..9726d1d 100644
--- a/solr/test-framework/src/java/org/apache/solr/update/processor/BufferingRequestProcessor.java
+++ b/solr/test-framework/src/java/org/apache/solr/update/processor/BufferingRequestProcessor.java
@@ -61,4 +61,9 @@ public class BufferingRequestProcessor extends UpdateRequestProcessor
   public void finish() throws IOException {
     // nothing?    
   }
+
+  @Override
+  public void doClose() {
+    super.doClose();
+  }
 }
diff --git a/solr/test-framework/src/java/org/apache/solr/update/processor/UpdateProcessorTestBase.java b/solr/test-framework/src/java/org/apache/solr/update/processor/UpdateProcessorTestBase.java
index d3aa979..827c07f 100644
--- a/solr/test-framework/src/java/org/apache/solr/update/processor/UpdateProcessorTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/update/processor/UpdateProcessorTestBase.java
@@ -70,9 +70,15 @@ public class UpdateProcessorTestBase extends SolrTestCaseJ4 {
       cmd.solrDoc = docIn;
 
       UpdateRequestProcessor processor = pc.createProcessor(req, rsp);
-      if (null != processor) {
-        // test chain might be empty or short circuited.
-        processor.processAdd(cmd);
+      try {
+        if (null != processor) {
+          // test chain might be empty or short circuited.
+          processor.processAdd(cmd);
+        }
+      } finally {
+        if (null != processor) {
+          processor.close();
+        }
       }
 
       return cmd.solrDoc;
@@ -97,6 +103,7 @@ public class UpdateProcessorTestBase extends SolrTestCaseJ4 {
       processor.processCommit(cmd);
     } finally {
       req.close();
+      processor.close();
     }
   }
 
@@ -116,6 +123,7 @@ public class UpdateProcessorTestBase extends SolrTestCaseJ4 {
       processor.processDelete(cmd);
     } finally {
       req.close();
+      processor.close();
     }
   }
 
diff --git a/solr/test-framework/src/resources/logconf/log4j2-std-debug.xml b/solr/test-framework/src/resources/logconf/log4j2-std-debug.xml
index 02e4aef..a6ac632 100644
--- a/solr/test-framework/src/resources/logconf/log4j2-std-debug.xml
+++ b/solr/test-framework/src/resources/logconf/log4j2-std-debug.xml
@@ -47,8 +47,11 @@
         <AsyncLogger name="org.apache.solr.client.solrj.impl.LBSolrClient" level="INFO"/>
         <AsyncLogger name="org.apache.solr.cloud.ZkController" level="INFO"/>
         <AsyncLogger name="org.apache.solr.common.cloud.ZkMaintenanceUtils" level="INFO"/>
-        <AsyncLogger name="org.apache.solr.update.processor.DistributedZkUpdateProcessor" level="WARN"/>
+        <AsyncLogger name="org.apache.solr.update.processor.DistributedZkUpdateProcessor" level="INFO"/>
+        <AsyncLogger name="org.apache.solr.update.SolrCmdDistributor" level="DEBUG"/>
+
         <AsyncLogger name="com.google.inject.servlet" level="DEBUG"/>
+        <AsyncLogger name="org.apache.solr.client.solrj.impl.Http2SolrClient" level="DEBUG"/>
 
         <AsyncRoot level="INFO">
             <AppenderRef ref="STDERR_COLOR"/>