You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ab...@apache.org on 2020/05/14 08:54:31 UTC

[lucene-solr] 01/03: SOLR-14470: Cleanup, reduce object allocations.

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

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

commit 3d6b0393570f5193c53b97c3d3c060003c08dbdb
Author: Andrzej Bialecki <ab...@apache.org>
AuthorDate: Tue May 12 17:34:15 2020 +0200

    SOLR-14470: Cleanup, reduce object allocations.
---
 .../org/apache/solr/handler/StreamHandler.java     | 20 +++------
 .../apache/solr/handler/export/ExportWriter.java   | 35 ++++++++++------
 .../solr/response/GraphMLResponseWriter.java       |  4 +-
 .../org/apache/solr/client/solrj/io/Tuple.java     | 48 +++++++++++++++++-----
 .../apache/solr/common/params/StreamParams.java    |  2 +
 5 files changed, 68 insertions(+), 41 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/handler/StreamHandler.java b/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
index bc57247..184a737 100644
--- a/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
@@ -347,11 +347,7 @@ public class StreamHandler extends RequestHandlerBase implements SolrCoreAware,
         msg = t.getMessage();
         t = t.getCause();
       }
-
-      Map m = new HashMap();
-      m.put(StreamParams.EOF, true);
-      m.put(StreamParams.EXCEPTION, msg);
-      return new Tuple(m);
+      return Tuple.EXCEPTION(msg, true);
     }
   }
 
@@ -393,9 +389,7 @@ public class StreamHandler extends RequestHandlerBase implements SolrCoreAware,
       if (it.hasNext()) {
         return it.next().getInfo();
       } else {
-        Map m = new HashMap();
-        m.put(StreamParams.EOF, true);
-        return new Tuple(m);
+        return Tuple.EOF();
       }
     }
   }
@@ -437,14 +431,10 @@ public class StreamHandler extends RequestHandlerBase implements SolrCoreAware,
 
     public Tuple read() {
       if (sendEOF) {
-        Map m = new HashMap();
-        m.put(StreamParams.EOF, true);
-        return new Tuple(m);
+        return Tuple.EOF();
       } else {
         sendEOF = true;
-        Map m = new HashMap();
-        m.put("DaemonOp", message);
-        return new Tuple(m);
+        return new Tuple("DaemonOp", message);
       }
     }
   }
@@ -493,7 +483,7 @@ public class StreamHandler extends RequestHandlerBase implements SolrCoreAware,
       Tuple tuple = this.tupleStream.read();
       if (tuple.EOF) {
         long totalTime = (System.nanoTime() - begin) / 1000000;
-        tuple.fields.put("RESPONSE_TIME", totalTime);
+        tuple.fields.put(StreamParams.RESPONSE_TIME, totalTime);
       }
       return tuple;
     }
diff --git a/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java b/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java
index 696b71b..b386136 100644
--- a/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java
+++ b/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java
@@ -24,9 +24,7 @@ import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.lang.invoke.MethodHandles;
 import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 import org.apache.lucene.index.LeafReader;
 import org.apache.lucene.index.LeafReaderContext;
@@ -102,6 +100,7 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private static final int DOCUMENT_BATCH_SIZE = 30000;
+
   private static final String EXPORT_WRITER_KEY = "__ew__";
   private static final String DOCS_KEY = "_ew_docs_";
   private static final String DOCS_INDEX_KEY = "_ew_docs_idx_";
@@ -119,12 +118,27 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
   PushWriter writer;
   private String wt;
 
+  private static class TupleEntryWriter implements EntryWriter {
+    Tuple tuple;
+
+    void setTuple(Tuple tuple) {
+      this.tuple = tuple;
+    }
+
+    @Override
+    public EntryWriter put(CharSequence k, Object v) throws IOException {
+      tuple.put(k, v);
+      return this;
+    }
+  }
+
   public static class ExportWriterStream extends TupleStream implements Expressible {
     StreamContext context;
     int pos;
     SortDoc[] docs;
     ExportWriter exportWriter;
     List<LeafReaderContext> leaves;
+    TupleEntryWriter entryWriter = new TupleEntryWriter();
 
     public ExportWriterStream(StreamExpression expression, StreamFactory factory) throws IOException {
 
@@ -159,27 +173,22 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
     @Override
     public void close() throws IOException {
       docs = null;
+      exportWriter = null;
+      leaves = null;
     }
 
     @Override
     public Tuple read() throws IOException {
       Tuple tuple;
       if (pos >= 0) {
+        tuple = new Tuple();
+        entryWriter.setTuple(tuple);
         SortDoc s = docs[pos];
-        Map<String, Object>  map = new HashMap<>();
-        exportWriter.writeDoc(s, leaves, new EntryWriter() {
-          @Override
-          public EntryWriter put(CharSequence k, Object v) throws IOException {
-            map.put(k.toString(), v);
-            return this;
-          }
-        });
+        exportWriter.writeDoc(s, leaves, entryWriter);
         s.reset();
-        tuple = new Tuple(map);
         pos--;
       } else {
-        tuple = new Tuple();
-        tuple.EOF = true;
+        tuple = Tuple.EOF();
       }
       return tuple;
     }
diff --git a/solr/core/src/java/org/apache/solr/response/GraphMLResponseWriter.java b/solr/core/src/java/org/apache/solr/response/GraphMLResponseWriter.java
index 9bb7403..85346be 100644
--- a/solr/core/src/java/org/apache/solr/response/GraphMLResponseWriter.java
+++ b/solr/core/src/java/org/apache/solr/response/GraphMLResponseWriter.java
@@ -95,9 +95,9 @@ public class GraphMLResponseWriter implements QueryResponseWriter {
         printWriter.write("<node id=\""+ xmlEscape(id)+"\"");
 
         List<String> outfields = new ArrayList();
-        Iterator<String> keys = tuple.fields.keySet().iterator();
+        Iterator<Object> keys = tuple.fields.keySet().iterator();
         while(keys.hasNext()) {
-          String key = keys.next();
+          String key = String.valueOf(keys.next());
           if(key.equals("node") || key.equals("ancestors") || key.equals("collection")) {
             continue;
           } else {
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/Tuple.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/Tuple.java
index c2545cd..39c6ad9 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/Tuple.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/Tuple.java
@@ -23,6 +23,7 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 import org.apache.solr.common.MapWriter;
 import org.apache.solr.common.params.StreamParams;
@@ -45,7 +46,7 @@ public class Tuple implements Cloneable, MapWriter {
   public boolean EOF;
   public boolean EXCEPTION;
 
-  public Map fields = new HashMap();
+  public Map<Object, Object> fields = new HashMap<>();
   public List<String> fieldNames;
   public Map<String, String> fieldLabels;
 
@@ -53,16 +54,20 @@ public class Tuple implements Cloneable, MapWriter {
     // just an empty tuple
   }
   
-  public Tuple(Map fields) {
-    if (fields.containsKey(StreamParams.EOF)) {
-      EOF = true;
+  public Tuple(Map<?, ?> fields) {
+    for (Map.Entry<?, ?> entry : fields.entrySet()) {
+      put(entry.getKey(), entry.getValue());
     }
+  }
 
-    if (fields.containsKey(StreamParams.EXCEPTION)) {
-      EXCEPTION = true;
+  public Tuple(Object... fields) {
+    Objects.requireNonNull(fields);
+    if ((fields.length % 2) != 0) {
+      throw new RuntimeException("must have a matching number of key-value pairs");
+    }
+    for (int i = 0; i < fields.length; i += 2) {
+      put(fields[i], fields[i + 1]);
     }
-
-    this.fields.putAll(fields);
   }
 
   public Object get(Object key) {
@@ -71,9 +76,15 @@ public class Tuple implements Cloneable, MapWriter {
 
   public void put(Object key, Object value) {
     this.fields.put(key, value);
+    if (key.equals(StreamParams.EOF)) {
+      EOF = true;
+    } else if (key.equals(StreamParams.EXCEPTION)) {
+      EXCEPTION = true;
+    }
+
   }
   
-  public void remove(Object key){
+  public void remove(Object key) {
     this.fields.remove(key);
   }
 
@@ -195,8 +206,8 @@ public class Tuple implements Cloneable, MapWriter {
   }
 
   public Tuple clone() {
-    HashMap m = new HashMap(fields);
-    Tuple clone = new Tuple(m);
+    Tuple clone = new Tuple();
+    clone.fields.putAll(fields);
     return clone;
   }
   
@@ -221,4 +232,19 @@ public class Tuple implements Cloneable, MapWriter {
       }
     }
   }
+
+  public static Tuple EOF() {
+    Tuple tuple = new Tuple();
+    tuple.put((Object) StreamParams.EOF, true);
+    return tuple;
+  }
+
+  public static Tuple EXCEPTION(String msg, boolean eof) {
+    Tuple tuple = new Tuple();
+    tuple.put((Object) StreamParams.EXCEPTION, msg);
+    if (eof) {
+      tuple.put((Object) StreamParams.EOF, true);
+    }
+    return tuple;
+  }
 }
diff --git a/solr/solrj/src/java/org/apache/solr/common/params/StreamParams.java b/solr/solrj/src/java/org/apache/solr/common/params/StreamParams.java
index c26db5e..88654f9 100644
--- a/solr/solrj/src/java/org/apache/solr/common/params/StreamParams.java
+++ b/solr/solrj/src/java/org/apache/solr/common/params/StreamParams.java
@@ -29,6 +29,8 @@ public interface StreamParams {
   String DOCS = "docs";
   String RETURN_VALUE = "return-value";
   String RESULT_SET = "result-set";
+
+  String RESPONSE_TIME = "RESPONSE_TIME";
   String EOF = "EOF";
   String EXCEPTION = "EXCEPTION";
   String METRICS = "_METRICS_";