25
25
import org .elasticsearch .common .util .concurrent .EsRejectedExecutionException ;
26
26
import org .elasticsearch .core .CheckedFunction ;
27
27
import org .elasticsearch .core .Nullable ;
28
+ import org .elasticsearch .core .RestApiVersion ;
28
29
import org .elasticsearch .core .Tuple ;
30
+ import org .elasticsearch .core .UpdateForV10 ;
29
31
import org .elasticsearch .health .node .action .HealthNodeNotDiscoveredException ;
30
32
import org .elasticsearch .index .Index ;
31
33
import org .elasticsearch .index .mapper .DocumentParsingException ;
@@ -611,23 +613,31 @@ protected static void generateThrowableXContent(XContentBuilder builder, Params
611
613
*/
612
614
public static XContentBuilder generateFailureXContent (XContentBuilder builder , Params params , @ Nullable Exception e , boolean detailed )
613
615
throws IOException {
614
- // No exception to render as an error
616
+ if (builder .getRestApiVersion () == RestApiVersion .V_8 ) {
617
+ if (e == null ) {
618
+ return builder .field (ERROR , "unknown" );
619
+ }
620
+ if (detailed == false ) {
621
+ return generateNonDetailedFailureXContentV8 (builder , e );
622
+ }
623
+ // else fallthrough
624
+ }
625
+
615
626
if (e == null ) {
616
- return builder .field (ERROR , "unknown" );
627
+ // No exception to render as an error
628
+ builder .startObject (ERROR );
629
+ builder .field (TYPE , "unknown" );
630
+ builder .field (REASON , "unknown" );
631
+ return builder .endObject ();
617
632
}
618
633
619
- // Render the exception with a simple message
620
634
if (detailed == false ) {
621
- String message = "No ElasticsearchException found" ;
622
- Throwable t = e ;
623
- for (int counter = 0 ; counter < 10 && t != null ; counter ++) {
624
- if (t instanceof ElasticsearchException ) {
625
- message = t .getClass ().getSimpleName () + "[" + t .getMessage () + "]" ;
626
- break ;
627
- }
628
- t = t .getCause ();
629
- }
630
- return builder .field (ERROR , message );
635
+ // just render the type & message
636
+ Throwable t = ExceptionsHelper .unwrapCause (e );
637
+ builder .startObject (ERROR );
638
+ builder .field (TYPE , getExceptionName (t ));
639
+ builder .field (REASON , t .getMessage ());
640
+ return builder .endObject ();
631
641
}
632
642
633
643
// Render the exception with all details
@@ -646,6 +656,20 @@ public static XContentBuilder generateFailureXContent(XContentBuilder builder, P
646
656
return builder .endObject ();
647
657
}
648
658
659
+ @ UpdateForV10 (owner = UpdateForV10 .Owner .CORE_INFRA ) // remove V8 API
660
+ private static XContentBuilder generateNonDetailedFailureXContentV8 (XContentBuilder builder , @ Nullable Exception e ) throws IOException {
661
+ String message = "No ElasticsearchException found" ;
662
+ Throwable t = e ;
663
+ for (int counter = 0 ; counter < 10 && t != null ; counter ++) {
664
+ if (t instanceof ElasticsearchException ) {
665
+ message = t .getClass ().getSimpleName () + "[" + t .getMessage () + "]" ;
666
+ break ;
667
+ }
668
+ t = t .getCause ();
669
+ }
670
+ return builder .field (ERROR , message );
671
+ }
672
+
649
673
/**
650
674
* Parses the output of {@link #generateFailureXContent(XContentBuilder, Params, Exception, boolean)}
651
675
*/
@@ -729,8 +753,8 @@ public static String getExceptionName(Throwable ex) {
729
753
730
754
static String buildMessage (String type , String reason , String stack ) {
731
755
StringBuilder message = new StringBuilder ("Elasticsearch exception [" );
732
- message .append (TYPE ).append ('=' ).append (type ). append ( ", " ) ;
733
- message .append (REASON ).append ('=' ).append (reason );
756
+ message .append (TYPE ).append ('=' ).append (type );
757
+ message .append (", " ). append ( REASON ).append ('=' ).append (reason );
734
758
if (stack != null ) {
735
759
message .append (", " ).append (STACK_TRACE ).append ('=' ).append (stack );
736
760
}
0 commit comments