From 98d131b68a44c0807428c07d40dfbccbc2eff51b Mon Sep 17 00:00:00 2001 From: Surekha Saharan Date: Sat, 15 Sep 2018 14:18:04 -0700 Subject: [PATCH 01/10] Replace statusCode with status (#6333) Also changed runnerStatusCode to runnerStatus to keep things consistent --- .../java/org/apache/druid/indexer/TaskStatusPlus.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java b/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java index 82c76b6867ad..0716f0e61fd3 100644 --- a/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java +++ b/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java @@ -48,8 +48,8 @@ public TaskStatusPlus( @JsonProperty("type") @Nullable String type, // nullable for backward compatibility @JsonProperty("createdTime") DateTime createdTime, @JsonProperty("queueInsertionTime") DateTime queueInsertionTime, - @JsonProperty("statusCode") @Nullable TaskState state, - @JsonProperty("runnerStatusCode") @Nullable RunnerTaskState runnerTaskState, + @JsonProperty("status") @Nullable TaskState state, + @JsonProperty("runnerStatus") @Nullable RunnerTaskState runnerTaskState, @JsonProperty("duration") @Nullable Long duration, @JsonProperty("location") TaskLocation location, @JsonProperty("dataSource") @Nullable String dataSource, // nullable for backward compatibility @@ -97,14 +97,14 @@ public DateTime getQueueInsertionTime() } @Nullable - @JsonProperty("statusCode") + @JsonProperty("status") public TaskState getState() { return state; } @Nullable - @JsonProperty("runnerStatusCode") + @JsonProperty("runnerStatus") public RunnerTaskState getRunnerTaskState() { return runnerTaskState; From e5c99a31cdc5c888ad72dfb855c7c57e3793986a Mon Sep 17 00:00:00 2001 From: Surekha Saharan Date: Mon, 17 Sep 2018 00:02:02 -0700 Subject: [PATCH 02/10] Add unit test --- .../druid/indexer/TaskStatusPlusTest.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/api/src/test/java/org/apache/druid/indexer/TaskStatusPlusTest.java b/api/src/test/java/org/apache/druid/indexer/TaskStatusPlusTest.java index 47dce44b91fc..41125150e5e1 100644 --- a/api/src/test/java/org/apache/druid/indexer/TaskStatusPlusTest.java +++ b/api/src/test/java/org/apache/druid/indexer/TaskStatusPlusTest.java @@ -61,6 +61,43 @@ public void testSerde() throws IOException Assert.assertEquals(status, mapper.readValue(json, TaskStatusPlus.class)); } + @Test + public void testJsonAttributes() throws IOException + { + final ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule( + new SimpleModule() + .addDeserializer(DateTime.class, new DateTimeDeserializer()) + .addSerializer(DateTime.class, ToStringSerializer.instance) + ); + final String json = "{\n" + + "\"id\": \"testId\",\n" + + "\"type\": \"testType\",\n" + + "\"createdTime\": \"2018-09-17T06:35:17.392Z\",\n" + + "\"queueInsertionTime\": \"2018-09-17T06:35:17.392Z\",\n" + + "\"status\": \"RUNNING\",\n" + + "\"runnerStatus\": \"RUNNING\",\n" + + "\"duration\": 1000,\n" + + "\"location\": {\n" + + "\"host\": \"testHost\",\n" + + "\"port\": 1010,\n" + + "\"tlsPort\": -1\n" + + "},\n" + + "\"dataSource\": \"ds_test\",\n" + + "\"errorMsg\": null\n" + + "}"; + TaskStatusPlus taskStatusPlus = mapper.readValue(json, TaskStatusPlus.class); + Assert.assertNotNull(taskStatusPlus); + Assert.assertNotNull(taskStatusPlus.getState()); + Assert.assertTrue(taskStatusPlus.getState().isRunnable()); + Assert.assertNotNull(taskStatusPlus.getRunnerTaskState()); + + String serialized = mapper.writeValueAsString(taskStatusPlus); + + Assert.assertTrue(serialized.contains("\"status\":")); + Assert.assertTrue(serialized.contains("\"runnerStatus\":")); + } + // Copied from org.apache.druid.jackson.JodaStuff private static class DateTimeDeserializer extends StdDeserializer { From 5908cb3e6917bce12c03fb6ce22d086c80a2709e Mon Sep 17 00:00:00 2001 From: Surekha Saharan Date: Mon, 17 Sep 2018 15:42:59 -0700 Subject: [PATCH 03/10] Add status param to TaskStatusPlus Revert to statusCode and runnerStatusCode --- .../apache/druid/indexer/TaskStatusPlus.java | 17 +++++++++++++---- .../druid/indexer/TaskStatusPlusTest.java | 7 +++++-- .../overlord/http/OverlordResource.java | 5 +++++ ...AbstractParallelIndexSupervisorTaskTest.java | 3 +++ ...ParallelIndexSupervisorTaskResourceTest.java | 2 ++ .../task/batch/parallel/TaskMonitorTest.java | 1 + .../overlord/http/OverlordResourceTest.java | 3 +++ 7 files changed, 32 insertions(+), 6 deletions(-) diff --git a/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java b/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java index 0716f0e61fd3..b6062294f59b 100644 --- a/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java +++ b/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java @@ -48,8 +48,9 @@ public TaskStatusPlus( @JsonProperty("type") @Nullable String type, // nullable for backward compatibility @JsonProperty("createdTime") DateTime createdTime, @JsonProperty("queueInsertionTime") DateTime queueInsertionTime, - @JsonProperty("status") @Nullable TaskState state, - @JsonProperty("runnerStatus") @Nullable RunnerTaskState runnerTaskState, + @JsonProperty("statusCode") @Nullable TaskState state, + @Deprecated @JsonProperty("status") @Nullable TaskState status, + @JsonProperty("runnerStatusCode") @Nullable RunnerTaskState runnerTaskState, @JsonProperty("duration") @Nullable Long duration, @JsonProperty("location") TaskLocation location, @JsonProperty("dataSource") @Nullable String dataSource, // nullable for backward compatibility @@ -97,14 +98,22 @@ public DateTime getQueueInsertionTime() } @Nullable - @JsonProperty("status") + @JsonProperty("statusCode") public TaskState getState() { return state; } + @Deprecated + @Nullable + @JsonProperty("status") + public TaskState getStatus() + { + return state; + } + @Nullable - @JsonProperty("runnerStatus") + @JsonProperty("runnerStatusCode") public RunnerTaskState getRunnerTaskState() { return runnerTaskState; diff --git a/api/src/test/java/org/apache/druid/indexer/TaskStatusPlusTest.java b/api/src/test/java/org/apache/druid/indexer/TaskStatusPlusTest.java index 41125150e5e1..f857da9d8d9c 100644 --- a/api/src/test/java/org/apache/druid/indexer/TaskStatusPlusTest.java +++ b/api/src/test/java/org/apache/druid/indexer/TaskStatusPlusTest.java @@ -51,6 +51,7 @@ public void testSerde() throws IOException DateTimes.nowUtc(), DateTimes.nowUtc(), TaskState.RUNNING, + TaskState.RUNNING, RunnerTaskState.RUNNING, 1000L, TaskLocation.create("testHost", 1010, -1), @@ -75,8 +76,9 @@ public void testJsonAttributes() throws IOException + "\"type\": \"testType\",\n" + "\"createdTime\": \"2018-09-17T06:35:17.392Z\",\n" + "\"queueInsertionTime\": \"2018-09-17T06:35:17.392Z\",\n" + + "\"statusCode\": \"RUNNING\",\n" + "\"status\": \"RUNNING\",\n" - + "\"runnerStatus\": \"RUNNING\",\n" + + "\"runnerStatusCode\": \"RUNNING\",\n" + "\"duration\": 1000,\n" + "\"location\": {\n" + "\"host\": \"testHost\",\n" @@ -95,7 +97,8 @@ public void testJsonAttributes() throws IOException String serialized = mapper.writeValueAsString(taskStatusPlus); Assert.assertTrue(serialized.contains("\"status\":")); - Assert.assertTrue(serialized.contains("\"runnerStatus\":")); + Assert.assertTrue(serialized.contains("\"statusCode\":")); + Assert.assertTrue(serialized.contains("\"runnerStatusCode\":")); } // Copied from org.apache.druid.jackson.JodaStuff diff --git a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/http/OverlordResource.java b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/http/OverlordResource.java index 7d5b3141588d..b721e69ca1af 100644 --- a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/http/OverlordResource.java +++ b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/http/OverlordResource.java @@ -267,6 +267,7 @@ public Response getTaskStatus(@PathParam("taskid") String taskid) // TaskStorage API doesn't yet allow it. DateTimes.EPOCH, taskInfo.getStatus().getStatusCode(), + taskInfo.getStatus().getStatusCode(), taskRunner.getRunnerTaskState(workItem.getTaskId()), taskInfo.getStatus().getDuration(), workItem.getLocation(), @@ -288,6 +289,7 @@ public Response getTaskStatus(@PathParam("taskid") String taskid) // TaskStorage API doesn't yet allow it. DateTimes.EPOCH, taskInfo.getStatus().getStatusCode(), + taskInfo.getStatus().getStatusCode(), RunnerTaskState.WAITING, taskInfo.getStatus().getDuration(), TaskLocation.unknown(), @@ -668,6 +670,7 @@ public Response getTasks( workItem.getCreatedTime(), workItem.getQueueInsertionTime(), workItem.getTaskState(), + workItem.getTaskState(), workItem.getRunnerTaskState(), null, workItem.getLocation(), @@ -683,6 +686,7 @@ public Response getTasks( // TaskStorage API doesn't yet allow it. DateTimes.EPOCH, taskInfo.getStatus().getStatusCode(), + taskInfo.getStatus().getStatusCode(), RunnerTaskState.NONE, taskInfo.getStatus().getDuration(), TaskLocation.unknown(), @@ -765,6 +769,7 @@ private static BiFunction, RunnerTaskState, TaskStatu // TaskStorage API doesn't yet allow it. DateTimes.EPOCH, taskInfo.getStatus().getStatusCode(), + taskInfo.getStatus().getStatusCode(), runnerTaskState, taskInfo.getStatus().getDuration(), TaskLocation.unknown(), diff --git a/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/AbstractParallelIndexSupervisorTaskTest.java b/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/AbstractParallelIndexSupervisorTaskTest.java index 024a5b7e2221..5eb891320131 100644 --- a/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/AbstractParallelIndexSupervisorTaskTest.java +++ b/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/AbstractParallelIndexSupervisorTaskTest.java @@ -146,6 +146,7 @@ public TaskStatusResponse getTaskStatus(String taskId) DateTimes.EPOCH, DateTimes.EPOCH, taskStatus.getStatusCode(), + taskStatus.getStatusCode(), RunnerTaskState.NONE, -1L, TaskLocation.unknown(), @@ -162,6 +163,7 @@ public TaskStatusResponse getTaskStatus(String taskId) DateTimes.EPOCH, DateTimes.EPOCH, TaskState.RUNNING, + TaskState.RUNNING, RunnerTaskState.RUNNING, -1L, TaskLocation.unknown(), @@ -183,6 +185,7 @@ public TaskStatusResponse getTaskStatus(String taskId) DateTimes.EPOCH, DateTimes.EPOCH, TaskState.FAILED, + TaskState.FAILED, RunnerTaskState.NONE, -1L, TaskLocation.unknown(), diff --git a/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/ParallelIndexSupervisorTaskResourceTest.java b/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/ParallelIndexSupervisorTaskResourceTest.java index 8a7503b837b9..3cf9dc2d07b9 100644 --- a/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/ParallelIndexSupervisorTaskResourceTest.java +++ b/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/ParallelIndexSupervisorTaskResourceTest.java @@ -614,6 +614,7 @@ public ParallelIndexSubTask newSubTask(int numAttempts) DateTimes.EPOCH, DateTimes.EPOCH, TaskState.RUNNING, + TaskState.RUNNING, RunnerTaskState.RUNNING, -1L, TaskLocation.unknown(), @@ -715,6 +716,7 @@ void setState(TaskState state) DateTimes.EPOCH, DateTimes.EPOCH, state, + state, RunnerTaskState.NONE, -1L, TaskLocation.unknown(), diff --git a/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/TaskMonitorTest.java b/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/TaskMonitorTest.java index 80cbe816a639..6f6d57a155aa 100644 --- a/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/TaskMonitorTest.java +++ b/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/TaskMonitorTest.java @@ -200,6 +200,7 @@ public TaskStatusResponse getTaskStatus(String taskId) DateTimes.EPOCH, DateTimes.EPOCH, tasks.get(taskId), + tasks.get(taskId), RunnerTaskState.RUNNING, -1L, TaskLocation.unknown(), diff --git a/indexing-service/src/test/java/org/apache/druid/indexing/overlord/http/OverlordResourceTest.java b/indexing-service/src/test/java/org/apache/druid/indexing/overlord/http/OverlordResourceTest.java index 85302bda5fea..1345da3c261f 100644 --- a/indexing-service/src/test/java/org/apache/druid/indexing/overlord/http/OverlordResourceTest.java +++ b/indexing-service/src/test/java/org/apache/druid/indexing/overlord/http/OverlordResourceTest.java @@ -881,6 +881,8 @@ public void testGetTaskStatus() throws Exception TestHelper.makeJsonMapper().writeValueAsString(response1.getEntity()), TaskStatusResponse.class ); + TaskStatusPlus tsp = taskStatusResponse1.getStatus(); + Assert.assertEquals(tsp.getState(), tsp.getStatus()); Assert.assertEquals( new TaskStatusResponse( "mytask", @@ -890,6 +892,7 @@ public void testGetTaskStatus() throws Exception DateTimes.of("2018-01-01"), DateTimes.EPOCH, TaskState.RUNNING, + TaskState.RUNNING, RunnerTaskState.RUNNING, -1L, TaskLocation.unknown(), From 907837db231740fbee2324ed510660474b78e503 Mon Sep 17 00:00:00 2001 From: Surekha Saharan Date: Wed, 19 Sep 2018 11:39:30 -0700 Subject: [PATCH 04/10] Add additional status member to TaskStatusPlus --- .../main/java/org/apache/druid/indexer/TaskStatusPlus.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java b/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java index b6062294f59b..bbc34115573f 100644 --- a/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java +++ b/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java @@ -34,6 +34,8 @@ public class TaskStatusPlus private final DateTime createdTime; private final DateTime queueInsertionTime; private final TaskState state; + @Deprecated + private final TaskState status; private final RunnerTaskState runnerTaskState; private final Long duration; private final TaskLocation location; @@ -49,7 +51,7 @@ public TaskStatusPlus( @JsonProperty("createdTime") DateTime createdTime, @JsonProperty("queueInsertionTime") DateTime queueInsertionTime, @JsonProperty("statusCode") @Nullable TaskState state, - @Deprecated @JsonProperty("status") @Nullable TaskState status, + @Deprecated @JsonProperty("status") @Nullable TaskState status, // present for backwards compatibility @JsonProperty("runnerStatusCode") @Nullable RunnerTaskState runnerTaskState, @JsonProperty("duration") @Nullable Long duration, @JsonProperty("location") TaskLocation location, @@ -65,6 +67,7 @@ public TaskStatusPlus( this.createdTime = Preconditions.checkNotNull(createdTime, "createdTime"); this.queueInsertionTime = Preconditions.checkNotNull(queueInsertionTime, "queueInsertionTime"); this.state = state; + this.status = status; this.runnerTaskState = runnerTaskState; this.duration = duration; this.location = Preconditions.checkNotNull(location, "location"); @@ -109,7 +112,7 @@ public TaskState getState() @JsonProperty("status") public TaskState getStatus() { - return state; + return status; } @Nullable From 4e51de7dc43d2b3cc3a82492323f7c0548d7d663 Mon Sep 17 00:00:00 2001 From: Surekha Saharan Date: Wed, 19 Sep 2018 18:08:37 -0700 Subject: [PATCH 05/10] Change TaskResponseObject to match overlord's response object --- .../apache/druid/testing/clients/TaskResponseObject.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/integration-tests/src/main/java/org/apache/druid/testing/clients/TaskResponseObject.java b/integration-tests/src/main/java/org/apache/druid/testing/clients/TaskResponseObject.java index 1d275f7feac3..501cd5e13984 100644 --- a/integration-tests/src/main/java/org/apache/druid/testing/clients/TaskResponseObject.java +++ b/integration-tests/src/main/java/org/apache/druid/testing/clients/TaskResponseObject.java @@ -21,7 +21,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import org.apache.druid.indexer.TaskStatus; +import org.apache.druid.indexer.TaskState; import org.joda.time.DateTime; public class TaskResponseObject @@ -30,14 +30,14 @@ public class TaskResponseObject private final String id; private final DateTime createdTime; private final DateTime queueInsertionTime; - private final TaskStatus status; + private final TaskState status; @JsonCreator private TaskResponseObject( @JsonProperty("id") String id, @JsonProperty("createdTime") DateTime createdTime, @JsonProperty("queueInsertionTime") DateTime queueInsertionTime, - @JsonProperty("status") TaskStatus status + @JsonProperty("status") TaskState status ) { this.id = id; @@ -65,7 +65,7 @@ public DateTime getQueueInsertionTime() } @SuppressWarnings("unused") // Used by Jackson serialization? - public TaskStatus getStatus() + public TaskState getStatus() { return status; } From 4c700c0dc8f2ab4b27675dcea1a6dac5cd9e98bc Mon Sep 17 00:00:00 2001 From: Surekha Saharan Date: Thu, 20 Sep 2018 17:31:42 -0700 Subject: [PATCH 06/10] Address PR comments --- .../apache/druid/indexer/TaskStatusPlus.java | 62 ++++++++++++++++--- .../druid/indexer/TaskStatusPlusTest.java | 7 +-- .../task/ClientBasedTaskInfoProvider.java | 2 +- .../task/batch/parallel/TaskHistory.java | 4 +- .../task/batch/parallel/TaskMonitor.java | 6 +- .../overlord/http/OverlordResource.java | 5 -- ...stractParallelIndexSupervisorTaskTest.java | 3 - ...rallelIndexSupervisorTaskResourceTest.java | 4 +- .../task/batch/parallel/TaskMonitorTest.java | 9 ++- .../overlord/http/OverlordResourceTest.java | 3 +- .../indexing/overlord/http/OverlordTest.java | 4 +- .../clients/OverlordResourceTestClient.java | 2 +- 12 files changed, 71 insertions(+), 40 deletions(-) diff --git a/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java b/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java index bbc34115573f..e5698f78a294 100644 --- a/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java +++ b/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java @@ -22,6 +22,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Preconditions; +import org.apache.druid.java.util.common.logger.Logger; import org.joda.time.DateTime; import javax.annotation.Nullable; @@ -29,6 +30,8 @@ public class TaskStatusPlus { + private static final Logger log = new Logger(TaskStatusPlus.class); + private final String id; private final String type; private final DateTime createdTime; @@ -44,13 +47,42 @@ public class TaskStatusPlus @Nullable private final String errorMsg; - @JsonCreator public TaskStatusPlus( @JsonProperty("id") String id, @JsonProperty("type") @Nullable String type, // nullable for backward compatibility @JsonProperty("createdTime") DateTime createdTime, @JsonProperty("queueInsertionTime") DateTime queueInsertionTime, - @JsonProperty("statusCode") @Nullable TaskState state, + @JsonProperty("statusCode") @Nullable TaskState statusCode, + @JsonProperty("runnerStatusCode") @Nullable RunnerTaskState runnerStatusCode, + @JsonProperty("duration") @Nullable Long duration, + @JsonProperty("location") TaskLocation location, + @JsonProperty("dataSource") @Nullable String dataSource, // nullable for backward compatibility + @JsonProperty("errorMsg") @Nullable String errorMsg + ) + { + this( + id, + type, + createdTime, + queueInsertionTime, + statusCode, + statusCode, + runnerStatusCode, + duration, + location, + dataSource, + errorMsg + ); + } + + + @JsonCreator + private TaskStatusPlus( + @JsonProperty("id") String id, + @JsonProperty("type") @Nullable String type, // nullable for backward compatibility + @JsonProperty("createdTime") DateTime createdTime, + @JsonProperty("queueInsertionTime") DateTime queueInsertionTime, + @JsonProperty("statusCode") @Nullable TaskState statusCode, @Deprecated @JsonProperty("status") @Nullable TaskState status, // present for backwards compatibility @JsonProperty("runnerStatusCode") @Nullable RunnerTaskState runnerTaskState, @JsonProperty("duration") @Nullable Long duration, @@ -59,15 +91,27 @@ public TaskStatusPlus( @JsonProperty("errorMsg") @Nullable String errorMsg ) { - if (state != null && state.isComplete()) { + if (statusCode != null && statusCode.isComplete()) { Preconditions.checkNotNull(duration, "duration"); } this.id = Preconditions.checkNotNull(id, "id"); this.type = type; this.createdTime = Preconditions.checkNotNull(createdTime, "createdTime"); this.queueInsertionTime = Preconditions.checkNotNull(queueInsertionTime, "queueInsertionTime"); - this.state = state; - this.status = status; + //checks for deserialization safety + if (statusCode != null && status == null) { + this.state = statusCode; + this.status = statusCode; + } else if (statusCode == null && status != null) { + this.state = status; + this.status = status; + } else { + if (statusCode != null && status != null && statusCode != status) { + log.error("statusCode[%s] and status[%s] must be same", statusCode, status); + } + this.state = statusCode; + this.status = status; + } this.runnerTaskState = runnerTaskState; this.duration = duration; this.location = Preconditions.checkNotNull(location, "location"); @@ -102,7 +146,7 @@ public DateTime getQueueInsertionTime() @Nullable @JsonProperty("statusCode") - public TaskState getState() + public TaskState getStatusCode() { return state; } @@ -117,7 +161,7 @@ public TaskState getStatus() @Nullable @JsonProperty("runnerStatusCode") - public RunnerTaskState getRunnerTaskState() + public RunnerTaskState getRunnerStatusCode() { return runnerTaskState; } @@ -162,7 +206,7 @@ public boolean equals(Object o) Objects.equals(getType(), that.getType()) && Objects.equals(getCreatedTime(), that.getCreatedTime()) && Objects.equals(getQueueInsertionTime(), that.getQueueInsertionTime()) && - getState() == that.getState() && + getStatusCode() == that.getStatusCode() && Objects.equals(getDuration(), that.getDuration()) && Objects.equals(getLocation(), that.getLocation()) && Objects.equals(getDataSource(), that.getDataSource()) && @@ -177,7 +221,7 @@ public int hashCode() getType(), getCreatedTime(), getQueueInsertionTime(), - getState(), + getStatusCode(), getDuration(), getLocation(), getDataSource(), diff --git a/api/src/test/java/org/apache/druid/indexer/TaskStatusPlusTest.java b/api/src/test/java/org/apache/druid/indexer/TaskStatusPlusTest.java index f857da9d8d9c..f99ea0acbd57 100644 --- a/api/src/test/java/org/apache/druid/indexer/TaskStatusPlusTest.java +++ b/api/src/test/java/org/apache/druid/indexer/TaskStatusPlusTest.java @@ -51,7 +51,6 @@ public void testSerde() throws IOException DateTimes.nowUtc(), DateTimes.nowUtc(), TaskState.RUNNING, - TaskState.RUNNING, RunnerTaskState.RUNNING, 1000L, TaskLocation.create("testHost", 1010, -1), @@ -90,9 +89,9 @@ public void testJsonAttributes() throws IOException + "}"; TaskStatusPlus taskStatusPlus = mapper.readValue(json, TaskStatusPlus.class); Assert.assertNotNull(taskStatusPlus); - Assert.assertNotNull(taskStatusPlus.getState()); - Assert.assertTrue(taskStatusPlus.getState().isRunnable()); - Assert.assertNotNull(taskStatusPlus.getRunnerTaskState()); + Assert.assertNotNull(taskStatusPlus.getStatusCode()); + Assert.assertTrue(taskStatusPlus.getStatusCode().isRunnable()); + Assert.assertNotNull(taskStatusPlus.getRunnerStatusCode()); String serialized = mapper.writeValueAsString(taskStatusPlus); diff --git a/indexing-service/src/main/java/org/apache/druid/indexing/common/task/ClientBasedTaskInfoProvider.java b/indexing-service/src/main/java/org/apache/druid/indexing/common/task/ClientBasedTaskInfoProvider.java index f80163037fa4..cc480bcf9c07 100644 --- a/indexing-service/src/main/java/org/apache/druid/indexing/common/task/ClientBasedTaskInfoProvider.java +++ b/indexing-service/src/main/java/org/apache/druid/indexing/common/task/ClientBasedTaskInfoProvider.java @@ -50,6 +50,6 @@ public Optional getTaskStatus(String id) final TaskStatusResponse response = client.getTaskStatus(id); return response == null ? Optional.absent() : - Optional.of(TaskStatus.fromCode(id, response.getStatus().getState())); + Optional.of(TaskStatus.fromCode(id, response.getStatus().getStatusCode())); } } diff --git a/indexing-service/src/main/java/org/apache/druid/indexing/common/task/batch/parallel/TaskHistory.java b/indexing-service/src/main/java/org/apache/druid/indexing/common/task/batch/parallel/TaskHistory.java index 9bce07327594..48161e9cc5cd 100644 --- a/indexing-service/src/main/java/org/apache/druid/indexing/common/task/batch/parallel/TaskHistory.java +++ b/indexing-service/src/main/java/org/apache/druid/indexing/common/task/batch/parallel/TaskHistory.java @@ -39,10 +39,10 @@ class TaskHistory { attemptHistory.forEach(status -> { Preconditions.checkState( - status.getState() == TaskState.SUCCESS || status.getState() == TaskState.FAILED, + status.getStatusCode() == TaskState.SUCCESS || status.getStatusCode() == TaskState.FAILED, "Complete tasks should be recorded, but the state of task[%s] is [%s]", status.getId(), - status.getState() + status.getStatusCode() ); }); this.spec = spec; diff --git a/indexing-service/src/main/java/org/apache/druid/indexing/common/task/batch/parallel/TaskMonitor.java b/indexing-service/src/main/java/org/apache/druid/indexing/common/task/batch/parallel/TaskMonitor.java index 91c9957787c9..87440119ff09 100644 --- a/indexing-service/src/main/java/org/apache/druid/indexing/common/task/batch/parallel/TaskMonitor.java +++ b/indexing-service/src/main/java/org/apache/druid/indexing/common/task/batch/parallel/TaskMonitor.java @@ -115,7 +115,7 @@ public void start(long taskStatusCheckingPeriod) final TaskStatusResponse taskStatusResponse = indexingServiceClient.getTaskStatus(taskId); final TaskStatusPlus taskStatus = taskStatusResponse.getStatus(); if (taskStatus != null) { - switch (Preconditions.checkNotNull(taskStatus.getState(), "taskState")) { + switch (Preconditions.checkNotNull(taskStatus.getStatusCode(), "taskState")) { case SUCCESS: incrementNumSucceededTasks(); @@ -152,7 +152,7 @@ public void start(long taskStatusCheckingPeriod) monitorEntry.updateStatus(taskStatus); break; default: - throw new ISE("Unknown taskStatus[%s] for task[%s[", taskStatus.getState(), taskId); + throw new ISE("Unknown taskStatus[%s] for task[%s[", taskStatus.getStatusCode(), taskId); } } } @@ -459,7 +459,7 @@ SubTaskSpec getSpec() TaskState getLastState() { - return lastStatus == null ? TaskState.FAILED : lastStatus.getState(); + return lastStatus == null ? TaskState.FAILED : lastStatus.getStatusCode(); } @Nullable diff --git a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/http/OverlordResource.java b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/http/OverlordResource.java index b721e69ca1af..7d5b3141588d 100644 --- a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/http/OverlordResource.java +++ b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/http/OverlordResource.java @@ -267,7 +267,6 @@ public Response getTaskStatus(@PathParam("taskid") String taskid) // TaskStorage API doesn't yet allow it. DateTimes.EPOCH, taskInfo.getStatus().getStatusCode(), - taskInfo.getStatus().getStatusCode(), taskRunner.getRunnerTaskState(workItem.getTaskId()), taskInfo.getStatus().getDuration(), workItem.getLocation(), @@ -289,7 +288,6 @@ public Response getTaskStatus(@PathParam("taskid") String taskid) // TaskStorage API doesn't yet allow it. DateTimes.EPOCH, taskInfo.getStatus().getStatusCode(), - taskInfo.getStatus().getStatusCode(), RunnerTaskState.WAITING, taskInfo.getStatus().getDuration(), TaskLocation.unknown(), @@ -670,7 +668,6 @@ public Response getTasks( workItem.getCreatedTime(), workItem.getQueueInsertionTime(), workItem.getTaskState(), - workItem.getTaskState(), workItem.getRunnerTaskState(), null, workItem.getLocation(), @@ -686,7 +683,6 @@ public Response getTasks( // TaskStorage API doesn't yet allow it. DateTimes.EPOCH, taskInfo.getStatus().getStatusCode(), - taskInfo.getStatus().getStatusCode(), RunnerTaskState.NONE, taskInfo.getStatus().getDuration(), TaskLocation.unknown(), @@ -769,7 +765,6 @@ private static BiFunction, RunnerTaskState, TaskStatu // TaskStorage API doesn't yet allow it. DateTimes.EPOCH, taskInfo.getStatus().getStatusCode(), - taskInfo.getStatus().getStatusCode(), runnerTaskState, taskInfo.getStatus().getDuration(), TaskLocation.unknown(), diff --git a/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/AbstractParallelIndexSupervisorTaskTest.java b/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/AbstractParallelIndexSupervisorTaskTest.java index 5eb891320131..024a5b7e2221 100644 --- a/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/AbstractParallelIndexSupervisorTaskTest.java +++ b/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/AbstractParallelIndexSupervisorTaskTest.java @@ -146,7 +146,6 @@ public TaskStatusResponse getTaskStatus(String taskId) DateTimes.EPOCH, DateTimes.EPOCH, taskStatus.getStatusCode(), - taskStatus.getStatusCode(), RunnerTaskState.NONE, -1L, TaskLocation.unknown(), @@ -163,7 +162,6 @@ public TaskStatusResponse getTaskStatus(String taskId) DateTimes.EPOCH, DateTimes.EPOCH, TaskState.RUNNING, - TaskState.RUNNING, RunnerTaskState.RUNNING, -1L, TaskLocation.unknown(), @@ -185,7 +183,6 @@ public TaskStatusResponse getTaskStatus(String taskId) DateTimes.EPOCH, DateTimes.EPOCH, TaskState.FAILED, - TaskState.FAILED, RunnerTaskState.NONE, -1L, TaskLocation.unknown(), diff --git a/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/ParallelIndexSupervisorTaskResourceTest.java b/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/ParallelIndexSupervisorTaskResourceTest.java index 3cf9dc2d07b9..ff3caedfab55 100644 --- a/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/ParallelIndexSupervisorTaskResourceTest.java +++ b/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/ParallelIndexSupervisorTaskResourceTest.java @@ -364,7 +364,7 @@ private void checkState( .filter(entry -> { final TaskStatusPlus currentStatus = entry.getValue().getCurrentStatus(); return currentStatus != null && - (currentStatus.getState() == TaskState.SUCCESS || currentStatus.getState() == TaskState.FAILED); + (currentStatus.getStatusCode() == TaskState.SUCCESS || currentStatus.getStatusCode() == TaskState.FAILED); }) .map(Entry::getKey) .findFirst() @@ -614,7 +614,6 @@ public ParallelIndexSubTask newSubTask(int numAttempts) DateTimes.EPOCH, DateTimes.EPOCH, TaskState.RUNNING, - TaskState.RUNNING, RunnerTaskState.RUNNING, -1L, TaskLocation.unknown(), @@ -716,7 +715,6 @@ void setState(TaskState state) DateTimes.EPOCH, DateTimes.EPOCH, state, - state, RunnerTaskState.NONE, -1L, TaskLocation.unknown(), diff --git a/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/TaskMonitorTest.java b/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/TaskMonitorTest.java index 6f6d57a155aa..7e86e4072fc9 100644 --- a/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/TaskMonitorTest.java +++ b/indexing-service/src/test/java/org/apache/druid/indexing/common/task/batch/parallel/TaskMonitorTest.java @@ -87,7 +87,7 @@ public void testBasic() throws InterruptedException, ExecutionException, Timeout Assert.assertEquals("supervisorId", result.getSpec().getSupervisorTaskId()); Assert.assertEquals("specId" + i, result.getSpec().getId()); Assert.assertNotNull(result.getLastStatus()); - Assert.assertEquals(TaskState.SUCCESS, result.getLastStatus().getState()); + Assert.assertEquals(TaskState.SUCCESS, result.getLastStatus().getStatusCode()); Assert.assertEquals(TaskState.SUCCESS, result.getLastState()); } } @@ -113,7 +113,7 @@ public void testRetry() throws InterruptedException, ExecutionException, Timeout Assert.assertEquals("specId" + i, result.getSpec().getId()); Assert.assertNotNull(result.getLastStatus()); - Assert.assertEquals(TaskState.SUCCESS, result.getLastStatus().getState()); + Assert.assertEquals(TaskState.SUCCESS, result.getLastStatus().getStatusCode()); Assert.assertEquals(TaskState.SUCCESS, result.getLastState()); final TaskHistory taskHistory = monitor.getCompleteSubTaskSpecHistory(specs.get(i).getId()); @@ -122,8 +122,8 @@ public void testRetry() throws InterruptedException, ExecutionException, Timeout final List attemptHistory = taskHistory.getAttemptHistory(); Assert.assertNotNull(attemptHistory); Assert.assertEquals(3, attemptHistory.size()); - Assert.assertEquals(TaskState.FAILED, attemptHistory.get(0).getState()); - Assert.assertEquals(TaskState.FAILED, attemptHistory.get(1).getState()); + Assert.assertEquals(TaskState.FAILED, attemptHistory.get(0).getStatusCode()); + Assert.assertEquals(TaskState.FAILED, attemptHistory.get(1).getStatusCode()); } } @@ -200,7 +200,6 @@ public TaskStatusResponse getTaskStatus(String taskId) DateTimes.EPOCH, DateTimes.EPOCH, tasks.get(taskId), - tasks.get(taskId), RunnerTaskState.RUNNING, -1L, TaskLocation.unknown(), diff --git a/indexing-service/src/test/java/org/apache/druid/indexing/overlord/http/OverlordResourceTest.java b/indexing-service/src/test/java/org/apache/druid/indexing/overlord/http/OverlordResourceTest.java index 1345da3c261f..7964c764069c 100644 --- a/indexing-service/src/test/java/org/apache/druid/indexing/overlord/http/OverlordResourceTest.java +++ b/indexing-service/src/test/java/org/apache/druid/indexing/overlord/http/OverlordResourceTest.java @@ -882,7 +882,7 @@ public void testGetTaskStatus() throws Exception TaskStatusResponse.class ); TaskStatusPlus tsp = taskStatusResponse1.getStatus(); - Assert.assertEquals(tsp.getState(), tsp.getStatus()); + Assert.assertEquals(tsp.getStatusCode(), tsp.getStatus()); Assert.assertEquals( new TaskStatusResponse( "mytask", @@ -892,7 +892,6 @@ public void testGetTaskStatus() throws Exception DateTimes.of("2018-01-01"), DateTimes.EPOCH, TaskState.RUNNING, - TaskState.RUNNING, RunnerTaskState.RUNNING, -1L, TaskLocation.unknown(), diff --git a/indexing-service/src/test/java/org/apache/druid/indexing/overlord/http/OverlordTest.java b/indexing-service/src/test/java/org/apache/druid/indexing/overlord/http/OverlordTest.java index 1ff113c04bfc..8c1f33a1fe7e 100644 --- a/indexing-service/src/test/java/org/apache/druid/indexing/overlord/http/OverlordTest.java +++ b/indexing-service/src/test/java/org/apache/druid/indexing/overlord/http/OverlordTest.java @@ -248,7 +248,7 @@ public void testOverlordRun() throws Exception Assert.assertEquals(taskId_0, ((TaskStatusResponse) response.getEntity()).getTask()); Assert.assertEquals( TaskStatus.running(taskId_0).getStatusCode(), - ((TaskStatusResponse) response.getEntity()).getStatus().getState() + ((TaskStatusResponse) response.getEntity()).getStatus().getStatusCode() ); // Simulate completion of task_0 @@ -296,7 +296,7 @@ private void waitForTaskStatus(String taskId, TaskState status) throws Interrupt { while (true) { Response response = overlordResource.getTaskStatus(taskId); - if (status.equals(((TaskStatusResponse) response.getEntity()).getStatus().getState())) { + if (status.equals(((TaskStatusResponse) response.getEntity()).getStatus().getStatusCode())) { break; } Thread.sleep(10); diff --git a/integration-tests/src/main/java/org/apache/druid/testing/clients/OverlordResourceTestClient.java b/integration-tests/src/main/java/org/apache/druid/testing/clients/OverlordResourceTestClient.java index eee9eaa75d96..a1d7e51b6f3e 100644 --- a/integration-tests/src/main/java/org/apache/druid/testing/clients/OverlordResourceTestClient.java +++ b/integration-tests/src/main/java/org/apache/druid/testing/clients/OverlordResourceTestClient.java @@ -132,7 +132,7 @@ public TaskState getTaskStatus(String taskID) { } ); - return taskStatusResponse.getStatus().getState(); + return taskStatusResponse.getStatus().getStatusCode(); } catch (Exception e) { throw Throwables.propagate(e); From 8e0114ab43a51862199801361c1cd19cfd81e33e Mon Sep 17 00:00:00 2001 From: Surekha Saharan Date: Fri, 21 Sep 2018 18:55:58 -0700 Subject: [PATCH 07/10] address comments --- .../apache/druid/indexer/TaskStatusPlus.java | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java b/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java index e5698f78a294..c031aba38267 100644 --- a/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java +++ b/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java @@ -36,7 +36,7 @@ public class TaskStatusPlus private final String type; private final DateTime createdTime; private final DateTime queueInsertionTime; - private final TaskState state; + private final TaskState statusCode; @Deprecated private final TaskState status; private final RunnerTaskState runnerTaskState; @@ -48,16 +48,16 @@ public class TaskStatusPlus private final String errorMsg; public TaskStatusPlus( - @JsonProperty("id") String id, - @JsonProperty("type") @Nullable String type, // nullable for backward compatibility - @JsonProperty("createdTime") DateTime createdTime, - @JsonProperty("queueInsertionTime") DateTime queueInsertionTime, - @JsonProperty("statusCode") @Nullable TaskState statusCode, - @JsonProperty("runnerStatusCode") @Nullable RunnerTaskState runnerStatusCode, - @JsonProperty("duration") @Nullable Long duration, - @JsonProperty("location") TaskLocation location, - @JsonProperty("dataSource") @Nullable String dataSource, // nullable for backward compatibility - @JsonProperty("errorMsg") @Nullable String errorMsg + String id, + String type, // nullable for backward compatibility + DateTime createdTime, + DateTime queueInsertionTime, + @Nullable TaskState statusCode, + @Nullable RunnerTaskState runnerStatusCode, + @Nullable Long duration, + TaskLocation location, + @Nullable String dataSource, // nullable for backward compatibility + @Nullable String errorMsg ) { this( @@ -77,7 +77,7 @@ public TaskStatusPlus( @JsonCreator - private TaskStatusPlus( + public TaskStatusPlus( @JsonProperty("id") String id, @JsonProperty("type") @Nullable String type, // nullable for backward compatibility @JsonProperty("createdTime") DateTime createdTime, @@ -100,16 +100,16 @@ private TaskStatusPlus( this.queueInsertionTime = Preconditions.checkNotNull(queueInsertionTime, "queueInsertionTime"); //checks for deserialization safety if (statusCode != null && status == null) { - this.state = statusCode; + this.statusCode = statusCode; this.status = statusCode; } else if (statusCode == null && status != null) { - this.state = status; + this.statusCode = status; this.status = status; } else { if (statusCode != null && status != null && statusCode != status) { log.error("statusCode[%s] and status[%s] must be same", statusCode, status); } - this.state = statusCode; + this.statusCode = statusCode; this.status = status; } this.runnerTaskState = runnerTaskState; @@ -148,7 +148,7 @@ public DateTime getQueueInsertionTime() @JsonProperty("statusCode") public TaskState getStatusCode() { - return state; + return statusCode; } @Deprecated @@ -237,7 +237,7 @@ public String toString() ", type='" + type + '\'' + ", createdTime=" + createdTime + ", queueInsertionTime=" + queueInsertionTime + - ", state=" + state + + ", statusCode=" + statusCode + ", duration=" + duration + ", location=" + location + ", dataSource='" + dataSource + '\'' + From d4dbbad5fbbc4c4240112ff727d43c18851b2e6c Mon Sep 17 00:00:00 2001 From: Surekha Saharan Date: Fri, 28 Sep 2018 18:26:56 -0700 Subject: [PATCH 08/10] Add runtime exception after logging error --- api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java | 1 + 1 file changed, 1 insertion(+) diff --git a/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java b/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java index c031aba38267..1f1e7064a5e5 100644 --- a/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java +++ b/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java @@ -108,6 +108,7 @@ public TaskStatusPlus( } else { if (statusCode != null && status != null && statusCode != status) { log.error("statusCode[%s] and status[%s] must be same", statusCode, status); + throw new RuntimeException("statusCode and status must match"); } this.statusCode = statusCode; this.status = status; From a9bb366aa2e758edf594c47bb45f2ad4f1f24440 Mon Sep 17 00:00:00 2001 From: Surekha Saharan Date: Sat, 29 Sep 2018 12:48:33 -0700 Subject: [PATCH 09/10] Remove (deprecated)status member variable from TaskStatusPlus --- .../main/java/org/apache/druid/indexer/TaskStatusPlus.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java b/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java index 1f1e7064a5e5..2a240a77ba9e 100644 --- a/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java +++ b/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java @@ -37,8 +37,6 @@ public class TaskStatusPlus private final DateTime createdTime; private final DateTime queueInsertionTime; private final TaskState statusCode; - @Deprecated - private final TaskState status; private final RunnerTaskState runnerTaskState; private final Long duration; private final TaskLocation location; @@ -101,17 +99,14 @@ public TaskStatusPlus( //checks for deserialization safety if (statusCode != null && status == null) { this.statusCode = statusCode; - this.status = statusCode; } else if (statusCode == null && status != null) { this.statusCode = status; - this.status = status; } else { if (statusCode != null && status != null && statusCode != status) { log.error("statusCode[%s] and status[%s] must be same", statusCode, status); throw new RuntimeException("statusCode and status must match"); } this.statusCode = statusCode; - this.status = status; } this.runnerTaskState = runnerTaskState; this.duration = duration; @@ -157,7 +152,7 @@ public TaskState getStatusCode() @JsonProperty("status") public TaskState getStatus() { - return status; + return statusCode; } @Nullable From 08285d46912073891cb779dd23cb4785d4dbf532 Mon Sep 17 00:00:00 2001 From: Surekha Saharan Date: Sun, 30 Sep 2018 22:20:23 -0700 Subject: [PATCH 10/10] Minor change --- .../main/java/org/apache/druid/indexer/TaskStatusPlus.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java b/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java index 2a240a77ba9e..e58d83111f18 100644 --- a/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java +++ b/api/src/main/java/org/apache/druid/indexer/TaskStatusPlus.java @@ -22,6 +22,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Preconditions; +import org.apache.druid.java.util.common.StringUtils; import org.apache.druid.java.util.common.logger.Logger; import org.joda.time.DateTime; @@ -103,8 +104,7 @@ public TaskStatusPlus( this.statusCode = status; } else { if (statusCode != null && status != null && statusCode != status) { - log.error("statusCode[%s] and status[%s] must be same", statusCode, status); - throw new RuntimeException("statusCode and status must match"); + throw new RuntimeException(StringUtils.format("statusCode[%s] and status[%s] must match", statusCode, status)); } this.statusCode = statusCode; }