mirror of https://github.com/apache/lucene.git
SOLR-6550: Provide simple mechanism for passing additional metadata / context about a server-side SolrException back to the client-side
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1627154 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
e096d4ae93
commit
52a787e311
|
@ -40,7 +40,11 @@ public class ResponseUtils {
|
||||||
public static int getErrorInfo(Throwable ex, NamedList info, Logger log) {
|
public static int getErrorInfo(Throwable ex, NamedList info, Logger log) {
|
||||||
int code = 500;
|
int code = 500;
|
||||||
if (ex instanceof SolrException) {
|
if (ex instanceof SolrException) {
|
||||||
code = ((SolrException)ex).code();
|
SolrException solrExc = (SolrException)ex;
|
||||||
|
code = solrExc.code();
|
||||||
|
NamedList<String> errorMetadata = solrExc.getMetadata();
|
||||||
|
if (errorMetadata != null)
|
||||||
|
info.add("metadata", errorMetadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Throwable th = ex; th != null; th = th.getCause()) {
|
for (Throwable th = ex; th != null; th = th.getCause()) {
|
||||||
|
|
|
@ -237,7 +237,22 @@ public class ConcurrentUpdateSolrServer extends SolrServer {
|
||||||
msg.append(response.getStatusLine().getReasonPhrase());
|
msg.append(response.getStatusLine().getReasonPhrase());
|
||||||
msg.append("\n\n\n\n");
|
msg.append("\n\n\n\n");
|
||||||
msg.append("request: ").append(method.getURI());
|
msg.append("request: ").append(method.getURI());
|
||||||
handleError(new SolrException(ErrorCode.getErrorCode(statusCode), msg.toString()));
|
|
||||||
|
SolrException solrExc = new SolrException(ErrorCode.getErrorCode(statusCode), msg.toString());
|
||||||
|
// parse out the metadata from the SolrException
|
||||||
|
try {
|
||||||
|
NamedList<Object> resp =
|
||||||
|
server.parser.processResponse(response.getEntity().getContent(),
|
||||||
|
response.getEntity().getContentType().getValue());
|
||||||
|
NamedList<Object> error = (NamedList<Object>) resp.get("error");
|
||||||
|
if (error != null)
|
||||||
|
solrExc.setMetadata((NamedList<String>) error.get("metadata"));
|
||||||
|
} catch (Exception exc) {
|
||||||
|
// don't want to fail to report error if parsing the response fails
|
||||||
|
log.warn("Failed to parse error response from "+server.getBaseURL()+" due to: "+exc);
|
||||||
|
}
|
||||||
|
|
||||||
|
handleError(solrExc);
|
||||||
} else {
|
} else {
|
||||||
onSuccess(response);
|
onSuccess(response);
|
||||||
}
|
}
|
||||||
|
|
|
@ -530,6 +530,7 @@ public class HttpSolrServer extends SolrServer {
|
||||||
throw new RemoteSolrException(httpStatus, e.getMessage(), e);
|
throw new RemoteSolrException(httpStatus, e.getMessage(), e);
|
||||||
}
|
}
|
||||||
if (httpStatus != HttpStatus.SC_OK) {
|
if (httpStatus != HttpStatus.SC_OK) {
|
||||||
|
NamedList<String> metadata = null;
|
||||||
String reason = null;
|
String reason = null;
|
||||||
try {
|
try {
|
||||||
NamedList err = (NamedList) rsp.get("error");
|
NamedList err = (NamedList) rsp.get("error");
|
||||||
|
@ -538,6 +539,7 @@ public class HttpSolrServer extends SolrServer {
|
||||||
if(reason == null) {
|
if(reason == null) {
|
||||||
reason = (String) err.get("trace");
|
reason = (String) err.get("trace");
|
||||||
}
|
}
|
||||||
|
metadata = (NamedList<String>)err.get("metadata");
|
||||||
}
|
}
|
||||||
} catch (Exception ex) {}
|
} catch (Exception ex) {}
|
||||||
if (reason == null) {
|
if (reason == null) {
|
||||||
|
@ -547,7 +549,9 @@ public class HttpSolrServer extends SolrServer {
|
||||||
msg.append("request: " + method.getURI());
|
msg.append("request: " + method.getURI());
|
||||||
reason = java.net.URLDecoder.decode(msg.toString(), UTF_8);
|
reason = java.net.URLDecoder.decode(msg.toString(), UTF_8);
|
||||||
}
|
}
|
||||||
throw new RemoteSolrException(httpStatus, reason, null);
|
RemoteSolrException rss = new RemoteSolrException(httpStatus, reason, null);
|
||||||
|
if (metadata != null) rss.setMetadata(metadata);
|
||||||
|
throw rss;
|
||||||
}
|
}
|
||||||
success = true;
|
success = true;
|
||||||
return rsp;
|
return rsp;
|
||||||
|
|
|
@ -23,6 +23,7 @@ import java.util.Set;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import org.apache.solr.common.util.NamedList;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -86,6 +87,7 @@ public class SolrException extends RuntimeException {
|
||||||
}
|
}
|
||||||
|
|
||||||
int code=0;
|
int code=0;
|
||||||
|
protected NamedList<String> metadata;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The HTTP Status code associated with this Exception. For SolrExceptions
|
* The HTTP Status code associated with this Exception. For SolrExceptions
|
||||||
|
@ -98,6 +100,26 @@ public class SolrException extends RuntimeException {
|
||||||
*/
|
*/
|
||||||
public int code() { return code; }
|
public int code() { return code; }
|
||||||
|
|
||||||
|
public void setMetadata(NamedList<String> metadata) {
|
||||||
|
this.metadata = metadata;
|
||||||
|
}
|
||||||
|
|
||||||
|
public NamedList<String> getMetadata() {
|
||||||
|
return metadata;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMetadata(String key) {
|
||||||
|
return (metadata != null && key != null) ? metadata.get(key) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMetadata(String key, String value) {
|
||||||
|
if (key == null || value == null)
|
||||||
|
throw new IllegalArgumentException("Exception metadata cannot be null!");
|
||||||
|
|
||||||
|
if (metadata == null)
|
||||||
|
metadata = new NamedList<String>();
|
||||||
|
metadata.add(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
public void log(Logger log) { log(log,this); }
|
public void log(Logger log) { log(log,this); }
|
||||||
public static void log(Logger log, Throwable e) {
|
public static void log(Logger log, Throwable e) {
|
||||||
|
|
Loading…
Reference in New Issue