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_";