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:
Timothy Potter 2014-09-23 20:29:14 +00:00
parent e096d4ae93
commit 52a787e311
4 changed files with 48 additions and 3 deletions

View File

@ -40,7 +40,11 @@ public class ResponseUtils {
public static int getErrorInfo(Throwable ex, NamedList info, Logger log) {
int code = 500;
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()) {

View File

@ -237,7 +237,22 @@ public class ConcurrentUpdateSolrServer extends SolrServer {
msg.append(response.getStatusLine().getReasonPhrase());
msg.append("\n\n\n\n");
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 {
onSuccess(response);
}

View File

@ -530,6 +530,7 @@ public class HttpSolrServer extends SolrServer {
throw new RemoteSolrException(httpStatus, e.getMessage(), e);
}
if (httpStatus != HttpStatus.SC_OK) {
NamedList<String> metadata = null;
String reason = null;
try {
NamedList err = (NamedList) rsp.get("error");
@ -538,6 +539,7 @@ public class HttpSolrServer extends SolrServer {
if(reason == null) {
reason = (String) err.get("trace");
}
metadata = (NamedList<String>)err.get("metadata");
}
} catch (Exception ex) {}
if (reason == null) {
@ -547,7 +549,9 @@ public class HttpSolrServer extends SolrServer {
msg.append("request: " + method.getURI());
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;
return rsp;

View File

@ -23,6 +23,7 @@ import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.solr.common.util.NamedList;
import org.slf4j.Logger;
/**
@ -86,6 +87,7 @@ public class SolrException extends RuntimeException {
}
int code=0;
protected NamedList<String> metadata;
/**
* 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 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 static void log(Logger log, Throwable e) {