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 2021/02/10 01:43:49 UTC

[lucene-solr] 05/09: @1332 Continue work on cleaning up.

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 aa823dad8db11aef72214277d66515126dd14c86
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Thu Feb 4 12:56:48 2021 -0600

    @1332 Continue work on cleaning up.
    
    # Conflicts:
    #	solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java
    #	versions.lock
---
 .../apache/solr/handler/loader/JavabinLoader.java  |  70 ++++++++------
 .../org/apache/solr/handler/loader/JsonLoader.java |  11 ++-
 .../org/apache/solr/request/SolrRequestInfo.java   |   3 +
 .../solr/schema/SpatialPointVectorFieldType.java   |   6 +-
 .../solr/security/PKIAuthenticationPlugin.java     |  82 +++++++++++------
 .../org/apache/solr/update/AddUpdateCommand.java   |   3 +-
 .../org/apache/solr/update/SolrCmdDistributor.java |  24 ++---
 .../src/java/org/apache/solr/update/UpdateLog.java |  56 +++++------
 .../processor/DistributedUpdateProcessor.java      |  70 +++++++++-----
 .../processor/DistributedZkUpdateProcessor.java    |  14 ++-
 .../apache/solr/cloud/DocValuesNotIndexedTest.java |   2 -
 .../solr/security/TestPKIAuthenticationPlugin.java |   5 -
 .../solr/client/solrj/impl/Http2SolrClient.java    |  25 +++--
 .../solrj/request/JavaBinUpdateRequestCodec.java   |   5 +-
 .../org/apache/solr/common/SolrInputDocument.java  |  16 ++++
 versions.lock                                      | 102 +++++++++++----------
 versions.props                                     |   2 +-
 17 files changed, 293 insertions(+), 203 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/handler/loader/JavabinLoader.java b/solr/core/src/java/org/apache/solr/handler/loader/JavabinLoader.java
index 762e2b7..1d6be82 100644
--- a/solr/core/src/java/org/apache/solr/handler/loader/JavabinLoader.java
+++ b/solr/core/src/java/org/apache/solr/handler/loader/JavabinLoader.java
@@ -82,36 +82,7 @@ public class JavabinLoader extends ContentStreamLoader {
       return;
     }
     UpdateRequest update = null;
-    JavaBinUpdateRequestCodec.StreamingUpdateHandler handler = new JavaBinUpdateRequestCodec.StreamingUpdateHandler() {
-
-      @Override
-      public void update(SolrInputDocument document, UpdateRequest updateRequest, Integer commitWithin, Boolean overwrite) {
-        if (document == null) {
-          return;
-        }
-    
-         AddUpdateCommand addCmd = getAddCommand(req, updateRequest.getParams());
-        
-        addCmd.solrDoc = document;
-        if (commitWithin != null) {
-          addCmd.commitWithin = commitWithin;
-        }
-        if (overwrite != null) {
-          addCmd.overwrite = overwrite;
-        }
-
-        if (updateRequest.isLastDocInBatch()) {
-          // this is a hint to downstream code that indicates we've sent the last doc in a batch
-          addCmd.isLastDocInBatch = true;
-        }
-
-        try {
-          processor.processAdd(addCmd);
-        } catch (ZooKeeperException | IOException e) {
-          throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "ERROR adding document " + addCmd.getPrintableId(), e);
-        }
-      }
-    };
+    JavaBinUpdateRequestCodec.StreamingUpdateHandler handler = new MyStreamingUpdateHandler(req, processor);
     FastInputStream in = FastInputStream.wrap(stream);
     for (; ; ) {;
       if (in.peek() == -1) return;
@@ -210,4 +181,43 @@ public class JavabinLoader extends ContentStreamLoader {
       }
     }
   }
+
+  private class MyStreamingUpdateHandler implements JavaBinUpdateRequestCodec.StreamingUpdateHandler {
+
+    private final SolrQueryRequest req;
+    private final UpdateRequestProcessor processor;
+
+    public MyStreamingUpdateHandler(SolrQueryRequest req, UpdateRequestProcessor processor) {
+      this.req = req;
+      this.processor = processor;
+    }
+
+    @Override
+    public void update(SolrInputDocument document, UpdateRequest updateRequest, Integer commitWithin, Boolean overwrite) {
+      if (document == null) {
+        return;
+      }
+
+      AddUpdateCommand addCmd = getAddCommand(req, updateRequest.getParams());
+
+      addCmd.solrDoc = document;
+      if (commitWithin != null) {
+        addCmd.commitWithin = commitWithin;
+      }
+      if (overwrite != null) {
+        addCmd.overwrite = overwrite;
+      }
+
+      if (updateRequest.isLastDocInBatch()) {
+        // this is a hint to downstream code that indicates we've sent the last doc in a batch
+        addCmd.isLastDocInBatch = true;
+      }
+
+      try {
+        processor.processAdd(addCmd);
+      } catch (ZooKeeperException | IOException e) {
+        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "ERROR adding document " + addCmd.getPrintableId(), e);
+      }
+    }
+  }
 }
diff --git a/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java b/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java
index 056eb39..0f63fc4 100644
--- a/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java
+++ b/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java
@@ -233,7 +233,9 @@ public class JsonLoader extends ContentStreamLoader {
             changeChildDoc(copy);
             docs.add(copy);
           } else {
-            AddUpdateCommand cmd = new AddUpdateCommand(req);
+            AddUpdateCommand cmd = AddUpdateCommand.THREAD_LOCAL_AddUpdateCommand.get();
+            cmd.clear();
+            cmd.setReq(req);
             cmd.commitWithin = commitWithin;
             cmd.overwrite = overwrite;
             cmd.solrDoc = buildDoc(copy);
@@ -459,9 +461,6 @@ public class JsonLoader extends ContentStreamLoader {
         if (ev == JSONParser.STRING) {
           if (parser.wasKey()) {
             String key = parser.getString();
-
-
-
             if ("doc".equals(key)) {
               if (cmd.solrDoc != null) {
                 throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Multiple documents in same"
@@ -505,7 +504,9 @@ public class JsonLoader extends ContentStreamLoader {
 
     void handleAdds() throws IOException {
       while (true) {
-        AddUpdateCommand cmd = new AddUpdateCommand(req);
+        AddUpdateCommand cmd = AddUpdateCommand.THREAD_LOCAL_AddUpdateCommand.get();
+        cmd.clear();
+        cmd.setReq(req);
         cmd.commitWithin = commitWithin;
         cmd.overwrite = overwrite;
 
diff --git a/solr/core/src/java/org/apache/solr/request/SolrRequestInfo.java b/solr/core/src/java/org/apache/solr/request/SolrRequestInfo.java
index bfa352b..d4dd732 100644
--- a/solr/core/src/java/org/apache/solr/request/SolrRequestInfo.java
+++ b/solr/core/src/java/org/apache/solr/request/SolrRequestInfo.java
@@ -27,6 +27,7 @@ import java.util.TimeZone;
 import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.solr.common.SolrException;
+import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.util.ExecutorUtil;
 import org.apache.solr.handler.component.ResponseBuilder;
@@ -84,6 +85,8 @@ public class SolrRequestInfo {
       threadLocal.remove();
       AddUpdateCommand.THREAD_LOCAL_AddUpdateCommand.get().clearAll();
       AddUpdateCommand.THREAD_LOCAL_AddUpdateCommand_TLOG.get().clearAll();
+      SolrInputDocument.THREAD_LOCAL_MaskCharSolrInputDocument.get().clear();
+      SolrInputDocument.THREAD_LOCAL_SolrInputDocument.get().clear();
     }
   }
 
diff --git a/solr/core/src/java/org/apache/solr/schema/SpatialPointVectorFieldType.java b/solr/core/src/java/org/apache/solr/schema/SpatialPointVectorFieldType.java
index 7d15b57..9e99b2c 100644
--- a/solr/core/src/java/org/apache/solr/schema/SpatialPointVectorFieldType.java
+++ b/solr/core/src/java/org/apache/solr/schema/SpatialPointVectorFieldType.java
@@ -68,15 +68,13 @@ public class SpatialPointVectorFieldType extends AbstractSpatialFieldType<PointV
     //
     // In theory we should fix this, but since this class is already deprecated, we'll leave it alone
     // to simplify the risk of back-compat break for existing users.
-
-
     final int p = (INDEXED | TOKENIZED | OMIT_NORMS | OMIT_TF_POSITIONS | UNINVERTIBLE);
     Map<String,SchemaField> newFields = new HashMap<>(schema.getFields());
     for( SchemaField sf : schema.getFields().values() ) {
       if( sf.getType() == this ) {
         String name = sf.getName();
-        newFields.put(name, new SchemaField(name + PointVectorStrategy.SUFFIX_X, fieldType, p, null));
-        newFields.put(name, new SchemaField(name + PointVectorStrategy.SUFFIX_Y, fieldType, p, null));
+        newFields.put(name + PointVectorStrategy.SUFFIX_X, new SchemaField(name + PointVectorStrategy.SUFFIX_X, fieldType, p, null));
+        newFields.put(name + PointVectorStrategy.SUFFIX_Y, new SchemaField(name + PointVectorStrategy.SUFFIX_Y, fieldType, p, null));
       }
     }
     schema.setFields(newFields);
diff --git a/solr/core/src/java/org/apache/solr/security/PKIAuthenticationPlugin.java b/solr/core/src/java/org/apache/solr/security/PKIAuthenticationPlugin.java
index 52ee563..7cdbeb2 100644
--- a/solr/core/src/java/org/apache/solr/security/PKIAuthenticationPlugin.java
+++ b/solr/core/src/java/org/apache/solr/security/PKIAuthenticationPlugin.java
@@ -38,7 +38,6 @@ import org.apache.http.HttpResponse;
 import org.apache.http.auth.BasicUserPrincipal;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.protocol.HttpContext;
-import org.apache.http.util.EntityUtils;
 import org.apache.solr.client.solrj.impl.Http2SolrClient;
 import org.apache.solr.client.solrj.impl.HttpClientUtil;
 import org.apache.solr.client.solrj.impl.HttpListenerFactory;
@@ -220,27 +219,7 @@ public class PKIAuthenticationPlugin extends AuthenticationPlugin implements Htt
 
   @Override
   public void setup(Http2SolrClient client) {
-    final HttpListenerFactory.RequestResponseListener listener = new HttpListenerFactory.RequestResponseListener() {
-      @Override
-      public void onQueued(Request request) {
-        log.trace("onQueued: {}", request);
-        if (cores.getAuthenticationPlugin() == null) {
-          log.trace("no authentication plugin, skipping");
-          return;
-        }
-        if (!cores.getAuthenticationPlugin().interceptInternodeRequest(request)) {
-          if (log.isDebugEnabled()) {
-            log.debug("{} secures this internode request", this.getClass().getSimpleName());
-          }
-          generateToken().ifPresent(s -> request.header(HEADER, myNodeName + " " + s));
-        } else {
-          if (log.isDebugEnabled()) {
-            log.debug("{} secures this internode request", cores.getAuthenticationPlugin().getClass().getSimpleName());
-          }
-        }
-      }
-    };
-    client.addListenerFactory(() -> listener);
+    client.addListenerFactory(new MyHttpListenerFactory(publicKeyHandler, cores, myNodeName));
   }
 
   @Override
@@ -254,6 +233,24 @@ public class PKIAuthenticationPlugin extends AuthenticationPlugin implements Htt
     return req.getUserPrincipal() != SU;
   }
 
+  private static class MyHttpListenerFactory implements HttpListenerFactory {
+
+    private final PublicKeyHandler publicKeyHandler;
+    private final CoreContainer cores;
+    private final String nodeName;
+
+    MyHttpListenerFactory(PublicKeyHandler publicKeyHandler, CoreContainer cores, String nodeName) { 
+      this.publicKeyHandler = publicKeyHandler;
+      this.cores = cores;
+      this.nodeName = nodeName;
+    }
+
+    @Override
+    public RequestResponseListener get() {
+      return new MyRequestResponseListener(publicKeyHandler, cores, nodeName);
+    }
+  }
+
   private class HttpHeaderClientInterceptor implements HttpRequestInterceptor {
 
     public HttpHeaderClientInterceptor() {
@@ -278,7 +275,7 @@ public class PKIAuthenticationPlugin extends AuthenticationPlugin implements Htt
   }
 
   @SuppressForbidden(reason = "Needs currentTimeMillis to set current time in header")
-  private Optional<String> generateToken() {
+  private static Optional<String> generateToken(PublicKeyHandler publicKeyHandler) {
     SolrRequestInfo reqInfo = getRequestInfo();
     String usr;
     if (reqInfo != null) {
@@ -292,7 +289,7 @@ public class PKIAuthenticationPlugin extends AuthenticationPlugin implements Htt
         usr = principal.getName();
       }
     } else {
-      if (!isSolrThread()) {
+      if (!ExecutorUtil.isSolrServerThread()) {
         //if this is not running inside a Solr threadpool (as in testcases)
         // then no need to add any header
         log.debug("generateToken: not a solr (server) thread");
@@ -312,14 +309,15 @@ public class PKIAuthenticationPlugin extends AuthenticationPlugin implements Htt
   }
 
   void setHeader(HttpRequest httpRequest) {
-    generateToken().ifPresent(s -> httpRequest.setHeader(HEADER, myNodeName + " " + s));
+    generateToken(publicKeyHandler).ifPresent(s -> httpRequest.setHeader(HEADER, myNodeName + " " + s));
   }
 
   boolean isSolrThread() {
     return ExecutorUtil.isSolrServerThread();
   }
 
-  SolrRequestInfo getRequestInfo() {
+
+  static SolrRequestInfo getRequestInfo() {
     return SolrRequestInfo.getRequestInfo();
   }
 
@@ -337,4 +335,36 @@ public class PKIAuthenticationPlugin extends AuthenticationPlugin implements Htt
   public static final String NODE_IS_USER = "$";
   // special principal to denote the cluster member
   private static final Principal SU = new BasicUserPrincipal("$");
+
+  private static class MyRequestResponseListener extends HttpListenerFactory.RequestResponseListener {
+
+    private final PublicKeyHandler publicKeyHandler;
+    private final CoreContainer cores;
+    private final String myNodeName;
+
+    MyRequestResponseListener(PublicKeyHandler publicKeyHandler, CoreContainer cores, String myNodeName) {
+      this.publicKeyHandler = publicKeyHandler;
+      this.cores = cores;
+      this.myNodeName = myNodeName;
+    }
+    
+    @Override
+    public void onQueued(Request request) {
+      log.trace("onQueued: {}", request);
+      if (cores.getAuthenticationPlugin() == null) {
+        log.trace("no authentication plugin, skipping");
+        return;
+      }
+      if (!cores.getAuthenticationPlugin().interceptInternodeRequest(request)) {
+        if (log.isDebugEnabled()) {
+          log.debug("{} secures this internode request", this.getClass().getSimpleName());
+        }
+        generateToken(publicKeyHandler).ifPresent(s -> request.header(HEADER, myNodeName + " " + s));
+      } else {
+        if (log.isDebugEnabled()) {
+          log.debug("{} secures this internode request", cores.getAuthenticationPlugin().getClass().getSimpleName());
+        }
+      }
+    }
+  }
 }
diff --git a/solr/core/src/java/org/apache/solr/update/AddUpdateCommand.java b/solr/core/src/java/org/apache/solr/update/AddUpdateCommand.java
index 70623f2..7e2d8c7 100644
--- a/solr/core/src/java/org/apache/solr/update/AddUpdateCommand.java
+++ b/solr/core/src/java/org/apache/solr/update/AddUpdateCommand.java
@@ -44,12 +44,13 @@ public class AddUpdateCommand extends UpdateCommand {
     }
   };
 
-
   public final static ThreadLocal<AddUpdateCommand> THREAD_LOCAL_AddUpdateCommand_TLOG = new ThreadLocal<>(){
     protected AddUpdateCommand initialValue() {
       return new AddUpdateCommand(null);
     }
   };
+
+
   /**
    * Higher level SolrInputDocument, normally used to construct the Lucene Document(s)
    * to index.
diff --git a/solr/core/src/java/org/apache/solr/update/SolrCmdDistributor.java b/solr/core/src/java/org/apache/solr/update/SolrCmdDistributor.java
index 207b4cc..b779bdaf8 100644
--- a/solr/core/src/java/org/apache/solr/update/SolrCmdDistributor.java
+++ b/solr/core/src/java/org/apache/solr/update/SolrCmdDistributor.java
@@ -23,7 +23,6 @@ import java.lang.invoke.MethodHandles;
 import java.nio.channels.ClosedChannelException;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.solr.client.solrj.SolrServerException;
@@ -32,7 +31,6 @@ import org.apache.solr.client.solrj.impl.Http2SolrClient;
 import org.apache.solr.client.solrj.request.AbstractUpdateRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.client.solrj.util.AsyncListener;
-import org.apache.solr.client.solrj.util.Cancellable;
 import org.apache.solr.common.AlreadyClosedException;
 import org.apache.solr.common.ParWork;
 import org.apache.solr.common.SolrException;
@@ -67,7 +65,7 @@ public class SolrCmdDistributor implements Closeable {
   
   private final Http2SolrClient solrClient;
   private volatile boolean closed;
-  private final Set<Cancellable> cancels = ConcurrentHashMap.newKeySet(32);
+
   private volatile Throwable cancelExeption;
 
   public SolrCmdDistributor(ZkStateReader zkStateReader, UpdateShardHandler updateShardHandler) {
@@ -87,16 +85,16 @@ public class SolrCmdDistributor implements Closeable {
   public void finish() {
     assert !finished : "lifecycle sanity check";
 
-    if (cancelExeption != null) {
-      Throwable exp = cancelExeption;
-      cancelExeption = null;
-      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, exp);
-    }
+//    if (cancelExeption != null) {
+//      Throwable exp = cancelExeption;
+//      cancelExeption = null;
+//      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, exp);
+//    }
 
     if (isClosed == null || isClosed != null && !isClosed.isClosed()) {
       solrClient.waitForOutstandingRequests();
     } else {
-      cancels.forEach(cancellable -> cancellable.cancel());
+      //cancels.forEach(cancellable -> cancellable.cancel());
       Error error = new Error();
       error.t = new AlreadyClosedException();
       AlreadyClosedUpdateCmd cmd = new AlreadyClosedUpdateCmd(null);
@@ -277,18 +275,16 @@ public class SolrCmdDistributor implements Closeable {
 
       client = solrClient;
 
-      int cancelIndex = cancels.size() - 1;
-      cancels.add(client.asyncRequest(req.uReq, null, new AsyncListener<>() {
+
+      client.asyncRequest(req.uReq, null, new AsyncListener<>() {
         @Override
         public void onSuccess(NamedList result) {
           if (log.isTraceEnabled()) log.trace("Success for distrib update {}", result);
-          cancels.remove(cancelIndex);
         }
 
         @Override
         public void onFailure(Throwable t, int code) {
           log.error("Exception sending dist update {} {}", code, t);
-          cancels.remove(cancelIndex);
 
           // nocommit - we want to prevent any more from this request
           // to go just to this node rather than stop the whole request
@@ -321,7 +317,7 @@ public class SolrCmdDistributor implements Closeable {
             allErrors.put(req.cmd, error);
           }
         }
-      }));
+      });
     } catch (Exception e) {
       log.error("Exception sending dist update", e);
       Error error = new Error();
diff --git a/solr/core/src/java/org/apache/solr/update/UpdateLog.java b/solr/core/src/java/org/apache/solr/update/UpdateLog.java
index 4405429..af8b8f7 100644
--- a/solr/core/src/java/org/apache/solr/update/UpdateLog.java
+++ b/solr/core/src/java/org/apache/solr/update/UpdateLog.java
@@ -49,7 +49,6 @@ import java.util.concurrent.locks.ReentrantLock;
 
 import com.codahale.metrics.Gauge;
 import com.codahale.metrics.Meter;
-import org.apache.commons.lang3.concurrent.ConcurrentUtils;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.BytesRefBuilder;
@@ -64,6 +63,7 @@ import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.ObjectReleaseTracker;
 import org.apache.solr.common.util.OrderedExecutor;
+import org.apache.solr.common.util.SysStats;
 import org.apache.solr.core.PluginInfo;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.SolrInfoBean;
@@ -978,7 +978,7 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
       // any added documents will make it into this commit or not.
       // But we do know that any updates already added will definitely
       // show up in the latest reader after the commit succeeds.
-      map = new HashMap<>();
+      map = new ConcurrentHashMap<>(32);
 
       if (debug) {
         log.debug("TLOG: preSoftCommit: prevMap={} new map={}", System.identityHashCode(prevMap), System.identityHashCode(map));
@@ -1171,17 +1171,23 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
   // that have already grabbed higher version numbers.  Higher level coordination or
   // synchronization is needed for stronger guarantees (as VersionUpdateProcessor does).
   public Long lookupVersion(BytesRef indexedId) {
-    LogPtr entry;
+    LogPtr entry = null;
+
+    Map<BytesRef,LogPtr> localMap = map;
+    Map<BytesRef,LogPtr> localPrevMap = prevMap;
+    Map<BytesRef,LogPtr> localPrevMap2 = prevMap2;
 
-    entry = map.get(indexedId);
+    if (localMap != null) {
+      entry = localMap.get(indexedId);
+    }
     // SolrCore.verbose("TLOG: lookup ver: for id ",indexedId.utf8ToString(),"in map",System.identityHashCode(map),"got",entry,"lookupLog=",lookupLog);
-    if (entry == null && prevMap != null) {
-      entry = prevMap.get(indexedId);
+    if (entry == null && localPrevMap != null) {
+      entry = localPrevMap.get(indexedId);
       // something found in prevMap will always be found in prevMapLog (which could be tlog or prevTlog)
       // SolrCore.verbose("TLOG: lookup ver: for id ",indexedId.utf8ToString(),"in prevMap",System.identityHashCode(map),"got",entry,"lookupLog=",lookupLog);
     }
-    if (entry == null && prevMap2 != null) {
-      entry = prevMap2.get(indexedId);
+    if (entry == null && localPrevMap2 != null) {
+      entry = localPrevMap2.get(indexedId);
       // something found in prevMap2 will always be found in prevMapLog2 (which could be tlog or prevTlog)
       // SolrCore.verbose("TLOG: lookup ver: for id ",indexedId.utf8ToString(),"in prevMap2",System.identityHashCode(map),"got",entry,"lookupLog=",lookupLog);
     }
@@ -1269,10 +1275,11 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
       dbqLock.lock();
       try {
         deleteByQueries.clear();
+        oldDeletes.clear();
       } finally {
         dbqLock.unlock();
       }
-      oldDeletes.clear();
+
     } finally {
       versionInfo.unblockUpdates();
     }
@@ -1295,7 +1302,7 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
     recoveryInfo = new RecoveryInfo();
     tlog.incref();
 
-    ExecutorCompletionService<RecoveryInfo> cs = new ExecutorCompletionService<>(ParWork.getRootSharedExecutor());
+    ExecutorCompletionService<RecoveryInfo> cs = new ExecutorCompletionService<>(ParWork.getExecutorService(SysStats.PROC_COUNT));
     LogReplayer replayer = new LogReplayer(Collections.singletonList(tlog), false, true);
 
     versionInfo.blockUpdates();
@@ -1449,15 +1456,9 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
         }
       }
       // Prev tlog will be closed, so nullify prevMap
-      tlogLock.lock();
-      try {
         if (prevTlog == oldTlog) {
           prevMap = null;
         }
-
-      } finally {
-        tlogLock.unlock();
-      }
     } catch (IOException e) {
       log.error("Exception reading versions from log",e);
     } catch (InterruptedException e) {
@@ -1674,7 +1675,7 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
 
     private void update() {
       int numUpdates = 0;
-      updateList = new ArrayList<>(numRecordsToKeep);
+      updateList = new ArrayList<>(logList.size());
       deleteByQueryList = new ArrayList<>();
       deleteList = new ArrayList<>();
       updates = new HashMap<>(numRecordsToKeep);
@@ -1739,7 +1740,7 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
               // would be caused by a corrupt transaction log
             } catch (Exception ex) {
               log.warn("Exception reverse reading log", ex);
-             // break;
+              break;
             }
 
             numUpdates++;
@@ -1946,7 +1947,6 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
       this.inSortedOrder = inSortedOrder;
     }
 
-    private SolrQueryRequest req;
     private SolrQueryResponse rsp;
 
     @Override
@@ -1954,7 +1954,7 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
       ModifiableSolrParams params = new ModifiableSolrParams();
       params.set(DISTRIB_UPDATE_PARAM, FROMLEADER.toString());
       params.set(DistributedUpdateProcessor.LOG_REPLAY, "true");
-      req = new LocalSolrQueryRequest(uhandler.core, params);
+      SolrQueryRequest  req = new LocalSolrQueryRequest(uhandler.core, params);
       rsp = new SolrQueryResponse();
       SolrRequestInfo.setRequestInfo(new SolrRequestInfo(req, rsp));    // setting request info will help logging
 
@@ -1962,9 +1962,10 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
         for (; ; ) {
           TransactionLog translog = translogs.pollFirst();
           if (translog == null) break;
-          doReplay(translog);
+          doReplay(translog, req);
         }
       } catch (AlreadyClosedException e) {
+        log.info("Stopping LogReplayer, already closed");
         throw e;
       } catch (SolrException e) {
         if (e.code() == ErrorCode.SERVICE_UNAVAILABLE.code) {
@@ -2005,7 +2006,7 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
       SolrRequestInfo.clearRequestInfo();
     }
 
-    public void doReplay(TransactionLog translog) {
+    public void doReplay(TransactionLog translog, SolrQueryRequest req) {
       UpdateRequestProcessor proc = null;
       try {
         loglog.warn("Starting log replay {}  active={} starting pos={} inSortedOrder={}", translog, activeLog, recoveryInfo.positionOfStart, inSortedOrder);
@@ -2206,6 +2207,7 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
     }
 
     private void waitForAllUpdatesGetExecuted(OrderedExecutor executor, LongAdder pendingTasks) {
+      executor.shutdown();
       while (pendingTasks.sum() > 0) {
         executor.awaitTermination();
       }
@@ -2234,7 +2236,7 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
       return null;
     }
 
-    private Future execute(UpdateCommand ucmd, OrderedExecutor executor, LongAdder pendingTasks, UpdateRequestProcessor proc, AtomicReference<SolrException> exceptionHolder, SolrQueryRequest req,
+    private void execute(UpdateCommand ucmd, OrderedExecutor executor, LongAdder pendingTasks, UpdateRequestProcessor proc, AtomicReference<SolrException> exceptionHolder, SolrQueryRequest req,
         SolrInputDocument doc, int operation, long version, Long prevVersion) {
       assert ucmd instanceof AddUpdateCommand || ucmd instanceof DeleteUpdateCommand || ucmd == null;
 
@@ -2250,16 +2252,18 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
 
       BytesRef finalIndexedId = indexedId;
 
+      final SolrInputDocument sdoc = doc;
+
       if (executor != null) {
         // by using the same hash as DUP, independent updates can avoid waiting for same bucket
 
-        return executor.submit(hash, () -> {
+        executor.submit(hash, () -> {
           try {
             // fail fast
             if (exceptionHolder.get() != null) return;
             if (ucmd instanceof AddUpdateCommand) {
 
-              convertTlogEntryToAddUpdateCommand(req, doc, operation, prevVersion, version, (AddUpdateCommand) ucmd);
+              convertTlogEntryToAddUpdateCommand(req, sdoc, operation, prevVersion, version, (AddUpdateCommand) ucmd);
               ((AddUpdateCommand) ucmd).setIndexedId(finalIndexedId);
               ucmd.setReq(req);
               ucmd.setFlags(UpdateCommand.REPLAY | UpdateCommand.IGNORE_AUTOCOMMIT);
@@ -2284,6 +2288,7 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
             pendingTasks.decrement();
           }
         });
+        pendingTasks.increment();
       } else {
         try {
           if (ucmd instanceof AddUpdateCommand) {
@@ -2308,7 +2313,6 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
           loglog.warn("REPLAY_ERR: IOException replaying log", e);
         }
       }
-      return ConcurrentUtils.constantFuture(null);
     }
   }
 
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 b97381b..f6e83a6 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
@@ -353,8 +353,7 @@ public class DistributedUpdateProcessor extends UpdateRequestProcessor {
     vinfo.lockForUpdate();
     try {
       long finalVersionOnUpdate = versionOnUpdate;
-      return bucket.runWithLock(vinfo.getVersionBucketLockTimeoutMs(), () -> doVersionAdd(cmd, finalVersionOnUpdate, isReplayOrPeersync,
-          leaderLogic, forwardedFromCollection, bucket), idBytes);
+      return bucket.runWithLock(vinfo.getVersionBucketLockTimeoutMs(), new VersionAdd(cmd, finalVersionOnUpdate, isReplayOrPeersync, leaderLogic, forwardedFromCollection, bucket), idBytes);
     } finally {
       vinfo.unlockForUpdate();
     }
@@ -424,15 +423,10 @@ public class DistributedUpdateProcessor extends UpdateRequestProcessor {
         cmd.setVersion(version);
         cmd.getSolrInputDocument().setField(CommonParams.VERSION_FIELD, version);
 
-        if (!nodist) {
-
-          SolrInputDocument clonedDoc = null;
-          if (shouldCloneCmdDoc()) {
-            // SolrInputDocument clonedDoc = cmd.solrDoc.deepCopy();
-            cloneCmd = (AddUpdateCommand) cmd.clone();
-            clonedDoc = shouldCloneCmdDoc() ? cmd.solrDoc.deepCopy() : null;
-            cloneCmd.solrDoc = clonedDoc;
-          }
+        if (shouldCloneCmdDoc()) {
+          cloneCmd = (AddUpdateCommand) cmd.clone();
+          SolrInputDocument clonedDoc = cmd.solrDoc.deepCopy();
+          cloneCmd.solrDoc = clonedDoc;
         }
 
         bucket.updateHighest(version);
@@ -527,16 +521,7 @@ public class DistributedUpdateProcessor extends UpdateRequestProcessor {
         finalCloneCmd = cmd;
       }
 
-      Callable distCall = () -> {
-        if (log.isTraceEnabled()) log.trace("Run distrib add collection");
-        try {
-          doDistribAdd(finalCloneCmd);
-          if (log.isTraceEnabled()) log.trace("after distrib add collection");
-        } catch (Throwable e) {
-          return e;
-        }
-        return null;
-      };
+      Callable distCall = new DistAddCallable(finalCloneCmd);
 
       distFuture = ParWork.getRootSharedExecutor().submit(distCall);
     }
@@ -1467,4 +1452,47 @@ public class DistributedUpdateProcessor extends UpdateRequestProcessor {
   public void doClose() {
     super.doClose();
   }
+
+  private class VersionAdd implements VersionBucket.CheckedFunction<Object,Future> {
+    private final AddUpdateCommand cmd;
+    private final long finalVersionOnUpdate;
+    private final boolean isReplayOrPeersync;
+    private final boolean leaderLogic;
+    private final boolean forwardedFromCollection;
+    private final VersionBucket bucket;
+
+    public VersionAdd(AddUpdateCommand cmd, long finalVersionOnUpdate, boolean isReplayOrPeersync, boolean leaderLogic, boolean forwardedFromCollection, VersionBucket bucket) {
+      this.cmd = cmd;
+      this.finalVersionOnUpdate = finalVersionOnUpdate;
+      this.isReplayOrPeersync = isReplayOrPeersync;
+      this.leaderLogic = leaderLogic;
+      this.forwardedFromCollection = forwardedFromCollection;
+      this.bucket = bucket;
+    }
+
+    @Override
+    public Future apply() throws IOException {
+      return doVersionAdd(cmd, finalVersionOnUpdate, isReplayOrPeersync, leaderLogic, forwardedFromCollection, bucket);
+    }
+  }
+
+  private class DistAddCallable implements Callable {
+    private final AddUpdateCommand finalCloneCmd;
+
+    public DistAddCallable(AddUpdateCommand finalCloneCmd) {
+      this.finalCloneCmd = finalCloneCmd;
+    }
+
+    @Override
+    public Object call() throws Exception {
+      if (log.isTraceEnabled()) log.trace("Run distrib add collection");
+      try {
+        doDistribAdd(finalCloneCmd);
+        if (log.isTraceEnabled()) log.trace("after distrib add collection");
+      } catch (Throwable e) {
+        return e;
+      }
+      return null;
+    }
+  }
 }
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 9cde4ae..484bb61 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
@@ -233,14 +233,6 @@ public class DistributedZkUpdateProcessor extends DistributedUpdateProcessor {
               "processCommit - Found the following replicas to send commit to {}",
               useNodes);
 
-          worker.collect("localCommit", () -> {
-            try {
-              doLocalCommit(cmd);
-            } catch (IOException e) {
-              throw new SolrException(ErrorCode.SERVER_ERROR, e);
-            }
-          });
-
           if (useNodes != null && useNodes.size() > 0) {
             if (log.isDebugEnabled()) log.debug("processCommit - send commit to replicas nodes={}",
                 useNodes);
@@ -254,6 +246,12 @@ public class DistributedZkUpdateProcessor extends DistributedUpdateProcessor {
               cmdDistrib.distribCommit(cmd, finalUseNodes, params);
             });
           }
+
+          try {
+            doLocalCommit(cmd);
+          } catch (IOException e) {
+            throw new SolrException(ErrorCode.SERVER_ERROR, e);
+          }
         } else {
           // zk
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/DocValuesNotIndexedTest.java b/solr/core/src/test/org/apache/solr/cloud/DocValuesNotIndexedTest.java
index de7bceb..02807a8 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DocValuesNotIndexedTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DocValuesNotIndexedTest.java
@@ -84,8 +84,6 @@ public class DocValuesNotIndexedTest extends SolrCloudTestCase {
         .setMaxShardsPerNode(3)
         .process(cluster.getSolrClient());
 
-    zkClient().printLayout();
-
     fieldsToTestSingle =
         Collections.unmodifiableList(Arrays.asList(
             new FieldProps("intField", "int", 1),
diff --git a/solr/core/src/test/org/apache/solr/security/TestPKIAuthenticationPlugin.java b/solr/core/src/test/org/apache/solr/security/TestPKIAuthenticationPlugin.java
index 79ff8fa..a1042ef 100644
--- a/solr/core/src/test/org/apache/solr/security/TestPKIAuthenticationPlugin.java
+++ b/solr/core/src/test/org/apache/solr/security/TestPKIAuthenticationPlugin.java
@@ -56,11 +56,6 @@ public class TestPKIAuthenticationPlugin extends SolrTestCaseJ4 {
     }
 
     @Override
-    SolrRequestInfo getRequestInfo() {
-      return solrRequestInfo;
-    }
-
-    @Override
     PublicKey getRemotePublicKey(String nodename) {
       return remoteKeys.get(nodename);
     }
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java
index 7dc34cb..7875cfa 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java
@@ -49,7 +49,9 @@ import org.apache.solr.common.util.SolrInternalHttpClient;
 import org.apache.solr.common.util.SolrQueuedThreadPool;
 import org.apache.solr.common.util.SolrScheduledExecutorScheduler;
 import org.apache.solr.common.util.Utils;
+import org.eclipse.jetty.client.ConnectionPool;
 import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.HttpDestination;
 import org.eclipse.jetty.client.MultiplexConnectionPool;
 import org.eclipse.jetty.client.ProtocolHandlers;
 import org.eclipse.jetty.client.api.ContentResponse;
@@ -108,6 +110,7 @@ import java.util.concurrent.Phaser;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import java.util.function.Predicate;
 
 /**
  * Difference between this {@link Http2SolrClient} and {@link HttpSolrClient}:
@@ -255,13 +258,7 @@ public class Http2SolrClient extends SolrClient {
       HttpClientTransportOverHTTP2 transport = new HttpClientTransportOverHTTP2(http2client);
 
 
-      transport.setConnectionPoolFactory(destination -> {
-        Pool pool = new Pool(Pool.StrategyType.FIRST, getHttpClient().getMaxConnectionsPerDestination(), true);
-        MultiplexConnectionPool mulitplexPool = new MultiplexConnectionPool(destination, pool, destination,  getHttpClient().getMaxRequestsQueuedPerDestination());
-        mulitplexPool.setMaximizeConnections(false);
-        mulitplexPool.preCreateConnections(4);
-        return mulitplexPool;
-      });
+      transport.setConnectionPoolFactory(new MyFactory());
       httpClient = new SolrInternalHttpClient(transport, sslContextFactory);
     }
 
@@ -691,7 +688,7 @@ public class Http2SolrClient extends SolrClient {
       String url = basePath + path;
       boolean hasNullStreamName = false;
       if (streams != null) {
-        hasNullStreamName = streams.stream().anyMatch(cs -> cs.getName() == null);
+        hasNullStreamName = streams.stream().anyMatch(new ContentStreamPredicate());
       }
 
       boolean isMultipart = streams != null && streams.size() > 1 && !hasNullStreamName;
@@ -1501,6 +1498,18 @@ public class Http2SolrClient extends SolrClient {
     }
   }
 
+  private class MyFactory implements ConnectionPool.Factory {
+    @Override
+    public ConnectionPool newConnectionPool(HttpDestination destination) {
+      Pool pool = new Pool(Pool.StrategyType.FIRST, getHttpClient().getMaxConnectionsPerDestination(), true);
+      MultiplexConnectionPool mulitplexPool = new MultiplexConnectionPool(destination, pool, destination,  getHttpClient().getMaxRequestsQueuedPerDestination());
+      mulitplexPool.setMaximizeConnections(false);
+      mulitplexPool.preCreateConnections(4);
+      return mulitplexPool;
+    }
+  }
+
+
   private class OnHeadersRunnable implements Runnable {
     private final SolrRequest solrRequest;
     private final ResponseParser parser;
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java
index 7d4569c..c982b21 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java
@@ -190,7 +190,7 @@ public class JavaBinUpdateRequestCodec {
     void update(SolrInputDocument document, UpdateRequest req, Integer commitWithin, Boolean override);
   }
 
-  static class MaskCharSequenceSolrInputDoc extends SolrInputDocument {
+  public static class MaskCharSequenceSolrInputDoc extends SolrInputDocument {
     public MaskCharSequenceSolrInputDoc(Map<String, SolrInputField> fields) {
       super(fields);
     }
@@ -240,7 +240,8 @@ public class JavaBinUpdateRequestCodec {
     }
 
     private SolrInputDocument listToSolrInputDocument(List<NamedList> namedList) {
-      SolrInputDocument doc = new SolrInputDocument();
+      SolrInputDocument doc = SolrInputDocument.THREAD_LOCAL_SolrInputDocument.get();
+      doc.clear();
       for (int i = 0; i < namedList.size(); i++) {
         NamedList nl = namedList.get(i);
         if (i == 0) {
diff --git a/solr/solrj/src/java/org/apache/solr/common/SolrInputDocument.java b/solr/solrj/src/java/org/apache/solr/common/SolrInputDocument.java
index 79305a5..77a46c4 100644
--- a/solr/solrj/src/java/org/apache/solr/common/SolrInputDocument.java
+++ b/solr/solrj/src/java/org/apache/solr/common/SolrInputDocument.java
@@ -26,6 +26,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.function.BiConsumer;
 
+import org.apache.solr.client.solrj.request.JavaBinUpdateRequestCodec;
 import org.apache.solr.common.params.CommonParams;
 
 /**
@@ -38,6 +39,21 @@ import org.apache.solr.common.params.CommonParams;
  */
 public class SolrInputDocument extends SolrDocumentBase<SolrInputField, SolrInputDocument> implements Iterable<SolrInputField>
 {
+
+  public final static ThreadLocal<SolrInputDocument> THREAD_LOCAL_SolrInputDocument= new ThreadLocal<>(){
+    protected SolrInputDocument initialValue() {
+      return new SolrInputDocument();
+    }
+  };
+
+  public final static ThreadLocal<SolrInputDocument> THREAD_LOCAL_MaskCharSolrInputDocument= new ThreadLocal<>(){
+    protected SolrInputDocument initialValue() {
+      return new JavaBinUpdateRequestCodec.MaskCharSequenceSolrInputDoc(new LinkedHashMap());
+    }
+  };
+
+
+
   private final Map<String,SolrInputField> _fields;
   private List<SolrInputDocument> _childDocuments;
 
diff --git a/versions.lock b/versions.lock
index 339020d..14f419c 100644
--- a/versions.lock
+++ b/versions.lock
@@ -7,13 +7,14 @@ com.cybozu.labs:langdetect:1.1-20120112 (1 constraints: 5c066d5e)
 com.drewnoakes:metadata-extractor:2.11.0 (1 constraints: 3605323b)
 com.epam:parso:2.0.11 (1 constraints: 36052c3b)
 com.fasterxml:aalto-xml:1.2.2 (1 constraints: 0705f835)
-com.fasterxml.jackson.core:jackson-annotations:2.10.1 (2 constraints: 331dcd4e)
-com.fasterxml.jackson.core:jackson-core:2.10.1 (3 constraints: 633586b7)
-com.fasterxml.jackson.core:jackson-databind:2.10.1 (3 constraints: 941aba96)
-com.fasterxml.jackson.dataformat:jackson-dataformat-smile:2.10.1 (1 constraints: 3605303b)
-com.fasterxml.staxmate:staxmate:2.3.1 (1 constraints: 0805ff35)
-com.fasterxml.woodstox:woodstox-core:6.0.3 (1 constraints: 0b050c36)
-com.github.ben-manes.caffeine:caffeine:2.8.4 (1 constraints: 10051136)
+com.fasterxml.jackson:jackson-bom:2.12.1 (4 constraints: ab4f8fc9)
+com.fasterxml.jackson.core:jackson-annotations:2.12.1 (3 constraints: ea2bcfa6)
+com.fasterxml.jackson.core:jackson-core:2.12.1 (4 constraints: 1c44f1e9)
+com.fasterxml.jackson.core:jackson-databind:2.12.1 (5 constraints: 7d41418f)
+com.fasterxml.jackson.dataformat:jackson-dataformat-smile:2.12.1 (2 constraints: ed132382)
+com.fasterxml.staxmate:staxmate:2.4.0 (1 constraints: 08050136)
+com.fasterxml.woodstox:woodstox-core:6.2.3 (1 constraints: 0d051236)
+com.github.ben-manes.caffeine:caffeine:2.8.8 (1 constraints: 14051536)
 com.github.virtuald:curvesapi:1.06 (1 constraints: db04f530)
 com.github.zafarkhaja:java-semver:0.9.0 (1 constraints: 0b050636)
 com.google.code.findbugs:annotations:3.0.1 (1 constraints: 0605fb35)
@@ -69,16 +70,16 @@ io.prometheus:simpleclient_common:0.2.0 (2 constraints: e8159ecb)
 io.prometheus:simpleclient_httpserver:0.2.0 (1 constraints: 0405f135)
 io.sgr:s2-geometry-library-java:1.0.0 (1 constraints: 0305f035)
 javax.activation:activation:1.1.1 (3 constraints: 1017445c)
-javax.annotation:javax.annotation-api:1.3 (1 constraints: 3c0fda5d)
+javax.annotation:javax.annotation-api:1.3.2 (1 constraints: 9c0fe07c)
 javax.servlet:javax.servlet-api:3.1.0 (3 constraints: 75209943)
 javax.transaction:javax.transaction-api:1.3 (1 constraints: d90ea14d)
-junit:junit:4.12 (2 constraints: 3e1e6104)
+junit:junit:4.13.1 (3 constraints: f62c9b7f)
 net.arnx:jsonic:1.2.7 (2 constraints: db10d4d1)
 net.hydromatic:eigenbase-properties:1.1.5 (1 constraints: 0905f835)
 net.jcip:jcip-annotations:1.0 (1 constraints: 560ff165)
 net.minidev:accessors-smart:1.2 (1 constraints: e60926a4)
 net.minidev:json-smart:2.3 (1 constraints: a40c49ff)
-net.sf.saxon:Saxon-HE:10.2 (1 constraints: d704f330)
+net.sf.saxon:Saxon-HE:10.3 (1 constraints: d804f430)
 net.sourceforge.argparse4j:argparse4j:0.8.1 (1 constraints: 0b050436)
 net.sourceforge.nekohtml:nekohtml:1.9.17 (1 constraints: 4405503b)
 net.thisptr:jackson-jq:0.0.8 (1 constraints: 0a05f335)
@@ -114,9 +115,9 @@ org.apache.kerby:kerby-asn1:1.0.1 (2 constraints: 001155df)
 org.apache.kerby:kerby-config:1.0.1 (1 constraints: 860b05e6)
 org.apache.kerby:kerby-pkix:1.0.1 (2 constraints: 741065ca)
 org.apache.kerby:kerby-util:1.0.1 (2 constraints: 6518bdb6)
-org.apache.logging.log4j:log4j-api:2.13.2 (4 constraints: d033f2b0)
-org.apache.logging.log4j:log4j-core:2.13.2 (2 constraints: 0d16b224)
-org.apache.logging.log4j:log4j-slf4j-impl:2.13.2 (1 constraints: 3a053a3b)
+org.apache.logging.log4j:log4j-api:2.14.0 (4 constraints: cc33d3af)
+org.apache.logging.log4j:log4j-core:2.14.0 (2 constraints: 0b168124)
+org.apache.logging.log4j:log4j-slf4j-impl:2.14.0 (1 constraints: 39053b3b)
 org.apache.opennlp:opennlp-tools:1.9.1 (1 constraints: 0d050c36)
 org.apache.pdfbox:fontbox:2.0.17 (1 constraints: 3c05323b)
 org.apache.pdfbox:jempbox:1.8.16 (1 constraints: 42054b3b)
@@ -155,34 +156,35 @@ org.ccil.cowan.tagsoup:tagsoup:1.2.1 (1 constraints: 0605f735)
 org.checkerframework:checker-qual:2.11.1 (1 constraints: 470a33bf)
 org.codehaus.janino:commons-compiler:3.0.9 (2 constraints: d910f7d1)
 org.codehaus.janino:janino:3.0.9 (1 constraints: 0e050336)
-org.codehaus.woodstox:stax2-api:4.2 (3 constraints: 32284719)
-org.eclipse.jetty:jetty-alpn-client:9.4.32.v20200930 (3 constraints: b92c28fa)
-org.eclipse.jetty:jetty-alpn-java-client:9.4.32.v20200930 (1 constraints: 7807027d)
-org.eclipse.jetty:jetty-alpn-java-server:9.4.32.v20200930 (1 constraints: 7807027d)
-org.eclipse.jetty:jetty-alpn-server:9.4.32.v20200930 (2 constraints: 131b70db)
-org.eclipse.jetty:jetty-annotations:9.4.32.v20200930 (1 constraints: a9111223)
-org.eclipse.jetty:jetty-client:9.4.32.v20200930 (1 constraints: c617f2ad)
-org.eclipse.jetty:jetty-continuation:9.4.32.v20200930 (2 constraints: 4d1830f9)
-org.eclipse.jetty:jetty-deploy:9.4.32.v20200930 (1 constraints: 7807027d)
-org.eclipse.jetty:jetty-http:9.4.32.v20200930 (5 constraints: 6349833d)
-org.eclipse.jetty:jetty-io:9.4.32.v20200930 (8 constraints: cf7d7902)
-org.eclipse.jetty:jetty-jmx:9.4.32.v20200930 (2 constraints: 20194c33)
-org.eclipse.jetty:jetty-jndi:9.4.32.v20200930 (1 constraints: 220f62a5)
-org.eclipse.jetty:jetty-plus:9.4.32.v20200930 (2 constraints: b423f229)
-org.eclipse.jetty:jetty-quickstart:9.4.32.v20200930 (1 constraints: 7807027d)
-org.eclipse.jetty:jetty-rewrite:9.4.32.v20200930 (1 constraints: 7807027d)
-org.eclipse.jetty:jetty-security:9.4.32.v20200930 (2 constraints: da17f4db)
-org.eclipse.jetty:jetty-server:9.4.32.v20200930 (6 constraints: 965e0ae2)
-org.eclipse.jetty:jetty-servlet:9.4.32.v20200930 (2 constraints: 54175bbd)
-org.eclipse.jetty:jetty-servlets:9.4.32.v20200930 (1 constraints: 7807027d)
-org.eclipse.jetty:jetty-util:9.4.32.v20200930 (8 constraints: 41736037)
-org.eclipse.jetty:jetty-webapp:9.4.32.v20200930 (5 constraints: 364a6293)
-org.eclipse.jetty:jetty-xml:9.4.32.v20200930 (3 constraints: 3e27aa1a)
-org.eclipse.jetty.http2:http2-client:9.4.32.v20200930 (2 constraints: 3d1f223d)
-org.eclipse.jetty.http2:http2-common:9.4.32.v20200930 (3 constraints: 0c2b9619)
-org.eclipse.jetty.http2:http2-hpack:9.4.32.v20200930 (2 constraints: 4019315a)
-org.eclipse.jetty.http2:http2-http-client-transport:9.4.32.v20200930 (1 constraints: 7807027d)
-org.eclipse.jetty.http2:http2-server:9.4.32.v20200930 (1 constraints: 7807027d)
+org.codehaus.woodstox:stax2-api:4.2.1 (3 constraints: 9028106a)
+org.eclipse.jetty:jetty-alpn-client:9.4.36.v20210114 (3 constraints: b62cc7f9)
+org.eclipse.jetty:jetty-alpn-java-client:9.4.36.v20210114 (1 constraints: 77071b7d)
+org.eclipse.jetty:jetty-alpn-java-server:9.4.36.v20210114 (1 constraints: 77071b7d)
+org.eclipse.jetty:jetty-alpn-server:9.4.36.v20210114 (2 constraints: 111b66db)
+org.eclipse.jetty:jetty-annotations:9.4.36.v20210114 (1 constraints: a8112b23)
+org.eclipse.jetty:jetty-client:9.4.36.v20210114 (1 constraints: c5170bae)
+org.eclipse.jetty:jetty-continuation:9.4.36.v20210114 (2 constraints: 4b182ef9)
+org.eclipse.jetty:jetty-deploy:9.4.36.v20210114 (1 constraints: 77071b7d)
+org.eclipse.jetty:jetty-http:9.4.36.v20210114 (5 constraints: 5e49f23b)
+org.eclipse.jetty:jetty-io:9.4.36.v20210114 (8 constraints: c77d7afd)
+org.eclipse.jetty:jetty-jmx:9.4.36.v20210114 (2 constraints: 1e194833)
+org.eclipse.jetty:jetty-jndi:9.4.36.v20210114 (1 constraints: 210f7ba5)
+org.eclipse.jetty:jetty-plus:9.4.36.v20210114 (2 constraints: b223ee29)
+org.eclipse.jetty:jetty-quickstart:9.4.36.v20210114 (1 constraints: 77071b7d)
+org.eclipse.jetty:jetty-rewrite:9.4.36.v20210114 (1 constraints: 77071b7d)
+org.eclipse.jetty:jetty-security:9.4.36.v20210114 (2 constraints: d817f3db)
+org.eclipse.jetty:jetty-server:9.4.36.v20210114 (6 constraints: 915e36e0)
+org.eclipse.jetty:jetty-servlet:9.4.36.v20210114 (2 constraints: 52175bbd)
+org.eclipse.jetty:jetty-servlets:9.4.36.v20210114 (1 constraints: 77071b7d)
+org.eclipse.jetty:jetty-util:9.4.36.v20210114 (9 constraints: 2484d334)
+org.eclipse.jetty:jetty-util-ajax:9.4.36.v20210114 (1 constraints: 621038e2)
+org.eclipse.jetty:jetty-webapp:9.4.36.v20210114 (5 constraints: 314adc91)
+org.eclipse.jetty:jetty-xml:9.4.36.v20210114 (3 constraints: 3b275f1a)
+org.eclipse.jetty.http2:http2-client:9.4.36.v20210114 (2 constraints: 3b1f0d3d)
+org.eclipse.jetty.http2:http2-common:9.4.36.v20210114 (3 constraints: 092b3919)
+org.eclipse.jetty.http2:http2-hpack:9.4.36.v20210114 (2 constraints: 3e192b5a)
+org.eclipse.jetty.http2:http2-http-client-transport:9.4.36.v20210114 (1 constraints: 77071b7d)
+org.eclipse.jetty.http2:http2-server:9.4.36.v20210114 (1 constraints: 77071b7d)
 org.gagravarr:vorbis-java-core:0.8 (1 constraints: ac041f2c)
 org.gagravarr:vorbis-java-tika:0.8 (1 constraints: ac041f2c)
 org.hamcrest:hamcrest:2.2 (2 constraints: e0161c1d)
@@ -191,18 +193,18 @@ org.jdom:jdom2:2.0.6 (1 constraints: 0a05fb35)
 org.jline:jline:3.19.0 (1 constraints: 3f05503b)
 org.locationtech.spatial4j:spatial4j:0.7 (1 constraints: ab041e2c)
 org.lz4:lz4-java:1.7.1 (1 constraints: 0b050636)
-org.ow2.asm:asm:7.3.1 (5 constraints: dc33fb7a)
-org.ow2.asm:asm-analysis:7.3.1 (1 constraints: 440a31ba)
-org.ow2.asm:asm-commons:7.3.1 (2 constraints: 4d14ca76)
-org.ow2.asm:asm-tree:7.3.1 (2 constraints: ef145cd6)
+org.ow2.asm:asm:9.0 (5 constraints: bc32425d)
+org.ow2.asm:asm-analysis:9.0 (1 constraints: e409dda5)
+org.ow2.asm:asm-commons:9.0 (2 constraints: ed13644e)
+org.ow2.asm:asm-tree:9.0 (2 constraints: 2f144e8c)
 org.rrd4j:rrd4j:3.5 (1 constraints: ac04252c)
-org.slf4j:jcl-over-slf4j:1.7.24 (1 constraints: 4005473b)
-org.slf4j:slf4j-api:1.7.24 (18 constraints: 64f415d2)
+org.slf4j:jcl-over-slf4j:1.7.24 (1 constraints: 4105483b)
+org.slf4j:slf4j-api:1.7.24 (18 constraints: d3f6bfd0)
 org.tallison:jmatio:1.5 (1 constraints: aa041f2c)
 org.tukaani:xz:1.8 (1 constraints: ad04222c)
 org.xerial.snappy:snappy-java:1.1.8.1 (1 constraints: 6b05a040)
 ua.net.nlp:morfologik-ukrainian-search:4.9.1 (1 constraints: 10051b36)
-xerces:xercesImpl:2.12.0 (2 constraints: 1f14b675)
+xerces:xercesImpl:2.12.1 (2 constraints: 2014e175)
 xml-apis:xml-apis:1.4.01 (1 constraints: ae08b08c)
 
 [Test dependencies]
@@ -240,7 +242,7 @@ org.apache.kerby:kerb-identity:1.0.1 (1 constraints: 0405f135)
 org.apache.kerby:kerb-server:1.0.1 (1 constraints: 0405f135)
 org.apache.kerby:kerb-simplekdc:1.0.1 (1 constraints: 0405f135)
 org.apache.kerby:kerby-kdc:1.0.1 (1 constraints: 0405f135)
-org.apache.logging.log4j:log4j-1.2-api:2.13.2 (1 constraints: 3a053a3b)
+org.apache.logging.log4j:log4j-1.2-api:2.14.0 (1 constraints: 39053b3b)
 org.asciidoctor:asciidoctorj:1.6.2 (1 constraints: 0b050436)
 org.asciidoctor:asciidoctorj-api:1.6.2 (1 constraints: e30cfb0d)
 org.conscrypt:conscrypt-openjdk-uber:2.2.1 (1 constraints: b30f7f8d)
@@ -256,7 +258,7 @@ org.locationtech.jts:jts-core:1.15.0 (1 constraints: 3905383b)
 org.mockito:mockito-core:2.23.4 (1 constraints: 3d05403b)
 org.objenesis:objenesis:2.6 (2 constraints: 5f0ffb79)
 org.opentest4j:opentest4j:1.1.1 (1 constraints: ca1044c1)
-org.slf4j:slf4j-simple:1.7.24 (1 constraints: 4005473b)
+org.slf4j:slf4j-simple:1.7.24 (1 constraints: 4105483b)
 org.xmlunit:xmlunit-core:2.7.0 (3 constraints: 602a5f6c)
 org.xmlunit:xmlunit-legacy:2.7.0 (1 constraints: b70f8d8d)
 org.xmlunit:xmlunit-placeholders:2.7.0 (1 constraints: b70f8d8d)
diff --git a/versions.props b/versions.props
index 2a013cb..9438583 100644
--- a/versions.props
+++ b/versions.props
@@ -101,7 +101,7 @@ org.mockito:mockito-core=2.23.4
 org.objenesis:objenesis=2.6
 org.ow2.asm:*=7.2
 org.rrd4j:rrd4j=3.5
-org.slf4j:*=1.7.30
+org.slf4j:*=1.7.24
 org.tallison:jmatio=1.5
 org.tukaani:xz=1.8
 ua.net.nlp:morfologik-ukrainian-search=4.9.1