|  | @@ -43,14 +43,16 @@ public class DataFrameTransformState {
 | 
	
		
			
				|  |  |      private static final ParseField TASK_STATE = new ParseField("task_state");
 | 
	
		
			
				|  |  |      private static final ParseField CURRENT_POSITION = new ParseField("current_position");
 | 
	
		
			
				|  |  |      private static final ParseField GENERATION = new ParseField("generation");
 | 
	
		
			
				|  |  | +    private static final ParseField REASON = new ParseField("reason");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @SuppressWarnings("unchecked")
 | 
	
		
			
				|  |  |      public static final ConstructingObjectParser<DataFrameTransformState, Void> PARSER =
 | 
	
		
			
				|  |  | -            new ConstructingObjectParser<>("data_frame_transform_state",
 | 
	
		
			
				|  |  | +            new ConstructingObjectParser<>("data_frame_transform_state", true,
 | 
	
		
			
				|  |  |                      args -> new DataFrameTransformState((DataFrameTransformTaskState) args[0],
 | 
	
		
			
				|  |  |                          (IndexerState) args[1],
 | 
	
		
			
				|  |  |                          (HashMap<String, Object>) args[2],
 | 
	
		
			
				|  |  | -                        (long) args[3]));
 | 
	
		
			
				|  |  | +                        (long) args[3],
 | 
	
		
			
				|  |  | +                        (String) args[4]));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      static {
 | 
	
		
			
				|  |  |          PARSER.declareField(constructorArg(),
 | 
	
	
		
			
				|  | @@ -68,6 +70,7 @@ public class DataFrameTransformState {
 | 
	
		
			
				|  |  |              throw new IllegalArgumentException("Unsupported token [" + p.currentToken() + "]");
 | 
	
		
			
				|  |  |          }, CURRENT_POSITION, ObjectParser.ValueType.VALUE_OBJECT_ARRAY);
 | 
	
		
			
				|  |  |          PARSER.declareLong(ConstructingObjectParser.optionalConstructorArg(), GENERATION);
 | 
	
		
			
				|  |  | +        PARSER.declareString(ConstructingObjectParser.optionalConstructorArg(), REASON);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public static DataFrameTransformState fromXContent(XContentParser parser) throws IOException {
 | 
	
	
		
			
				|  | @@ -78,15 +81,18 @@ public class DataFrameTransformState {
 | 
	
		
			
				|  |  |      private final IndexerState indexerState;
 | 
	
		
			
				|  |  |      private final long generation;
 | 
	
		
			
				|  |  |      private final SortedMap<String, Object> currentPosition;
 | 
	
		
			
				|  |  | +    private final String reason;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public DataFrameTransformState(DataFrameTransformTaskState taskState,
 | 
	
		
			
				|  |  |                                     IndexerState indexerState,
 | 
	
		
			
				|  |  |                                     @Nullable Map<String, Object> position,
 | 
	
		
			
				|  |  | -                                   long generation) {
 | 
	
		
			
				|  |  | +                                   long generation,
 | 
	
		
			
				|  |  | +                                   @Nullable String reason) {
 | 
	
		
			
				|  |  |          this.taskState = taskState;
 | 
	
		
			
				|  |  |          this.indexerState = indexerState;
 | 
	
		
			
				|  |  |          this.currentPosition = position == null ? null : Collections.unmodifiableSortedMap(new TreeMap<>(position));
 | 
	
		
			
				|  |  |          this.generation = generation;
 | 
	
		
			
				|  |  | +        this.reason = reason;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public IndexerState getIndexerState() {
 | 
	
	
		
			
				|  | @@ -106,6 +112,11 @@ public class DataFrameTransformState {
 | 
	
		
			
				|  |  |          return generation;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @Nullable
 | 
	
		
			
				|  |  | +    public String getReason() {
 | 
	
		
			
				|  |  | +        return reason;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public boolean equals(Object other) {
 | 
	
		
			
				|  |  |          if (this == other) {
 | 
	
	
		
			
				|  | @@ -121,11 +132,13 @@ public class DataFrameTransformState {
 | 
	
		
			
				|  |  |          return Objects.equals(this.taskState, that.taskState) &&
 | 
	
		
			
				|  |  |              Objects.equals(this.indexerState, that.indexerState) &&
 | 
	
		
			
				|  |  |              Objects.equals(this.currentPosition, that.currentPosition) &&
 | 
	
		
			
				|  |  | -            this.generation == that.generation;
 | 
	
		
			
				|  |  | +            this.generation == that.generation &&
 | 
	
		
			
				|  |  | +            Objects.equals(this.reason, that.reason);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public int hashCode() {
 | 
	
		
			
				|  |  | -        return Objects.hash(taskState, indexerState, currentPosition, generation);
 | 
	
		
			
				|  |  | +        return Objects.hash(taskState, indexerState, currentPosition, generation, reason);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  }
 |