IMPALA-5787: Dropped status in KuduTableSink::Send() KuduTableSink drops the Status returned from WriteKuduValue(), potentially hiding failures.
There are only two possible ways WriteKuduValue() can fail: one of the KuduPartialRow::Set<Type> functions fails, which can only happen if the specified type is incorrect, which would be a bug in planning and is therefore DCHECK-able, or if TimestampValue::UtcToUnixTimeMicros() fails, which WriteKuduValue() DCHECKs against but also has a path to return the error in release builds. So similarly, this patch adds a DCHECK that the status is OK, and a path to return the error in release builds. It also adds WARN_UNUSED_RESULT to WriteKuduValue() to prevent similar bugs in the future. Testing: - Ran the Kudu tests. Change-Id: Ia228d98ca90de8638b0afcc242c788e225fb450f Reviewed-on: http://gerrit.cloudera.org:8080/7667 Reviewed-by: Tim Armstrong <[email protected]> Reviewed-by: Matthew Jacobs <[email protected]> Tested-by: Impala Public Jenkins Project: http://git-wip-us.apache.org/repos/asf/incubator-impala/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-impala/commit/8149dbfc Tree: http://git-wip-us.apache.org/repos/asf/incubator-impala/tree/8149dbfc Diff: http://git-wip-us.apache.org/repos/asf/incubator-impala/diff/8149dbfc Branch: refs/heads/master Commit: 8149dbfc9cc0898a7b376d754ac36b9c314ba71e Parents: bc93b16 Author: Thomas Tauber-Marshall <[email protected]> Authored: Fri Aug 11 10:36:45 2017 -0700 Committer: Impala Public Jenkins <[email protected]> Committed: Wed Aug 16 02:27:35 2017 +0000 ---------------------------------------------------------------------- be/src/exec/kudu-table-sink.cc | 8 +++++++- be/src/exec/kudu-util.h | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/8149dbfc/be/src/exec/kudu-table-sink.cc ---------------------------------------------------------------------- diff --git a/be/src/exec/kudu-table-sink.cc b/be/src/exec/kudu-table-sink.cc index bfc34a6..541d398 100644 --- a/be/src/exec/kudu-table-sink.cc +++ b/be/src/exec/kudu-table-sink.cc @@ -237,7 +237,13 @@ Status KuduTableSink::Send(RuntimeState* state, RowBatch* batch) { } PrimitiveType type = output_expr_evals_[j]->root().type().type; - WriteKuduValue(col, type, value, true, write->mutable_row()); + Status s = WriteKuduValue(col, type, value, true, write->mutable_row()); + // This can only fail if we set a col to an incorrect type, which would be a bug in + // planning, so we can DCHECK. + DCHECK(s.ok()) << "WriteKuduValue failed for col = " + << table_schema.Column(col).name() << " and type = " + << output_expr_evals_[j]->root().type() << ": " << s.GetDetail(); + RETURN_IF_ERROR(s); } if (add_row) write_ops.push_back(move(write)); } http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/8149dbfc/be/src/exec/kudu-util.h ---------------------------------------------------------------------- diff --git a/be/src/exec/kudu-util.h b/be/src/exec/kudu-util.h index 4503ce1..eb32bcd 100644 --- a/be/src/exec/kudu-util.h +++ b/be/src/exec/kudu-util.h @@ -76,7 +76,7 @@ void LogKuduMessage(kudu::client::KuduLogSeverity severity, const char* filename /// into memory owned by the row. If false, string data must remain valid while the row /// is being used. Status WriteKuduValue(int col, PrimitiveType type, const void* value, - bool copy_strings, kudu::KuduPartialRow* row); + bool copy_strings, kudu::KuduPartialRow* row) WARN_UNUSED_RESULT; } /// namespace impala #endif
