Improve error message when reindex-from-remote gets bad json (#22536)
Adds a message about how the remote is unlikely to be Elasticsearch. This isn't as good as including the whole message from the remote but we can't do that because we are stream parsing it and we don't want to mark the whole request. Closes #22330
This commit is contained in:
parent
97c4cd4812
commit
25a5f1869a
|
@ -36,6 +36,7 @@ import org.elasticsearch.client.RestClient;
|
|||
import org.elasticsearch.common.Nullable;
|
||||
import org.elasticsearch.common.ParseFieldMatcher;
|
||||
import org.elasticsearch.common.ParseFieldMatcherSupplier;
|
||||
import org.elasticsearch.common.ParsingException;
|
||||
import org.elasticsearch.common.Strings;
|
||||
import org.elasticsearch.common.bytes.BytesReference;
|
||||
import org.elasticsearch.common.unit.TimeValue;
|
||||
|
@ -176,9 +177,15 @@ public class RemoteScrollableHitSource extends ScrollableHitSource {
|
|||
try (XContentParser xContentParser = xContentType.xContent().createParser(NamedXContentRegistry.EMPTY,
|
||||
content)) {
|
||||
parsedResponse = parser.apply(xContentParser, () -> ParseFieldMatcher.STRICT);
|
||||
} catch (ParsingException e) {
|
||||
/* Because we're streaming the response we can't get a copy of it here. The best we can do is hint that it
|
||||
* is totally wrong and we're probably not talking to Elasticsearch. */
|
||||
throw new ElasticsearchException(
|
||||
"Error parsing the response, remote is likely not an Elasticsearch instance", e);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new ElasticsearchException("Error deserializing response", e);
|
||||
throw new ElasticsearchException("Error deserializing response, remote is likely not an Elasticsearch instance",
|
||||
e);
|
||||
}
|
||||
listener.accept(parsedResponse);
|
||||
}
|
||||
|
|
|
@ -463,6 +463,17 @@ public class RemoteScrollableHitSourceTests extends ESTestCase {
|
|||
assertThat(e.getCause().getCause().getMessage(), containsString("Response didn't include Content-Type: body={"));
|
||||
}
|
||||
|
||||
public void testInvalidJsonThinksRemoveIsNotES() throws IOException {
|
||||
Exception e = expectThrows(RuntimeException.class, () -> sourceWithMockedRemoteCall("some_text.txt").doStart(null));
|
||||
assertEquals("Error parsing the response, remote is likely not an Elasticsearch instance", e.getCause().getCause().getMessage());
|
||||
}
|
||||
|
||||
public void testUnexpectedJsonThinksRemoveIsNotES() throws IOException {
|
||||
// Use the response from a main action instead of a proper start response to generate a parse error
|
||||
Exception e = expectThrows(RuntimeException.class, () -> sourceWithMockedRemoteCall("main/2_3_3.json").doStart(null));
|
||||
assertEquals("Error parsing the response, remote is likely not an Elasticsearch instance", e.getCause().getCause().getMessage());
|
||||
}
|
||||
|
||||
private RemoteScrollableHitSource sourceWithMockedRemoteCall(String... paths) throws Exception {
|
||||
return sourceWithMockedRemoteCall(true, ContentType.APPLICATION_JSON, paths);
|
||||
}
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
I'm just text!
|
Loading…
Reference in New Issue