mirror of https://github.com/apache/lucene.git
SOLR-12290: We must close ContentStreams because we don't know the source of the inputstream - use a CloseShield to prevent tripping our close assert in SolrDispatchFilter.
This commit is contained in:
parent
0922e58c2c
commit
5fc7251540
|
@ -17,6 +17,7 @@
|
||||||
package org.apache.solr.handler;
|
package org.apache.solr.handler;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.lang.invoke.MethodHandles;
|
import java.lang.invoke.MethodHandles;
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
|
@ -108,8 +109,9 @@ public class BlobHandler extends RequestHandlerBase implements PluginInfoInitial
|
||||||
|
|
||||||
for (ContentStream stream : req.getContentStreams()) {
|
for (ContentStream stream : req.getContentStreams()) {
|
||||||
ByteBuffer payload;
|
ByteBuffer payload;
|
||||||
payload = SimplePostTool.inputStreamToByteArray(stream.getStream(), maxSize);
|
try (InputStream is = stream.getStream()) {
|
||||||
|
payload = SimplePostTool.inputStreamToByteArray(is, maxSize);
|
||||||
|
}
|
||||||
MessageDigest m = MessageDigest.getInstance("MD5");
|
MessageDigest m = MessageDigest.getInstance("MD5");
|
||||||
m.update(payload.array(), payload.position(), payload.limit());
|
m.update(payload.array(), payload.position(), payload.limit());
|
||||||
String md5 = new BigInteger(1, m.digest()).toString(16);
|
String md5 = new BigInteger(1, m.digest()).toString(16);
|
||||||
|
|
|
@ -28,6 +28,7 @@ import org.apache.solr.update.*;
|
||||||
import org.apache.solr.update.processor.UpdateRequestProcessor;
|
import org.apache.solr.update.processor.UpdateRequestProcessor;
|
||||||
import org.apache.solr.internal.csv.CSVStrategy;
|
import org.apache.solr.internal.csv.CSVStrategy;
|
||||||
import org.apache.solr.internal.csv.CSVParser;
|
import org.apache.solr.internal.csv.CSVParser;
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -314,48 +315,54 @@ abstract class CSVLoaderBase extends ContentStreamLoader {
|
||||||
|
|
||||||
/** load the CSV input */
|
/** load the CSV input */
|
||||||
@Override
|
@Override
|
||||||
public void load(SolrQueryRequest req, SolrQueryResponse rsp, ContentStream stream, UpdateRequestProcessor processor)
|
public void load(SolrQueryRequest req, SolrQueryResponse rsp, ContentStream stream, UpdateRequestProcessor processor) throws IOException {
|
||||||
throws IOException {
|
|
||||||
errHeader = "CSVLoader: input=" + stream.getSourceInfo();
|
errHeader = "CSVLoader: input=" + stream.getSourceInfo();
|
||||||
Reader reader = stream.getReader();
|
Reader reader = null;
|
||||||
if (skipLines > 0) {
|
try {
|
||||||
if (!(reader instanceof BufferedReader)) {
|
reader = stream.getReader();
|
||||||
reader = new BufferedReader(reader);
|
if (skipLines>0) {
|
||||||
}
|
if (!(reader instanceof BufferedReader)) {
|
||||||
BufferedReader r = (BufferedReader) reader;
|
reader = new BufferedReader(reader);
|
||||||
for (int i = 0; i < skipLines; i++) {
|
}
|
||||||
r.readLine();
|
BufferedReader r = (BufferedReader)reader;
|
||||||
}
|
for (int i=0; i<skipLines; i++) {
|
||||||
}
|
r.readLine();
|
||||||
|
}
|
||||||
CSVParser parser = new CSVParser(reader, strategy);
|
|
||||||
|
|
||||||
// parse the fieldnames from the header of the file
|
|
||||||
if (fieldnames == null) {
|
|
||||||
fieldnames = parser.getLine();
|
|
||||||
if (fieldnames == null) {
|
|
||||||
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Expected fieldnames in CSV input");
|
|
||||||
}
|
|
||||||
prepareFields();
|
|
||||||
}
|
|
||||||
|
|
||||||
// read the rest of the CSV file
|
|
||||||
for (;;) {
|
|
||||||
int line = parser.getLineNumber(); // for error reporting in MT mode
|
|
||||||
String[] vals = null;
|
|
||||||
try {
|
|
||||||
vals = parser.getLine();
|
|
||||||
} catch (IOException e) {
|
|
||||||
// Catch the exception and rethrow it with more line information
|
|
||||||
input_err("can't read line: " + line, null, line, e);
|
|
||||||
}
|
|
||||||
if (vals == null) break;
|
|
||||||
|
|
||||||
if (vals.length != fieldnames.length) {
|
|
||||||
input_err("expected " + fieldnames.length + " values but got " + vals.length, vals, line);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
addDoc(line, vals);
|
CSVParser parser = new CSVParser(reader, strategy);
|
||||||
|
|
||||||
|
// parse the fieldnames from the header of the file
|
||||||
|
if (fieldnames==null) {
|
||||||
|
fieldnames = parser.getLine();
|
||||||
|
if (fieldnames==null) {
|
||||||
|
throw new SolrException( SolrException.ErrorCode.BAD_REQUEST,"Expected fieldnames in CSV input");
|
||||||
|
}
|
||||||
|
prepareFields();
|
||||||
|
}
|
||||||
|
|
||||||
|
// read the rest of the CSV file
|
||||||
|
for(;;) {
|
||||||
|
int line = parser.getLineNumber(); // for error reporting in MT mode
|
||||||
|
String[] vals = null;
|
||||||
|
try {
|
||||||
|
vals = parser.getLine();
|
||||||
|
} catch (IOException e) {
|
||||||
|
//Catch the exception and rethrow it with more line information
|
||||||
|
input_err("can't read line: " + line, null, line, e);
|
||||||
|
}
|
||||||
|
if (vals==null) break;
|
||||||
|
|
||||||
|
if (vals.length != fieldnames.length) {
|
||||||
|
input_err("expected "+fieldnames.length+" values but got "+vals.length, vals, line);
|
||||||
|
}
|
||||||
|
|
||||||
|
addDoc(line,vals);
|
||||||
|
}
|
||||||
|
} finally{
|
||||||
|
if (reader != null) {
|
||||||
|
IOUtils.closeQuietly(reader);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,8 +48,20 @@ import org.apache.solr.update.processor.UpdateRequestProcessor;
|
||||||
public class JavabinLoader extends ContentStreamLoader {
|
public class JavabinLoader extends ContentStreamLoader {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load(SolrQueryRequest req, SolrQueryResponse rsp, ContentStream cs, UpdateRequestProcessor processor) throws Exception {
|
public void load(SolrQueryRequest req, SolrQueryResponse rsp, ContentStream stream, UpdateRequestProcessor processor) throws Exception {
|
||||||
InputStream stream = cs.getStream();
|
InputStream is = null;
|
||||||
|
try {
|
||||||
|
is = stream.getStream();
|
||||||
|
parseAndLoadDocs(req, rsp, is, processor);
|
||||||
|
} finally {
|
||||||
|
if(is != null) {
|
||||||
|
is.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void parseAndLoadDocs(final SolrQueryRequest req, SolrQueryResponse rsp, InputStream stream,
|
||||||
|
final UpdateRequestProcessor processor) throws IOException {
|
||||||
UpdateRequest update = null;
|
UpdateRequest update = null;
|
||||||
JavaBinUpdateRequestCodec.StreamingUpdateHandler handler = new JavaBinUpdateRequestCodec.StreamingUpdateHandler() {
|
JavaBinUpdateRequestCodec.StreamingUpdateHandler handler = new JavaBinUpdateRequestCodec.StreamingUpdateHandler() {
|
||||||
private AddUpdateCommand addCmd = null;
|
private AddUpdateCommand addCmd = null;
|
||||||
|
|
|
@ -519,7 +519,11 @@ public class SolrRequestParsers
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public InputStream getStream() throws IOException {
|
public InputStream getStream() throws IOException {
|
||||||
return req.getInputStream();
|
// we explicitly protect this servlet stream from being closed
|
||||||
|
// so that it does not trip our test assert in our close shield
|
||||||
|
// in SolrDispatchFilter - we must allow closes from getStream
|
||||||
|
// due to the other impls of ContentStream
|
||||||
|
return new CloseShieldInputStream(req.getInputStream());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue